@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.
- package/README.md +136 -16
- package/dist/cli/{index.js → bin.js} +3036 -1421
- package/dist/container/index.js +250 -0
- package/dist/context/index.js +219 -0
- package/dist/database/index.js +493 -0
- package/dist/frontend/index.js +7697 -0
- package/dist/health/index.js +364 -0
- package/dist/i18n/index.js +345 -0
- package/dist/index.js +11043 -6482
- package/dist/jobs/index.js +819 -0
- package/dist/lock/index.js +367 -0
- package/dist/logger/index.js +281 -0
- package/dist/metrics/index.js +289 -0
- package/dist/middleware/index.js +77 -0
- package/dist/migrations/index.js +571 -0
- package/dist/modules/index.js +3346 -0
- package/dist/notification/index.js +484 -0
- package/dist/observability/index.js +331 -0
- package/dist/openapi/index.js +776 -0
- package/dist/orm/index.js +1356 -0
- package/dist/router/index.js +886 -0
- package/dist/rpc/index.js +691 -0
- package/dist/schema/index.js +400 -0
- package/dist/telemetry/index.js +595 -0
- package/dist/template/index.js +640 -0
- package/dist/templates/index.js +640 -0
- package/dist/testing/index.js +1111 -0
- package/dist/types/index.js +60 -0
- package/package.json +121 -27
- package/src/cache/index.ts +2 -1
- package/src/cli/bin.ts +2 -2
- package/src/cli/commands/build.ts +183 -165
- package/src/cli/commands/dev.ts +96 -89
- package/src/cli/commands/generate.ts +142 -111
- package/src/cli/commands/help.ts +20 -16
- package/src/cli/commands/index.ts +3 -6
- package/src/cli/commands/migration.ts +124 -105
- package/src/cli/commands/new.ts +392 -438
- package/src/cli/commands/start.ts +81 -79
- package/src/cli/core/args.ts +68 -50
- package/src/cli/core/console.ts +89 -95
- package/src/cli/core/index.ts +4 -4
- package/src/cli/core/prompt.ts +65 -62
- package/src/cli/core/spinner.ts +23 -20
- package/src/cli/index.ts +46 -38
- package/src/cli/templates/database/index.ts +61 -0
- package/src/cli/templates/database/mysql.ts +14 -0
- package/src/cli/templates/database/none.ts +16 -0
- package/src/cli/templates/database/postgresql.ts +14 -0
- package/src/cli/templates/database/sqlite.ts +14 -0
- package/src/cli/templates/deploy.ts +29 -26
- package/src/cli/templates/docker.ts +41 -30
- package/src/cli/templates/frontend/index.ts +63 -0
- package/src/cli/templates/frontend/none.ts +17 -0
- package/src/cli/templates/frontend/react.ts +140 -0
- package/src/cli/templates/frontend/solid.ts +134 -0
- package/src/cli/templates/frontend/svelte.ts +131 -0
- package/src/cli/templates/frontend/vue.ts +130 -0
- package/src/cli/templates/generators/index.ts +339 -0
- package/src/cli/templates/generators/types.ts +56 -0
- package/src/cli/templates/index.ts +35 -2
- package/src/cli/templates/project/api.ts +81 -0
- package/src/cli/templates/project/default.ts +140 -0
- package/src/cli/templates/project/fullstack.ts +111 -0
- package/src/cli/templates/project/index.ts +95 -0
- package/src/cli/templates/project/minimal.ts +45 -0
- package/src/cli/templates/project/types.ts +94 -0
- package/src/cli/templates/project/website.ts +263 -0
- package/src/cli/utils/fs.ts +55 -41
- package/src/cli/utils/index.ts +3 -2
- package/src/cli/utils/strings.ts +47 -33
- package/src/cli/utils/version.ts +47 -0
- package/src/config/env-validation.ts +100 -0
- package/src/config/env.ts +169 -41
- package/src/config/index.ts +28 -20
- package/src/config/loader.ts +25 -16
- package/src/config/merge.ts +21 -10
- package/src/config/types.ts +545 -25
- package/src/config/validation.ts +215 -7
- package/src/container/forward-ref.ts +22 -22
- package/src/container/index.ts +34 -12
- package/src/context/index.ts +11 -1
- package/src/database/index.ts +7 -190
- package/src/database/orm/builder.ts +457 -0
- package/src/database/orm/casts/index.ts +130 -0
- package/src/database/orm/casts/types.ts +25 -0
- package/src/database/orm/compiler.ts +304 -0
- package/src/database/orm/hooks/index.ts +114 -0
- package/src/database/orm/index.ts +61 -0
- package/src/database/orm/model-registry.ts +59 -0
- package/src/database/orm/model.ts +821 -0
- package/src/database/orm/relationships/base.ts +146 -0
- package/src/database/orm/relationships/belongs-to-many.ts +179 -0
- package/src/database/orm/relationships/belongs-to.ts +56 -0
- package/src/database/orm/relationships/has-many.ts +45 -0
- package/src/database/orm/relationships/has-one.ts +41 -0
- package/src/database/orm/relationships/index.ts +11 -0
- package/src/database/orm/scopes/index.ts +55 -0
- package/src/events/__tests__/event-system.test.ts +235 -0
- package/src/events/config.ts +238 -0
- package/src/events/example-usage.ts +185 -0
- package/src/events/index.ts +278 -0
- package/src/events/manager.ts +385 -0
- package/src/events/registry.ts +182 -0
- package/src/events/types.ts +124 -0
- package/src/frontend/api-routes.ts +65 -23
- package/src/frontend/bundler.ts +76 -34
- package/src/frontend/console-client.ts +2 -2
- package/src/frontend/console-stream.ts +94 -38
- package/src/frontend/dev-server.ts +94 -46
- package/src/frontend/file-router.ts +61 -19
- package/src/frontend/frameworks/index.ts +37 -10
- package/src/frontend/frameworks/react.ts +10 -8
- package/src/frontend/frameworks/solid.ts +11 -9
- package/src/frontend/frameworks/svelte.ts +15 -9
- package/src/frontend/frameworks/vue.ts +13 -11
- package/src/frontend/hmr-client.ts +12 -10
- package/src/frontend/hmr.ts +146 -103
- package/src/frontend/index.ts +14 -5
- package/src/frontend/islands.ts +41 -22
- package/src/frontend/isr.ts +59 -37
- package/src/frontend/layout.ts +36 -21
- package/src/frontend/ssr/react.ts +74 -27
- package/src/frontend/ssr/solid.ts +54 -20
- package/src/frontend/ssr/svelte.ts +48 -14
- package/src/frontend/ssr/vue.ts +50 -18
- package/src/frontend/ssr.ts +83 -39
- package/src/frontend/types.ts +91 -56
- package/src/health/index.ts +21 -9
- package/src/i18n/engine.ts +305 -0
- package/src/i18n/index.ts +38 -0
- package/src/i18n/loader.ts +218 -0
- package/src/i18n/middleware.ts +164 -0
- package/src/i18n/negotiator.ts +162 -0
- package/src/i18n/types.ts +158 -0
- package/src/index.ts +179 -27
- package/src/jobs/drivers/memory.ts +315 -0
- package/src/jobs/drivers/redis.ts +459 -0
- package/src/jobs/index.ts +30 -0
- package/src/jobs/queue.ts +281 -0
- package/src/jobs/types.ts +295 -0
- package/src/jobs/worker.ts +380 -0
- package/src/logger/index.ts +1 -3
- package/src/logger/transports/index.ts +62 -22
- package/src/metrics/index.ts +25 -16
- package/src/migrations/index.ts +9 -0
- package/src/modules/filters.ts +13 -17
- package/src/modules/guards.ts +49 -26
- package/src/modules/index.ts +409 -298
- package/src/modules/interceptors.ts +58 -20
- package/src/modules/lazy.ts +11 -19
- package/src/modules/lifecycle.ts +15 -7
- package/src/modules/metadata.ts +15 -5
- package/src/modules/pipes.ts +94 -72
- package/src/notification/channels/base.ts +68 -0
- package/src/notification/channels/email.ts +105 -0
- package/src/notification/channels/push.ts +104 -0
- package/src/notification/channels/sms.ts +105 -0
- package/src/notification/channels/whatsapp.ts +104 -0
- package/src/notification/index.ts +48 -0
- package/src/notification/service.ts +354 -0
- package/src/notification/types.ts +344 -0
- package/src/observability/__tests__/observability.test.ts +483 -0
- package/src/observability/breadcrumbs.ts +114 -0
- package/src/observability/index.ts +136 -0
- package/src/observability/interceptor.ts +85 -0
- package/src/observability/service.ts +303 -0
- package/src/observability/trace.ts +37 -0
- package/src/observability/types.ts +196 -0
- package/src/openapi/__tests__/decorators.test.ts +335 -0
- package/src/openapi/__tests__/document-builder.test.ts +285 -0
- package/src/openapi/__tests__/route-scanner.test.ts +334 -0
- package/src/openapi/__tests__/schema-generator.test.ts +275 -0
- package/src/openapi/decorators.ts +328 -0
- package/src/openapi/document-builder.ts +274 -0
- package/src/openapi/index.ts +112 -0
- package/src/openapi/metadata.ts +112 -0
- package/src/openapi/route-scanner.ts +289 -0
- package/src/openapi/schema-generator.ts +256 -0
- package/src/openapi/swagger-module.ts +166 -0
- package/src/openapi/types.ts +398 -0
- package/src/orm/index.ts +10 -0
- package/src/rpc/index.ts +3 -1
- package/src/schema/index.ts +9 -0
- package/src/security/index.ts +15 -6
- package/src/ssg/index.ts +9 -8
- package/src/telemetry/index.ts +76 -22
- package/src/template/index.ts +7 -0
- package/src/templates/engine.ts +224 -0
- package/src/templates/index.ts +9 -0
- package/src/templates/loader.ts +331 -0
- package/src/templates/renderers/markdown.ts +212 -0
- package/src/templates/renderers/simple.ts +269 -0
- package/src/templates/types.ts +154 -0
- package/src/testing/index.ts +100 -27
- package/src/types/optional-deps.d.ts +347 -187
- package/src/validation/index.ts +92 -2
- package/src/validation/schemas.ts +536 -0
- package/tests/integration/fullstack.test.ts +4 -4
- package/tests/unit/database.test.ts +2 -72
- package/tests/unit/env-validation.test.ts +166 -0
- package/tests/unit/events.test.ts +910 -0
- package/tests/unit/i18n.test.ts +455 -0
- package/tests/unit/jobs.test.ts +493 -0
- package/tests/unit/notification.test.ts +988 -0
- package/tests/unit/observability.test.ts +453 -0
- package/tests/unit/orm/builder.test.ts +323 -0
- package/tests/unit/orm/casts.test.ts +179 -0
- package/tests/unit/orm/compiler.test.ts +220 -0
- package/tests/unit/orm/eager-loading.test.ts +285 -0
- package/tests/unit/orm/hooks.test.ts +191 -0
- package/tests/unit/orm/model.test.ts +373 -0
- package/tests/unit/orm/relationships.test.ts +303 -0
- package/tests/unit/orm/scopes.test.ts +74 -0
- package/tests/unit/templates-simple.test.ts +53 -0
- package/tests/unit/templates.test.ts +454 -0
- package/tests/unit/validation.test.ts +18 -24
- package/tsconfig.json +11 -3
package/src/cli/commands/dev.ts
CHANGED
|
@@ -4,32 +4,32 @@
|
|
|
4
4
|
* Start the development server with hot reload
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
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
|
|
19
|
-
import {
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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,
|
|
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,
|
|
69
|
-
name:
|
|
70
|
-
alias:
|
|
71
|
-
type:
|
|
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,
|
|
77
|
-
name:
|
|
78
|
-
alias:
|
|
79
|
-
type:
|
|
80
|
-
default:
|
|
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,
|
|
85
|
-
const watch = !hasFlag(args,
|
|
86
|
-
const openBrowser = hasFlag(args,
|
|
87
|
-
const configPath = getOption<string>(args,
|
|
88
|
-
name:
|
|
89
|
-
alias:
|
|
90
|
-
type:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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:
|
|
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(
|
|
146
|
-
cliConsole.log(`${colors.bold(
|
|
147
|
-
cliConsole.log(`${colors.bold(
|
|
148
|
-
cliConsole.log(`${colors.bold(
|
|
149
|
-
cliConsole.log(
|
|
150
|
-
|
|
151
|
-
|
|
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(
|
|
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([
|
|
162
|
+
const proc = Bun.spawn(["bun", "run", ...bunArgs], {
|
|
159
163
|
cwd: projectRoot,
|
|
160
164
|
env: { ...process.env, ...env },
|
|
161
|
-
stdout:
|
|
162
|
-
stderr:
|
|
165
|
+
stdout: "inherit",
|
|
166
|
+
stderr: "inherit",
|
|
163
167
|
});
|
|
164
168
|
|
|
165
|
-
s.success(
|
|
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 =
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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:
|
|
197
|
-
description:
|
|
203
|
+
name: "dev",
|
|
204
|
+
description: "Start the development server with hot reload",
|
|
198
205
|
options: [
|
|
199
206
|
{
|
|
200
|
-
name:
|
|
201
|
-
alias:
|
|
202
|
-
type:
|
|
207
|
+
name: "port",
|
|
208
|
+
alias: "p",
|
|
209
|
+
type: "number",
|
|
203
210
|
default: 3000,
|
|
204
|
-
description:
|
|
211
|
+
description: "Server port",
|
|
205
212
|
},
|
|
206
213
|
{
|
|
207
|
-
name:
|
|
208
|
-
alias:
|
|
209
|
-
type:
|
|
210
|
-
default:
|
|
211
|
-
description:
|
|
214
|
+
name: "host",
|
|
215
|
+
alias: "H",
|
|
216
|
+
type: "string",
|
|
217
|
+
default: "localhost",
|
|
218
|
+
description: "Server hostname",
|
|
212
219
|
},
|
|
213
220
|
{
|
|
214
|
-
name:
|
|
215
|
-
type:
|
|
221
|
+
name: "no-hmr",
|
|
222
|
+
type: "boolean",
|
|
216
223
|
default: false,
|
|
217
|
-
description:
|
|
224
|
+
description: "Disable hot module replacement",
|
|
218
225
|
},
|
|
219
226
|
{
|
|
220
|
-
name:
|
|
221
|
-
type:
|
|
227
|
+
name: "no-watch",
|
|
228
|
+
type: "boolean",
|
|
222
229
|
default: false,
|
|
223
|
-
description:
|
|
230
|
+
description: "Disable file watching",
|
|
224
231
|
},
|
|
225
232
|
{
|
|
226
|
-
name:
|
|
227
|
-
alias:
|
|
228
|
-
type:
|
|
233
|
+
name: "open",
|
|
234
|
+
alias: "o",
|
|
235
|
+
type: "boolean",
|
|
229
236
|
default: false,
|
|
230
|
-
description:
|
|
237
|
+
description: "Open browser on start",
|
|
231
238
|
},
|
|
232
239
|
{
|
|
233
|
-
name:
|
|
234
|
-
alias:
|
|
235
|
-
type:
|
|
236
|
-
description:
|
|
240
|
+
name: "config",
|
|
241
|
+
alias: "c",
|
|
242
|
+
type: "string",
|
|
243
|
+
description: "Path to config file",
|
|
237
244
|
},
|
|
238
245
|
],
|
|
239
246
|
examples: [
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
+
);
|