@buenojs/bueno 0.8.3 → 0.8.5

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 (218) hide show
  1. package/README.md +136 -16
  2. package/dist/cli/{index.js → bin.js} +3036 -1421
  3. package/dist/container/index.js +250 -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/health/index.js +364 -0
  8. package/dist/i18n/index.js +345 -0
  9. package/dist/index.js +11043 -6482
  10. package/dist/jobs/index.js +819 -0
  11. package/dist/lock/index.js +367 -0
  12. package/dist/logger/index.js +281 -0
  13. package/dist/metrics/index.js +289 -0
  14. package/dist/middleware/index.js +77 -0
  15. package/dist/migrations/index.js +571 -0
  16. package/dist/modules/index.js +3346 -0
  17. package/dist/notification/index.js +484 -0
  18. package/dist/observability/index.js +331 -0
  19. package/dist/openapi/index.js +776 -0
  20. package/dist/orm/index.js +1356 -0
  21. package/dist/router/index.js +886 -0
  22. package/dist/rpc/index.js +691 -0
  23. package/dist/schema/index.js +400 -0
  24. package/dist/telemetry/index.js +595 -0
  25. package/dist/template/index.js +640 -0
  26. package/dist/templates/index.js +640 -0
  27. package/dist/testing/index.js +1111 -0
  28. package/dist/types/index.js +60 -0
  29. package/package.json +121 -27
  30. package/src/cache/index.ts +2 -1
  31. package/src/cli/bin.ts +2 -2
  32. package/src/cli/commands/build.ts +183 -165
  33. package/src/cli/commands/dev.ts +96 -89
  34. package/src/cli/commands/generate.ts +142 -111
  35. package/src/cli/commands/help.ts +20 -16
  36. package/src/cli/commands/index.ts +3 -6
  37. package/src/cli/commands/migration.ts +124 -105
  38. package/src/cli/commands/new.ts +392 -438
  39. package/src/cli/commands/start.ts +81 -79
  40. package/src/cli/core/args.ts +68 -50
  41. package/src/cli/core/console.ts +89 -95
  42. package/src/cli/core/index.ts +4 -4
  43. package/src/cli/core/prompt.ts +65 -62
  44. package/src/cli/core/spinner.ts +23 -20
  45. package/src/cli/index.ts +46 -38
  46. package/src/cli/templates/database/index.ts +61 -0
  47. package/src/cli/templates/database/mysql.ts +14 -0
  48. package/src/cli/templates/database/none.ts +16 -0
  49. package/src/cli/templates/database/postgresql.ts +14 -0
  50. package/src/cli/templates/database/sqlite.ts +14 -0
  51. package/src/cli/templates/deploy.ts +29 -26
  52. package/src/cli/templates/docker.ts +41 -30
  53. package/src/cli/templates/frontend/index.ts +63 -0
  54. package/src/cli/templates/frontend/none.ts +17 -0
  55. package/src/cli/templates/frontend/react.ts +140 -0
  56. package/src/cli/templates/frontend/solid.ts +134 -0
  57. package/src/cli/templates/frontend/svelte.ts +131 -0
  58. package/src/cli/templates/frontend/vue.ts +130 -0
  59. package/src/cli/templates/generators/index.ts +339 -0
  60. package/src/cli/templates/generators/types.ts +56 -0
  61. package/src/cli/templates/index.ts +35 -2
  62. package/src/cli/templates/project/api.ts +81 -0
  63. package/src/cli/templates/project/default.ts +140 -0
  64. package/src/cli/templates/project/fullstack.ts +111 -0
  65. package/src/cli/templates/project/index.ts +95 -0
  66. package/src/cli/templates/project/minimal.ts +45 -0
  67. package/src/cli/templates/project/types.ts +94 -0
  68. package/src/cli/templates/project/website.ts +263 -0
  69. package/src/cli/utils/fs.ts +55 -41
  70. package/src/cli/utils/index.ts +3 -2
  71. package/src/cli/utils/strings.ts +47 -33
  72. package/src/cli/utils/version.ts +47 -0
  73. package/src/config/env-validation.ts +100 -0
  74. package/src/config/env.ts +169 -41
  75. package/src/config/index.ts +28 -20
  76. package/src/config/loader.ts +25 -16
  77. package/src/config/merge.ts +21 -10
  78. package/src/config/types.ts +545 -25
  79. package/src/config/validation.ts +215 -7
  80. package/src/container/forward-ref.ts +22 -22
  81. package/src/container/index.ts +34 -12
  82. package/src/context/index.ts +11 -1
  83. package/src/database/index.ts +7 -190
  84. package/src/database/orm/builder.ts +457 -0
  85. package/src/database/orm/casts/index.ts +130 -0
  86. package/src/database/orm/casts/types.ts +25 -0
  87. package/src/database/orm/compiler.ts +304 -0
  88. package/src/database/orm/hooks/index.ts +114 -0
  89. package/src/database/orm/index.ts +61 -0
  90. package/src/database/orm/model-registry.ts +59 -0
  91. package/src/database/orm/model.ts +821 -0
  92. package/src/database/orm/relationships/base.ts +146 -0
  93. package/src/database/orm/relationships/belongs-to-many.ts +179 -0
  94. package/src/database/orm/relationships/belongs-to.ts +56 -0
  95. package/src/database/orm/relationships/has-many.ts +45 -0
  96. package/src/database/orm/relationships/has-one.ts +41 -0
  97. package/src/database/orm/relationships/index.ts +11 -0
  98. package/src/database/orm/scopes/index.ts +55 -0
  99. package/src/events/__tests__/event-system.test.ts +235 -0
  100. package/src/events/config.ts +238 -0
  101. package/src/events/example-usage.ts +185 -0
  102. package/src/events/index.ts +278 -0
  103. package/src/events/manager.ts +385 -0
  104. package/src/events/registry.ts +182 -0
  105. package/src/events/types.ts +124 -0
  106. package/src/frontend/api-routes.ts +65 -23
  107. package/src/frontend/bundler.ts +76 -34
  108. package/src/frontend/console-client.ts +2 -2
  109. package/src/frontend/console-stream.ts +94 -38
  110. package/src/frontend/dev-server.ts +94 -46
  111. package/src/frontend/file-router.ts +61 -19
  112. package/src/frontend/frameworks/index.ts +37 -10
  113. package/src/frontend/frameworks/react.ts +10 -8
  114. package/src/frontend/frameworks/solid.ts +11 -9
  115. package/src/frontend/frameworks/svelte.ts +15 -9
  116. package/src/frontend/frameworks/vue.ts +13 -11
  117. package/src/frontend/hmr-client.ts +12 -10
  118. package/src/frontend/hmr.ts +146 -103
  119. package/src/frontend/index.ts +14 -5
  120. package/src/frontend/islands.ts +41 -22
  121. package/src/frontend/isr.ts +59 -37
  122. package/src/frontend/layout.ts +36 -21
  123. package/src/frontend/ssr/react.ts +74 -27
  124. package/src/frontend/ssr/solid.ts +54 -20
  125. package/src/frontend/ssr/svelte.ts +48 -14
  126. package/src/frontend/ssr/vue.ts +50 -18
  127. package/src/frontend/ssr.ts +83 -39
  128. package/src/frontend/types.ts +91 -56
  129. package/src/health/index.ts +21 -9
  130. package/src/i18n/engine.ts +305 -0
  131. package/src/i18n/index.ts +38 -0
  132. package/src/i18n/loader.ts +218 -0
  133. package/src/i18n/middleware.ts +164 -0
  134. package/src/i18n/negotiator.ts +162 -0
  135. package/src/i18n/types.ts +158 -0
  136. package/src/index.ts +179 -27
  137. package/src/jobs/drivers/memory.ts +315 -0
  138. package/src/jobs/drivers/redis.ts +459 -0
  139. package/src/jobs/index.ts +30 -0
  140. package/src/jobs/queue.ts +281 -0
  141. package/src/jobs/types.ts +295 -0
  142. package/src/jobs/worker.ts +380 -0
  143. package/src/logger/index.ts +1 -3
  144. package/src/logger/transports/index.ts +62 -22
  145. package/src/metrics/index.ts +25 -16
  146. package/src/migrations/index.ts +9 -0
  147. package/src/modules/filters.ts +13 -17
  148. package/src/modules/guards.ts +49 -26
  149. package/src/modules/index.ts +409 -298
  150. package/src/modules/interceptors.ts +58 -20
  151. package/src/modules/lazy.ts +11 -19
  152. package/src/modules/lifecycle.ts +15 -7
  153. package/src/modules/metadata.ts +15 -5
  154. package/src/modules/pipes.ts +94 -72
  155. package/src/notification/channels/base.ts +68 -0
  156. package/src/notification/channels/email.ts +105 -0
  157. package/src/notification/channels/push.ts +104 -0
  158. package/src/notification/channels/sms.ts +105 -0
  159. package/src/notification/channels/whatsapp.ts +104 -0
  160. package/src/notification/index.ts +48 -0
  161. package/src/notification/service.ts +354 -0
  162. package/src/notification/types.ts +344 -0
  163. package/src/observability/__tests__/observability.test.ts +483 -0
  164. package/src/observability/breadcrumbs.ts +114 -0
  165. package/src/observability/index.ts +136 -0
  166. package/src/observability/interceptor.ts +85 -0
  167. package/src/observability/service.ts +303 -0
  168. package/src/observability/trace.ts +37 -0
  169. package/src/observability/types.ts +196 -0
  170. package/src/openapi/__tests__/decorators.test.ts +335 -0
  171. package/src/openapi/__tests__/document-builder.test.ts +285 -0
  172. package/src/openapi/__tests__/route-scanner.test.ts +334 -0
  173. package/src/openapi/__tests__/schema-generator.test.ts +275 -0
  174. package/src/openapi/decorators.ts +328 -0
  175. package/src/openapi/document-builder.ts +274 -0
  176. package/src/openapi/index.ts +112 -0
  177. package/src/openapi/metadata.ts +112 -0
  178. package/src/openapi/route-scanner.ts +289 -0
  179. package/src/openapi/schema-generator.ts +256 -0
  180. package/src/openapi/swagger-module.ts +166 -0
  181. package/src/openapi/types.ts +398 -0
  182. package/src/orm/index.ts +10 -0
  183. package/src/rpc/index.ts +3 -1
  184. package/src/schema/index.ts +9 -0
  185. package/src/security/index.ts +15 -6
  186. package/src/ssg/index.ts +9 -8
  187. package/src/telemetry/index.ts +76 -22
  188. package/src/template/index.ts +7 -0
  189. package/src/templates/engine.ts +224 -0
  190. package/src/templates/index.ts +9 -0
  191. package/src/templates/loader.ts +331 -0
  192. package/src/templates/renderers/markdown.ts +212 -0
  193. package/src/templates/renderers/simple.ts +269 -0
  194. package/src/templates/types.ts +154 -0
  195. package/src/testing/index.ts +100 -27
  196. package/src/types/optional-deps.d.ts +347 -187
  197. package/src/validation/index.ts +92 -2
  198. package/src/validation/schemas.ts +536 -0
  199. package/tests/integration/fullstack.test.ts +4 -4
  200. package/tests/unit/database.test.ts +2 -72
  201. package/tests/unit/env-validation.test.ts +166 -0
  202. package/tests/unit/events.test.ts +910 -0
  203. package/tests/unit/i18n.test.ts +455 -0
  204. package/tests/unit/jobs.test.ts +493 -0
  205. package/tests/unit/notification.test.ts +988 -0
  206. package/tests/unit/observability.test.ts +453 -0
  207. package/tests/unit/orm/builder.test.ts +323 -0
  208. package/tests/unit/orm/casts.test.ts +179 -0
  209. package/tests/unit/orm/compiler.test.ts +220 -0
  210. package/tests/unit/orm/eager-loading.test.ts +285 -0
  211. package/tests/unit/orm/hooks.test.ts +191 -0
  212. package/tests/unit/orm/model.test.ts +373 -0
  213. package/tests/unit/orm/relationships.test.ts +303 -0
  214. package/tests/unit/orm/scopes.test.ts +74 -0
  215. package/tests/unit/templates-simple.test.ts +53 -0
  216. package/tests/unit/templates.test.ts +454 -0
  217. package/tests/unit/validation.test.ts +18 -24
  218. package/tsconfig.json +11 -3
@@ -4,32 +4,32 @@
4
4
  * Start the development server with hot reload
5
5
  */
6
6
 
7
- import { defineCommand } from './index';
8
- import { getOption, hasFlag, type ParsedArgs } from '../core/args';
9
- import { cliConsole, colors } from '../core/console';
10
- import { spinner } from '../core/spinner';
7
+ import { type ParsedArgs, getOption, hasFlag } from "../core/args";
8
+ import { cliConsole, colors } from "../core/console";
9
+ import { spinner } from "../core/spinner";
10
+ import { CLIError, CLIErrorType } from "../index";
11
11
  import {
12
12
  fileExists,
13
+ findFileUp,
13
14
  getProjectRoot,
14
15
  isBuenoProject,
15
16
  joinPaths,
16
- findFileUp,
17
17
  readFile,
18
- } from '../utils/fs';
19
- import { CLIError, CLIErrorType } from '../index';
18
+ } from "../utils/fs";
19
+ import { defineCommand } from "./index";
20
20
 
21
21
  /**
22
22
  * Find the entry point for the application
23
23
  */
24
24
  async function findEntryPoint(projectRoot: string): Promise<string | null> {
25
25
  const possibleEntries = [
26
- 'server/main.ts',
27
- 'src/main.ts',
28
- 'src/index.ts',
29
- 'main.ts',
30
- 'index.ts',
31
- 'server.ts',
32
- 'app.ts',
26
+ "server/main.ts",
27
+ "src/main.ts",
28
+ "src/index.ts",
29
+ "main.ts",
30
+ "index.ts",
31
+ "server.ts",
32
+ "app.ts",
33
33
  ];
34
34
 
35
35
  for (const entry of possibleEntries) {
@@ -46,7 +46,7 @@ async function findEntryPoint(projectRoot: string): Promise<string | null> {
46
46
  * Check if package.json has dev script
47
47
  */
48
48
  async function hasDevScript(projectRoot: string): Promise<boolean> {
49
- const packageJsonPath = joinPaths(projectRoot, 'package.json');
49
+ const packageJsonPath = joinPaths(projectRoot, "package.json");
50
50
  if (!(await fileExists(packageJsonPath))) {
51
51
  return false;
52
52
  }
@@ -65,44 +65,44 @@ async function hasDevScript(projectRoot: string): Promise<boolean> {
65
65
  */
66
66
  async function handleDev(args: ParsedArgs): Promise<void> {
67
67
  // Get options
68
- const port = getOption(args, 'port', {
69
- name: 'port',
70
- alias: 'p',
71
- type: 'number',
68
+ const port = getOption(args, "port", {
69
+ name: "port",
70
+ alias: "p",
71
+ type: "number",
72
72
  default: 3000,
73
- description: '',
73
+ description: "",
74
74
  });
75
75
 
76
- const host = getOption<string>(args, 'host', {
77
- name: 'host',
78
- alias: 'H',
79
- type: 'string',
80
- default: 'localhost',
81
- description: '',
76
+ const host = getOption<string>(args, "host", {
77
+ name: "host",
78
+ alias: "H",
79
+ type: "string",
80
+ default: "localhost",
81
+ description: "",
82
82
  });
83
83
 
84
- const hmr = !hasFlag(args, 'no-hmr');
85
- const watch = !hasFlag(args, 'no-watch');
86
- const openBrowser = hasFlag(args, 'open') || hasFlag(args, 'o');
87
- const configPath = getOption<string>(args, 'config', {
88
- name: 'config',
89
- alias: 'c',
90
- type: 'string',
91
- description: '',
84
+ const hmr = !hasFlag(args, "no-hmr");
85
+ const watch = !hasFlag(args, "no-watch");
86
+ const openBrowser = hasFlag(args, "open") || hasFlag(args, "o");
87
+ const configPath = getOption<string>(args, "config", {
88
+ name: "config",
89
+ alias: "c",
90
+ type: "string",
91
+ description: "",
92
92
  });
93
93
 
94
94
  // Check if in a Bueno project
95
95
  const projectRoot = await getProjectRoot();
96
96
  if (!projectRoot) {
97
97
  throw new CLIError(
98
- 'Not in a project directory. Run this command from a Bueno project.',
98
+ "Not in a project directory. Run this command from a Bueno project.",
99
99
  CLIErrorType.NOT_FOUND,
100
100
  );
101
101
  }
102
102
 
103
103
  if (!(await isBuenoProject())) {
104
104
  throw new CLIError(
105
- 'Not a Bueno project. Make sure you have a bueno.config.ts or bueno in your dependencies.',
105
+ "Not a Bueno project. Make sure you have a bueno.config.ts or bueno in your dependencies.",
106
106
  CLIErrorType.NOT_FOUND,
107
107
  );
108
108
  }
@@ -111,7 +111,7 @@ async function handleDev(args: ParsedArgs): Promise<void> {
111
111
  const entryPoint = await findEntryPoint(projectRoot);
112
112
  if (!entryPoint) {
113
113
  throw new CLIError(
114
- 'Could not find entry point. Make sure you have a main.ts or index.ts file.',
114
+ "Could not find entry point. Make sure you have a main.ts or index.ts file.",
115
115
  CLIErrorType.FILE_NOT_FOUND,
116
116
  );
117
117
  }
@@ -120,19 +120,19 @@ async function handleDev(args: ParsedArgs): Promise<void> {
120
120
  const bunArgs: string[] = [];
121
121
 
122
122
  if (watch) {
123
- bunArgs.push('--watch');
123
+ bunArgs.push("--watch");
124
124
  }
125
125
 
126
126
  if (hmr) {
127
127
  // HMR is handled by the dev server in the framework
128
- cliConsole.debug('HMR enabled');
128
+ cliConsole.debug("HMR enabled");
129
129
  }
130
130
 
131
131
  bunArgs.push(entryPoint);
132
132
 
133
133
  // Set environment variables
134
134
  const env: Record<string, string> = {
135
- NODE_ENV: 'development',
135
+ NODE_ENV: "development",
136
136
  PORT: String(port),
137
137
  HOST: host,
138
138
  };
@@ -142,36 +142,43 @@ async function handleDev(args: ParsedArgs): Promise<void> {
142
142
  }
143
143
 
144
144
  // Display startup info
145
- cliConsole.header('Starting Development Server');
146
- cliConsole.log(`${colors.bold('Entry:')} ${entryPoint}`);
147
- cliConsole.log(`${colors.bold('Port:')} ${port}`);
148
- cliConsole.log(`${colors.bold('Host:')} ${host}`);
149
- cliConsole.log(`${colors.bold('Watch:')} ${watch ? colors.green('enabled') : colors.red('disabled')}`);
150
- cliConsole.log(`${colors.bold('HMR:')} ${hmr ? colors.green('enabled') : colors.red('disabled')}`);
151
- cliConsole.log('');
145
+ cliConsole.header("Starting Development Server");
146
+ cliConsole.log(`${colors.bold("Entry:")} ${entryPoint}`);
147
+ cliConsole.log(`${colors.bold("Port:")} ${port}`);
148
+ cliConsole.log(`${colors.bold("Host:")} ${host}`);
149
+ cliConsole.log(
150
+ `${colors.bold("Watch:")} ${watch ? colors.green("enabled") : colors.red("disabled")}`,
151
+ );
152
+ cliConsole.log(
153
+ `${colors.bold("HMR:")} ${hmr ? colors.green("enabled") : colors.red("disabled")}`,
154
+ );
155
+ cliConsole.log("");
152
156
 
153
157
  // Start the server using Bun
154
- const s = spinner('Starting development server...');
158
+ const s = spinner("Starting development server...");
155
159
 
156
160
  try {
157
161
  // Use Bun's spawn to run the dev server
158
- const proc = Bun.spawn(['bun', 'run', ...bunArgs], {
162
+ const proc = Bun.spawn(["bun", "run", ...bunArgs], {
159
163
  cwd: projectRoot,
160
164
  env: { ...process.env, ...env },
161
- stdout: 'inherit',
162
- stderr: 'inherit',
165
+ stdout: "inherit",
166
+ stderr: "inherit",
163
167
  });
164
168
 
165
- s.success(`Development server running at ${colors.cyan(`http://${host}:${port}`)}`);
169
+ s.success(
170
+ `Development server running at ${colors.cyan(`http://${host}:${port}`)}`,
171
+ );
166
172
 
167
173
  // Open browser if requested
168
174
  if (openBrowser) {
169
- const openCommand = process.platform === 'darwin'
170
- ? 'open'
171
- : process.platform === 'win32'
172
- ? 'start'
173
- : 'xdg-open';
174
-
175
+ const openCommand =
176
+ process.platform === "darwin"
177
+ ? "open"
178
+ : process.platform === "win32"
179
+ ? "start"
180
+ : "xdg-open";
181
+
175
182
  Bun.spawn([openCommand, `http://${host}:${port}`], {
176
183
  cwd: projectRoot,
177
184
  });
@@ -193,56 +200,56 @@ async function handleDev(args: ParsedArgs): Promise<void> {
193
200
  // Register the command
194
201
  defineCommand(
195
202
  {
196
- name: 'dev',
197
- description: 'Start the development server with hot reload',
203
+ name: "dev",
204
+ description: "Start the development server with hot reload",
198
205
  options: [
199
206
  {
200
- name: 'port',
201
- alias: 'p',
202
- type: 'number',
207
+ name: "port",
208
+ alias: "p",
209
+ type: "number",
203
210
  default: 3000,
204
- description: 'Server port',
211
+ description: "Server port",
205
212
  },
206
213
  {
207
- name: 'host',
208
- alias: 'H',
209
- type: 'string',
210
- default: 'localhost',
211
- description: 'Server hostname',
214
+ name: "host",
215
+ alias: "H",
216
+ type: "string",
217
+ default: "localhost",
218
+ description: "Server hostname",
212
219
  },
213
220
  {
214
- name: 'no-hmr',
215
- type: 'boolean',
221
+ name: "no-hmr",
222
+ type: "boolean",
216
223
  default: false,
217
- description: 'Disable hot module replacement',
224
+ description: "Disable hot module replacement",
218
225
  },
219
226
  {
220
- name: 'no-watch',
221
- type: 'boolean',
227
+ name: "no-watch",
228
+ type: "boolean",
222
229
  default: false,
223
- description: 'Disable file watching',
230
+ description: "Disable file watching",
224
231
  },
225
232
  {
226
- name: 'open',
227
- alias: 'o',
228
- type: 'boolean',
233
+ name: "open",
234
+ alias: "o",
235
+ type: "boolean",
229
236
  default: false,
230
- description: 'Open browser on start',
237
+ description: "Open browser on start",
231
238
  },
232
239
  {
233
- name: 'config',
234
- alias: 'c',
235
- type: 'string',
236
- description: 'Path to config file',
240
+ name: "config",
241
+ alias: "c",
242
+ type: "string",
243
+ description: "Path to config file",
237
244
  },
238
245
  ],
239
246
  examples: [
240
- 'bueno dev',
241
- 'bueno dev --port 4000',
242
- 'bueno dev --host 0.0.0.0',
243
- 'bueno dev --no-hmr',
244
- 'bueno dev --open',
247
+ "bueno dev",
248
+ "bueno dev --port 4000",
249
+ "bueno dev --host 0.0.0.0",
250
+ "bueno dev --no-hmr",
251
+ "bueno dev --open",
245
252
  ],
246
253
  },
247
254
  handleDev,
248
- );
255
+ );