@ubean/cli 0.1.12 → 0.2.0

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/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
- import { E as createFsOps, S as renderTemplate, a as scaffold, c as scaffoldStarterTemplate, i as recoverScaffold, l as scaffoldUnifyTemplate, n as listScaffoldableFiles, o as scaffoldBlogTemplate, r as pageCommand, s as scaffoldMinimalTemplate, t as deleteScaffold } from "./page-VyP_7yLT.js";
1
+ import { E as createFsOps, S as renderTemplate, a as scaffold, c as scaffoldStarterTemplate, i as recoverScaffold, l as scaffoldUnifyTemplate, n as listScaffoldableFiles, o as scaffoldBlogTemplate, r as pageCommand, s as scaffoldMinimalTemplate, t as deleteScaffold } from "./page-D-LZUcPP.js";
2
2
  import { existsSync, mkdirSync, readFileSync } from "node:fs";
3
3
  import { extname, normalize } from "node:path";
4
- import { consola } from "consola";
4
+ import { getLogger } from "@ubean/logger";
5
5
  import { defineCommand, runMain } from "citty";
6
6
  import { readFile, rm, stat } from "node:fs/promises";
7
7
  import { pathToFileURL } from "node:url";
@@ -10,7 +10,7 @@ import { generateOpenApiTypesFromServer, generateTypes } from "@ubean/codegen";
10
10
  import { loadUbeanConfig, resolvePrerenderConfig, resolveSsrConfig } from "@ubean/config";
11
11
  import { prerender } from "@ubean/prerender";
12
12
  import { NODE_REQUIREMENTS, createCapabilitySet, diagnoseCapabilities, registerBuiltinPresets, resolvePresetByName } from "@ubean/preset";
13
- import { scanProject } from "@ubean/routing";
13
+ import { scanProject } from "@ubean/scan";
14
14
  import { basename, join as join$1, resolve as resolve$1 } from "pathe";
15
15
  import { createUbeanApp } from "@ubean/app";
16
16
  import { createDevRunner, createDevWatcher, logDiagnostics } from "@ubean/dev-server";
@@ -18,9 +18,9 @@ import { bold, cyan, dim, green } from "kolorist";
18
18
  import { execSync, spawn } from "node:child_process";
19
19
  import { BUILTIN_MODULES, isBuiltinDisabled } from "@ubean/modules";
20
20
  import { createServer } from "node:http";
21
- import { findAvailablePort, waitForPort } from "@ubean/utils";
21
+ import { findAvailablePort, waitForPort } from "@ubean/shared/node";
22
22
  //#region src/config.ts
23
- const logger$8 = consola.withTag("ubean-cli");
23
+ const logger$8 = getLogger("cli");
24
24
  const CONFIG_TEMPLATE = `import { defineConfig } from 'ubean';
25
25
 
26
26
  export default defineConfig({
@@ -99,7 +99,8 @@ const configCommand = {
99
99
  }
100
100
  },
101
101
  async run({ args }) {
102
- const fs = createFsOps(process.cwd());
102
+ const cwd = process.cwd();
103
+ const fs = createFsOps(cwd);
103
104
  const preset = args.preset;
104
105
  const existing = await findConfigFile(fs);
105
106
  if (existing && !args.force) {
@@ -108,12 +109,12 @@ const configCommand = {
108
109
  }
109
110
  const content = renderTemplate(CONFIG_TEMPLATE, { variables: { preset } });
110
111
  if (args.dry) {
111
- logger$8.success("[dry-run] Would create ubean.config.ts");
112
- logger$8.log(`\n${content}`);
112
+ logger$8.info("[dry-run] Would create ubean.config.ts");
113
+ logger$8.info(`\n${content}`);
113
114
  return;
114
115
  }
115
116
  await fs.writeFile("ubean.config.ts", content);
116
- logger$8.success("Created ubean.config.ts");
117
+ logger$8.info("Created ubean.config.ts");
117
118
  }
118
119
  },
119
120
  show: {
@@ -122,16 +123,17 @@ const configCommand = {
122
123
  description: "Show current configuration file location and content"
123
124
  },
124
125
  async run() {
125
- const fs = createFsOps(process.cwd());
126
+ const cwd = process.cwd();
127
+ const fs = createFsOps(cwd);
126
128
  const configFile = await findConfigFile(fs);
127
129
  if (!configFile) {
128
130
  logger$8.warn("No ubean config file found. Run `ubean config init` to create one.");
129
131
  return;
130
132
  }
131
133
  logger$8.info(`Config file: ${configFile}`);
132
- logger$8.log("");
134
+ logger$8.info("");
133
135
  const content = await fs.readFile(configFile);
134
- logger$8.log(content);
136
+ logger$8.info(content);
135
137
  }
136
138
  },
137
139
  example: {
@@ -140,7 +142,7 @@ const configCommand = {
140
142
  description: "Show a full example configuration with all options"
141
143
  },
142
144
  async run() {
143
- logger$8.log(CONFIG_EXAMPLE_FULL);
145
+ logger$8.info(CONFIG_EXAMPLE_FULL);
144
146
  }
145
147
  },
146
148
  path: {
@@ -149,20 +151,21 @@ const configCommand = {
149
151
  description: "Print resolved config file path"
150
152
  },
151
153
  async run() {
152
- const fs = createFsOps(process.cwd());
154
+ const cwd = process.cwd();
155
+ const fs = createFsOps(cwd);
153
156
  const configFile = await findConfigFile(fs);
154
157
  if (!configFile) {
155
158
  logger$8.error("No config file found");
156
159
  process.exit(1);
157
160
  }
158
- logger$8.log(fs.resolve(configFile));
161
+ logger$8.info(fs.resolve(configFile));
159
162
  }
160
163
  }
161
164
  }
162
165
  };
163
166
  //#endregion
164
167
  //#region src/build.ts
165
- const logger$7 = consola.withTag("ubean-cli");
168
+ const logger$7 = getLogger("cli");
166
169
  /**
167
170
  * Creates a fetcher that invokes the built SSR entry to render real HTML.
168
171
  * Inspired by void's Node prerender runner: import the built `entry.mjs`,
@@ -174,7 +177,8 @@ const logger$7 = consola.withTag("ubean-cli");
174
177
  */
175
178
  async function createSsrFetcher(cwd, manifest) {
176
179
  try {
177
- const mod = await import(pathToFileURL(resolve$1(cwd, manifest.serverDir, "entry.mjs")).href);
180
+ const entryPath = resolve$1(cwd, manifest.serverDir, "entry.mjs");
181
+ const mod = await import(pathToFileURL(entryPath).href);
178
182
  const createFetchHandler = mod.default ?? mod.createFetchHandler;
179
183
  if (typeof createFetchHandler !== "function") {
180
184
  logger$7.warn("SSR entry does not export createFetchHandler; falling back to placeholder prerender.");
@@ -243,7 +247,7 @@ const buildCommand = {
243
247
  },
244
248
  async run({ args }) {
245
249
  const cwd = resolve$1(args.cwd || process.cwd());
246
- logger$7.start("Building ubean application...");
250
+ logger$7.info("Building ubean application...");
247
251
  try {
248
252
  registerBuiltinPresets();
249
253
  const config = await loadUbeanConfig(cwd);
@@ -257,7 +261,8 @@ const buildCommand = {
257
261
  if (args.prerender === true) {
258
262
  if (!config.prerender.enabled) config.prerender = resolvePrerenderConfig({ all: true });
259
263
  } else if (args.prerender === false) config.prerender = resolvePrerenderConfig();
260
- const preset = resolvePresetByName(args.preset || config.build.preset);
264
+ const presetName = args.preset || config.build.preset;
265
+ const preset = resolvePresetByName(presetName);
261
266
  logger$7.info(`Using preset: ${preset.name}`);
262
267
  logger$7.info(`App mode: ${config.mode}${config.mode === "fullstack" ? ` (ssr=${config.ssr.enabled})` : ""}`);
263
268
  logger$7.info("Scanning project...");
@@ -295,7 +300,8 @@ const buildCommand = {
295
300
  minify: args.minify,
296
301
  sourcemap: args.sourcemap
297
302
  });
298
- if (config.prerender.enabled) {
303
+ const hasPrerenderRules = Object.values(config.routeRules || {}).some((r) => r?.prerender === true);
304
+ if (config.prerender.enabled || hasPrerenderRules) {
299
305
  logger$7.info("Prerendering static pages...");
300
306
  const fetcher = await createSsrFetcher(cwd, manifest);
301
307
  await prerender({
@@ -303,10 +309,11 @@ const buildCommand = {
303
309
  outputDir: config.build.outputDir,
304
310
  pages: result.pages,
305
311
  prerender: config.prerender,
312
+ routeRules: config.routeRules,
306
313
  fetcher
307
314
  });
308
315
  }
309
- if (config.mode === "ssg") {
316
+ if (config.mode === "ssg" && !process.env.UBEAN_KEEP_SSR) {
310
317
  const serverDir = join$1(cwd, config.build.outputDir, "server");
311
318
  if (existsSync(serverDir)) {
312
319
  logger$7.info("Cleaning temporary SSR bundle (SSG mode)...");
@@ -323,7 +330,7 @@ const buildCommand = {
323
330
  config,
324
331
  manifest
325
332
  });
326
- logger$7.success(`Build complete for preset "${resolvedPreset.name}"!`);
333
+ logger$7.info(`Build complete for preset "${resolvedPreset.name}"!`);
327
334
  logger$7.info(` Output directory: ${resolve$1(cwd, config.build.outputDir)}`);
328
335
  if (manifest.entry) logger$7.info(` Server entry: ${manifest.entry}`);
329
336
  logger$7.info(` Client assets: ${manifest.assets.length} files`);
@@ -336,7 +343,7 @@ const buildCommand = {
336
343
  };
337
344
  //#endregion
338
345
  //#region src/dev.ts
339
- const logger$6 = consola.withTag("ubean-cli");
346
+ const logger$6 = getLogger("cli");
340
347
  /**
341
348
  * Best-effort loader for the optional `@ubean/devtools` peer dependency.
342
349
  *
@@ -387,7 +394,7 @@ const devCommand = {
387
394
  },
388
395
  async run({ args }) {
389
396
  const cwd = resolve$1(args.cwd || process.cwd());
390
- logger$6.start("Starting ubean dev server...");
397
+ logger$6.info("Starting ubean dev server...");
391
398
  registerBuiltinPresets();
392
399
  const config = await loadUbeanConfig(cwd);
393
400
  const port = Number(args.port) || config.dev.port;
@@ -413,6 +420,7 @@ const devCommand = {
413
420
  currentScanResult = scanResult;
414
421
  runner.updateApp(currentApp, currentLayouts);
415
422
  await runner.reload();
423
+ runner.sendFullReload();
416
424
  } catch (err) {
417
425
  logger$6.error(`Rescan failed: ${err instanceof Error ? err.message : String(err)}`);
418
426
  } finally {
@@ -456,9 +464,9 @@ const devCommand = {
456
464
  ];
457
465
  if (config.devtools.enabled) lines.push(` → ${label("DevTools:")} ${cyan(`${url}${config.devtools.route}`)}`);
458
466
  lines.push(` → ${dim("Press Ctrl+C to stop")}`);
459
- logger$6.box(lines.join("\n"));
467
+ logger$6.info(lines.join("\n"));
460
468
  generateOpenApiTypesFromServer(url, { outDir: resolve$1(cwd, ".ubean") }).then((filePath) => {
461
- logger$6.success(`OpenAPI types generated: ${filePath}`);
469
+ logger$6.info(`OpenAPI types generated: ${filePath}`);
462
470
  }).catch((err) => {
463
471
  logger$6.warn(`Failed to generate OpenAPI types: ${err instanceof Error ? err.message : String(err)}`);
464
472
  });
@@ -467,7 +475,7 @@ const devCommand = {
467
475
  logger$6.info("Reloading...");
468
476
  },
469
477
  onAfterReload() {
470
- logger$6.success("Reloaded");
478
+ logger$6.info("Reloaded");
471
479
  }
472
480
  });
473
481
  try {
@@ -539,16 +547,19 @@ async function buildApp(cwd, config) {
539
547
  crons: result.crons,
540
548
  routeRules: config.routeRules || {},
541
549
  publicDir: config.dir.public,
550
+ pageAssetTags: config.favicon ? { favicon: config.favicon } : void 0,
542
551
  openAPI: {
543
552
  title: "UBEAN Dev API",
544
553
  scalarPath: "/_scalar",
545
554
  openAPIPath: "/_openapi.json"
546
555
  },
547
556
  i18nConfig: config.i18n,
548
- ssrExclude: config.ssr.exclude
557
+ ssrExclude: config.ssr.exclude,
558
+ streaming: config.ssr.streaming,
559
+ notFoundPage: result.notFoundPage
549
560
  });
550
561
  app.hooks.hook("request:start", (c) => {
551
- logger$6.log(`${c.req.method} ${c.req.path}`);
562
+ logger$6.info(`${c.req.method} ${c.req.path}`);
552
563
  });
553
564
  return {
554
565
  app,
@@ -558,7 +569,7 @@ async function buildApp(cwd, config) {
558
569
  }
559
570
  //#endregion
560
571
  //#region src/devtools.ts
561
- const logger$5 = consola.withTag("ubean-cli");
572
+ const logger$5 = getLogger("cli");
562
573
  const devtoolsCommand = {
563
574
  meta: {
564
575
  name: "devtools",
@@ -572,27 +583,27 @@ const devtoolsCommand = {
572
583
  },
573
584
  async run() {
574
585
  logger$5.info("DevTools Information");
575
- logger$5.log("");
576
- logger$5.log(" DevTools is built into ubean and available in dev mode.");
577
- logger$5.log("");
578
- logger$5.log(" Access:");
579
- logger$5.log(" - Start dev server: pnpm dev");
580
- logger$5.log(" - Open DevTools: Press Shift+Alt+D in the browser, or visit /__ubean/devtools/");
581
- logger$5.log("");
582
- logger$5.log(" Configuration (ubean.config.ts):");
583
- logger$5.log(" devtools: {");
584
- logger$5.log(" enabled: true, // Enable/disable DevTools (dev only)");
585
- logger$5.log(" }");
586
- logger$5.log("");
587
- logger$5.log(" Features:");
588
- logger$5.log(" - Routes: View all registered routes and their handlers");
589
- logger$5.log(" - Pages: Inspect page components and layouts");
590
- logger$5.log(" - APIs: Browse API routes with OpenAPI integration");
591
- logger$5.log(" - Middleware: View registered middleware");
592
- logger$5.log(" - Crons: See scheduled tasks and their status");
593
- logger$5.log(" - Config: View resolved configuration");
594
- logger$5.log(" - Plugins: Browse installed plugins and their tabs");
595
- logger$5.log(" - CRUD: Create/delete pages, APIs, layouts, middleware, crons");
586
+ logger$5.info("");
587
+ logger$5.info(" DevTools is built into ubean and available in dev mode.");
588
+ logger$5.info("");
589
+ logger$5.info(" Access:");
590
+ logger$5.info(" - Start dev server: pnpm dev");
591
+ logger$5.info(" - Open DevTools: Press Shift+Alt+D in the browser, or visit /__ubean/devtools/");
592
+ logger$5.info("");
593
+ logger$5.info(" Configuration (ubean.config.ts):");
594
+ logger$5.info(" devtools: {");
595
+ logger$5.info(" enabled: true, // Enable/disable DevTools (dev only)");
596
+ logger$5.info(" }");
597
+ logger$5.info("");
598
+ logger$5.info(" Features:");
599
+ logger$5.info(" - Routes: View all registered routes and their handlers");
600
+ logger$5.info(" - Pages: Inspect page components and layouts");
601
+ logger$5.info(" - APIs: Browse API routes with OpenAPI integration");
602
+ logger$5.info(" - Middleware: View registered middleware");
603
+ logger$5.info(" - Crons: See scheduled tasks and their status");
604
+ logger$5.info(" - Config: View resolved configuration");
605
+ logger$5.info(" - Plugins: Browse installed plugins and their tabs");
606
+ logger$5.info(" - CRUD: Create/delete pages, APIs, layouts, middleware, crons");
596
607
  }
597
608
  },
598
609
  path: {
@@ -607,14 +618,14 @@ const devtoolsCommand = {
607
618
  } },
608
619
  async run({ args }) {
609
620
  const port = args.port;
610
- logger$5.log(`http://localhost:${port}/__ubean/devtools/`);
621
+ logger$5.info(`http://localhost:${port}/__ubean/devtools/`);
611
622
  }
612
623
  }
613
624
  }
614
625
  };
615
626
  //#endregion
616
627
  //#region src/env.ts
617
- const logger$4 = consola.withTag("ubean-cli");
628
+ const logger$4 = getLogger("cli");
618
629
  function parseEnvContent(content) {
619
630
  const vars = [];
620
631
  const lines = content.split("\n");
@@ -694,7 +705,8 @@ const envCommand = {
694
705
  }
695
706
  },
696
707
  async run({ args }) {
697
- const fs = createFsOps(process.cwd());
708
+ const cwd = process.cwd();
709
+ const fs = createFsOps(cwd);
698
710
  const file = args.file;
699
711
  let key = args.key;
700
712
  const value = args.value;
@@ -713,8 +725,8 @@ const envCommand = {
713
725
  public: key.startsWith("UBEAN_PUBLIC_") || key.startsWith("VITE_")
714
726
  });
715
727
  await writeEnvFile(fs, file, vars, args.dry);
716
- if (args.dry) logger$4.success(`[dry-run] Would ${existing ? "update" : "add"} ${key}=${value} in ${file}`);
717
- else logger$4.success(`${existing ? "Updated" : "Added"} ${key} in ${file}`);
728
+ if (args.dry) logger$4.info(`[dry-run] Would ${existing ? "update" : "add"} ${key}=${value} in ${file}`);
729
+ else logger$4.info(`${existing ? "Updated" : "Added"} ${key} in ${file}`);
718
730
  if (key.startsWith("UBEAN_PUBLIC_") || key.startsWith("VITE_") || key.startsWith("PUBLIC_")) logger$4.info(` Note: ${key} is exposed to client-side code`);
719
731
  }
720
732
  },
@@ -740,7 +752,8 @@ const envCommand = {
740
752
  }
741
753
  },
742
754
  async run({ args }) {
743
- const fs = createFsOps(process.cwd());
755
+ const cwd = process.cwd();
756
+ const fs = createFsOps(cwd);
744
757
  const file = args.file;
745
758
  const key = args.key;
746
759
  const vars = await readEnvFile(fs, file);
@@ -750,10 +763,10 @@ const envCommand = {
750
763
  return;
751
764
  }
752
765
  vars.splice(index, 1);
753
- if (args.dry) logger$4.success(`[dry-run] Would remove ${key} from ${file}`);
766
+ if (args.dry) logger$4.info(`[dry-run] Would remove ${key} from ${file}`);
754
767
  else {
755
768
  await writeEnvFile(fs, file, vars);
756
- logger$4.success(`Removed ${key} from ${file}`);
769
+ logger$4.info(`Removed ${key} from ${file}`);
757
770
  }
758
771
  }
759
772
  },
@@ -775,7 +788,8 @@ const envCommand = {
775
788
  }
776
789
  },
777
790
  async run({ args }) {
778
- const fs = createFsOps(process.cwd());
791
+ const cwd = process.cwd();
792
+ const fs = createFsOps(cwd);
779
793
  const file = args.file;
780
794
  if (!await fs.exists(file)) {
781
795
  logger$4.info(`${file} does not exist`);
@@ -790,7 +804,7 @@ const envCommand = {
790
804
  logger$4.info(`Variables in ${file} (${filtered.length}):`);
791
805
  for (const v of filtered) {
792
806
  const suffix = v.public ? " [public]" : "";
793
- logger$4.log(` ${v.key}=${v.value}${suffix}`);
807
+ logger$4.info(` ${v.key}=${v.value}${suffix}`);
794
808
  }
795
809
  const publicCount = vars.filter((v) => v.public).length;
796
810
  const privateCount = vars.length - publicCount;
@@ -816,7 +830,8 @@ const envCommand = {
816
830
  }
817
831
  },
818
832
  async run({ args }) {
819
- const fs = createFsOps(process.cwd());
833
+ const cwd = process.cwd();
834
+ const fs = createFsOps(cwd);
820
835
  for (const [file, content] of [[".env", `# ubean environment variables
821
836
  # Server-only variables (never exposed to client)
822
837
  DATABASE_URL=
@@ -833,10 +848,10 @@ SESSION_SECRET=your-session-secret
833
848
  logger$4.warn(`Skipping ${file} (already exists, use --force to overwrite)`);
834
849
  continue;
835
850
  }
836
- if (args.dry) logger$4.success(`[dry-run] Would create ${file}`);
851
+ if (args.dry) logger$4.info(`[dry-run] Would create ${file}`);
837
852
  else {
838
853
  await fs.writeFile(file, content);
839
- logger$4.success(`Created ${file}`);
854
+ logger$4.info(`Created ${file}`);
840
855
  }
841
856
  }
842
857
  logger$4.info("\nTip: Add .env to .gitignore (but commit .env.example)");
@@ -846,7 +861,7 @@ SESSION_SECRET=your-session-secret
846
861
  };
847
862
  //#endregion
848
863
  //#region src/init.ts
849
- const logger$3 = consola.withTag("ubean-cli");
864
+ const logger$3 = getLogger("cli");
850
865
  const TEMPLATES = [
851
866
  {
852
867
  value: "unify",
@@ -969,9 +984,7 @@ async function scaffoldProject(options) {
969
984
  case "blog":
970
985
  await scaffoldBlogTemplate(fs, templateOptions);
971
986
  break;
972
- default:
973
- await scaffoldStarterTemplate(fs, templateOptions);
974
- break;
987
+ default: await scaffoldStarterTemplate(fs, templateOptions);
975
988
  }
976
989
  if (options.git) try {
977
990
  const { execSync } = await import("node:child_process");
@@ -1069,7 +1082,7 @@ const initCommand = {
1069
1082
  };
1070
1083
  //#endregion
1071
1084
  //#region src/prepare.ts
1072
- const logger$2 = consola.withTag("ubean-cli");
1085
+ const logger$2 = getLogger("cli");
1073
1086
  async function ensureBuildDir(cwd, buildDir) {
1074
1087
  const fullPath = join$1(cwd, buildDir);
1075
1088
  if (!existsSync(fullPath)) mkdirSync(fullPath, { recursive: true });
@@ -1077,6 +1090,8 @@ async function ensureBuildDir(cwd, buildDir) {
1077
1090
  /**
1078
1091
  * Detects the package manager used in the project by inspecting lockfiles.
1079
1092
  * Priority: pnpm > yarn > bun > npm (npm as default fallback).
1093
+ *
1094
+ * 导出供单测复用(OPT-04 4c)。
1080
1095
  */
1081
1096
  function detectPackageManager(cwd) {
1082
1097
  if (existsSync(join$1(cwd, "pnpm-lock.yaml"))) return "pnpm";
@@ -1087,8 +1102,10 @@ function detectPackageManager(cwd) {
1087
1102
  /**
1088
1103
  * Builds the install command args for a given package manager and package list.
1089
1104
  * Examples:
1090
- * pnpm → ['add', '@ubean/ui@^0.1.3']
1091
- * npm → ['install', '@ubean/ui@^0.1.3']
1105
+ * pnpm → ['add', '@ubean/integrations@^0.1.3']
1106
+ * npm → ['install', '@ubean/integrations@^0.1.3']
1107
+ *
1108
+ * 导出供单测复用(OPT-04 4c)。
1092
1109
  */
1093
1110
  function buildInstallCommand(pm, packages) {
1094
1111
  switch (pm) {
@@ -1112,8 +1129,10 @@ function buildInstallCommand(pm, packages) {
1112
1129
  }
1113
1130
  /**
1114
1131
  * Extracts the bare package name from a module path.
1115
- * '@ubean/ui/vite' → '@ubean/ui'
1116
- * '@ubean/electron/vite' → '@ubean/electron'
1132
+ * '@ubean/integrations/pwa' → '@ubean/integrations'
1133
+ * '@ubean/icon/vite' → '@ubean/icon'
1134
+ *
1135
+ * 导出供单测复用(OPT-04 4c)。
1117
1136
  */
1118
1137
  function extractPackageName(modulePath) {
1119
1138
  if (modulePath.startsWith("@")) return modulePath.split("/").slice(0, 2).join("/");
@@ -1123,6 +1142,8 @@ function extractPackageName(modulePath) {
1123
1142
  * Reads the `ubean` package version from the project's package.json so we can
1124
1143
  * install matching versions of `@ubean/*` extension packages.
1125
1144
  * Returns `null` if ubean isn't declared or version can't be parsed.
1145
+ *
1146
+ * 导出供单测复用(OPT-04 4c)。
1126
1147
  */
1127
1148
  function getUbeanVersion(cwd) {
1128
1149
  try {
@@ -1194,7 +1215,7 @@ async function ensureBuiltinModules(cwd, config, autoInstall) {
1194
1215
  stdio: "inherit",
1195
1216
  env: { ...process.env }
1196
1217
  });
1197
- logger$2.success(`Installed: ${packagesToInstall.join(", ")}`);
1218
+ logger$2.info(`Installed: ${packagesToInstall.join(", ")}`);
1198
1219
  } catch (err) {
1199
1220
  logger$2.error(`Failed to auto-install packages: ${err instanceof Error ? err.message : String(err)}`);
1200
1221
  for (const m of missing) {
@@ -1222,7 +1243,7 @@ const prepareCommand = {
1222
1243
  },
1223
1244
  async run({ args }) {
1224
1245
  const cwd = resolve$1(args.cwd || process.cwd());
1225
- logger$2.start(`Preparing ubean project at ${cwd}...`);
1246
+ logger$2.info(`Preparing ubean project at ${cwd}...`);
1226
1247
  const config = await loadUbeanConfig(cwd);
1227
1248
  await ensureBuiltinModules(cwd, config, args.install !== false);
1228
1249
  const typesDir = ".ubean";
@@ -1246,8 +1267,8 @@ const prepareCommand = {
1246
1267
  composablesDirs: config.imports.dirs,
1247
1268
  componentsDirs: config.components.dirs
1248
1269
  });
1249
- for (const file of codegenResult.generated) logger$2.success(`Generated ${file.replace(`${cwd}/`, "")}`);
1250
- logger$2.success("Prepare complete!");
1270
+ for (const file of codegenResult.generated) logger$2.info(`Generated ${file.replace(`${cwd}/`, "")}`);
1271
+ logger$2.info("Prepare complete!");
1251
1272
  }
1252
1273
  };
1253
1274
  //#endregion
@@ -1343,7 +1364,7 @@ function startStaticServer(opts) {
1343
1364
  }
1344
1365
  }).listen(port, host);
1345
1366
  }
1346
- const logger$1 = consola.withTag("ubean-cli");
1367
+ const logger$1 = getLogger("cli");
1347
1368
  const previewCommand = {
1348
1369
  meta: {
1349
1370
  name: "preview",
@@ -1371,7 +1392,7 @@ const previewCommand = {
1371
1392
  },
1372
1393
  async run({ args }) {
1373
1394
  const cwd = resolve$1(args.cwd || process.cwd());
1374
- logger$1.start("Starting ubean preview server...");
1395
+ logger$1.info("Starting ubean preview server...");
1375
1396
  registerBuiltinPresets();
1376
1397
  const config = await loadUbeanConfig(cwd);
1377
1398
  const preset = resolvePresetByName(config.build.preset);
@@ -1396,7 +1417,7 @@ const previewCommand = {
1396
1417
  const label = (text) => dim(text);
1397
1418
  const printBanner = (port, modeLabel) => {
1398
1419
  const bannerUrl = `http://${host}:${port}`;
1399
- logger$1.box(`${green(bold("🚀 ubean preview server ready"))}\n\n → ${label("Local:")} ${cyan(bannerUrl)}\n → ${label("Mode:")} ${dim(modeLabel)}\n → ${label("Preset:")} ${cyan(preset.name)}\n → ${dim("Press Ctrl+C to stop")}`);
1420
+ logger$1.info(`${green(bold("🚀 ubean preview server ready"))}\n\n → ${label("Local:")} ${cyan(bannerUrl)}\n → ${label("Mode:")} ${dim(modeLabel)}\n → ${label("Preset:")} ${cyan(preset.name)}\n → ${dim("Press Ctrl+C to stop")}`);
1400
1421
  };
1401
1422
  if (mode === "spa" || mode === "ssg") {
1402
1423
  const staticRoot = join$1(cwd, outputDir, "public");
@@ -1504,7 +1525,7 @@ function spawnPreviewServer(opts) {
1504
1525
  }
1505
1526
  //#endregion
1506
1527
  //#region src/scaffold-commands.ts
1507
- const logger = consola.withTag("ubean-cli");
1528
+ const logger = getLogger("cli");
1508
1529
  const COMMAND_META = {
1509
1530
  api: {
1510
1531
  name: "api",
@@ -1587,7 +1608,7 @@ function createScaffoldCommand(type) {
1587
1608
  force: args.force,
1588
1609
  dry: args.dry
1589
1610
  });
1590
- for (const file of result.created) logger.success(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
1611
+ for (const file of result.created) logger.info(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
1591
1612
  for (const file of result.skipped) logger.warn(`Skipped ${file} (already exists, use --force to overwrite)`);
1592
1613
  for (const err of result.errors) logger.error(err);
1593
1614
  }
@@ -1622,7 +1643,7 @@ function createScaffoldCommand(type) {
1622
1643
  force: args.force,
1623
1644
  dry: args.dry
1624
1645
  });
1625
- for (const file of result.deleted) logger.success(`${args.dry ? "[dry-run] Would delete" : args.force ? "Deleted" : "Deleted (backup created)"} ${file}`);
1646
+ for (const file of result.deleted) logger.info(`${args.dry ? "[dry-run] Would delete" : args.force ? "Deleted" : "Deleted (backup created)"} ${file}`);
1626
1647
  for (const err of result.errors) logger.error(err);
1627
1648
  }
1628
1649
  },
@@ -1649,7 +1670,7 @@ function createScaffoldCommand(type) {
1649
1670
  path: args.path,
1650
1671
  dry: args.dry
1651
1672
  });
1652
- for (const file of result.restored) logger.success(`${args.dry ? "[dry-run] Backup exists for" : "Recovered"} ${file}`);
1673
+ for (const file of result.restored) logger.info(`${args.dry ? "[dry-run] Backup exists for" : "Recovered"} ${file}`);
1653
1674
  for (const err of result.errors) logger.error(err);
1654
1675
  }
1655
1676
  },
@@ -1665,12 +1686,17 @@ function createScaffoldCommand(type) {
1665
1686
  return;
1666
1687
  }
1667
1688
  logger.info(`Found ${files.length} ${type}(s):`);
1668
- for (const file of files) logger.log(` ${file}`);
1689
+ for (const file of files) logger.info(` ${file}`);
1669
1690
  }
1670
1691
  }
1671
1692
  }
1672
1693
  };
1673
1694
  }
1695
+ const apiCommand = createScaffoldCommand("api");
1696
+ const layoutCommand = createScaffoldCommand("layout");
1697
+ const middlewareCommand = createScaffoldCommand("middleware");
1698
+ const cronCommand = createScaffoldCommand("cron");
1699
+ const pluginCommand = createScaffoldCommand("plugin");
1674
1700
  //#endregion
1675
1701
  //#region src/cli.ts
1676
1702
  /**
@@ -1681,7 +1707,7 @@ function createScaffoldCommand(type) {
1681
1707
  *
1682
1708
  * 库代码请从 `@ubean/cli`(主入口)导入 scaffold / fs-ops / templates。
1683
1709
  */
1684
- runMain(defineCommand({
1710
+ const main = defineCommand({
1685
1711
  meta: {
1686
1712
  name: "ubean",
1687
1713
  version: "0.0.1",
@@ -1697,12 +1723,13 @@ runMain(defineCommand({
1697
1723
  env: envCommand,
1698
1724
  config: configCommand,
1699
1725
  devtools: devtoolsCommand,
1700
- api: createScaffoldCommand("api"),
1701
- layout: createScaffoldCommand("layout"),
1702
- middleware: createScaffoldCommand("middleware"),
1703
- cron: createScaffoldCommand("cron"),
1704
- plugin: createScaffoldCommand("plugin")
1726
+ api: apiCommand,
1727
+ layout: layoutCommand,
1728
+ middleware: middlewareCommand,
1729
+ cron: cronCommand,
1730
+ plugin: pluginCommand
1705
1731
  }
1706
- }));
1732
+ });
1733
+ runMain(main);
1707
1734
  //#endregion
1708
1735
  export {};
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { C as toCamelCase, E as createFsOps, S as renderTemplate, T as toPascalCase, _ as renderCronTemplate, a as scaffold, b as renderPageTemplate, d as CRON_TEMPLATE, f as LAYOUT_TEMPLATE, g as renderApiTemplate, h as PLUGIN_TEMPLATE, i as recoverScaffold, m as PAGE_TEMPLATE, n as listScaffoldableFiles, p as MIDDLEWARE_TEMPLATE, t as deleteScaffold, u as API_TEMPLATE, v as renderLayoutTemplate, w as toKebabCase, x as renderPluginTemplate, y as renderMiddlewareTemplate } from "./page-VyP_7yLT.js";
1
+ import { C as toCamelCase, E as createFsOps, S as renderTemplate, T as toPascalCase, _ as renderCronTemplate, a as scaffold, b as renderPageTemplate, d as CRON_TEMPLATE, f as LAYOUT_TEMPLATE, g as renderApiTemplate, h as PLUGIN_TEMPLATE, i as recoverScaffold, m as PAGE_TEMPLATE, n as listScaffoldableFiles, p as MIDDLEWARE_TEMPLATE, t as deleteScaffold, u as API_TEMPLATE, v as renderLayoutTemplate, w as toKebabCase, x as renderPluginTemplate, y as renderMiddlewareTemplate } from "./page-D-LZUcPP.js";
2
2
  export { API_TEMPLATE, CRON_TEMPLATE, LAYOUT_TEMPLATE, MIDDLEWARE_TEMPLATE, PAGE_TEMPLATE, PLUGIN_TEMPLATE, createFsOps, deleteScaffold, listScaffoldableFiles, recoverScaffold, renderApiTemplate, renderCronTemplate, renderLayoutTemplate, renderMiddlewareTemplate, renderPageTemplate, renderPluginTemplate, renderTemplate, scaffold, toCamelCase, toKebabCase, toPascalCase };
@@ -1,6 +1,6 @@
1
1
  import { existsSync, promises } from "node:fs";
2
2
  import { dirname, extname, join, relative, resolve } from "node:path";
3
- import { consola } from "consola";
3
+ import { getLogger } from "@ubean/logger";
4
4
  //#region src/shared/fs-ops.ts
5
5
  function resolvePath(cwd, ...paths) {
6
6
  return resolve(cwd, ...paths);
@@ -557,7 +557,7 @@ const ABOUT_PAGE = `<script setup lang="ts"><\/script>
557
557
  `;
558
558
  const ABOUT_REUSE = `import { definePage } from 'ubean';
559
559
 
560
- export default definePage({
560
+ definePage({
561
561
  reuse: 'About'
562
562
  });
563
563
  `;
@@ -993,25 +993,69 @@ const ZH_LOCALE = `{
993
993
  const FAVICON_SVG = `<svg width="100%" height="100%" version="1.1" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg"
994
994
  xmlns:xlink="http://www.w3.org/1999/xlink">
995
995
  <g>
996
- <path d="M 200,866 C 100,866 50,779.4 100,692.8 L 200,519.6 C 220,485 240,490 265,499.6 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866" fill="url(#LinearGradient)" fill-rule="nonzero" opacity="1" stroke="none" />
997
- <path d="M 420,866 C 455,861 478,846 500,827 C 614,696 615,597 500,517 C 394,444 333,374 380,207.82 L 260,415.67 C 240.22,450 254.37,465.1 275.28,481.79 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866" fill="url(#LinearGradient_2)" fill-rule="nonzero" opacity="1" stroke="none" />
998
- <path d="M 500,517 C 394,444 333,374 380,207.82 L 400,173.2 C 367,295 421,350 603,428 C 572,440 524,474 500,517" fill="url(#LinearGradient_3)" fill-rule="nonzero" opacity="1" stroke="none" />
999
- <path d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 572,440 524,474 500,517 C 615,597 614,696 500,827" fill="url(#LinearGradient_4)" fill-rule="nonzero" opacity="1" stroke="none" />
1000
- <path d="M 400,173.2 C 367,295 421,350 603,428 C 690,389, 750,445 788,500 L 600,173.2 C 550,86.6 450,86.6 400,173.2" fill="url(#LinearGradient_5)" fill-rule="nonzero" opacity="1" stroke="none" />
1001
- <path d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 690,389, 750,445 788,500 C 816,554 797,606 750,640 L 500,827" fill="url(#LinearGradient_6)" fill-rule="nonzero" opacity="1" stroke="none" />
1002
- <path d="M 788,500 C 816,554 797,606 750,640 L 500,827 C 497,851 513,862 540,866 L 800,866 C 900,866 950,779.4 900,692.8 L 788,500" fill="url(#LinearGradient_7)" fill-rule="nonzero" opacity="1" stroke="none" />
1003
- <g transform="translate(140, 650) scale(0.18)">
1004
- <path d="M539.04,146.5c-77.37,32.74-126.47,114.53-123.22,198,.61,150.92,169.47,210.6,214.99,341.13,39.71,96.62-16.62,230.68-122.31,253.16-374.89-83.15-390.44-785.49,30.54-792.29ZM564.61,948.5c68.1-32.18,118.51-95.45,132.49-169.97,41.81-214.6-158.22-254.7-215.15-413.02-31.14-86.21,21.33-198.66,114.56-214.57,129.21,21.58,214.93,148.7,230.96,272.19,7.94,38.53,21.57,75.37,34.41,112.43,75.75,198.26-76.06,438.99-297.26,412.94Z" fill="#ffffff" fill-rule="evenodd"/>
996
+ <path
997
+ d="M 200,866 C 100,866 50,779.4 100,692.8 L 200,519.6 C 220,485 240,490 265,499.6 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
998
+ fill="url(#LinearGradient)" fill-rule="nonzero" opacity="1" stroke="none" />
999
+ <path
1000
+ d="M 420,866 C 455,861 478,846 500,827 C 614,696 615,597 500,517 C 394,444 333,374 380,207.82 L 260,415.67 C 240.22,450 254.37,465.1 275.28,481.79 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
1001
+ fill="url(#LinearGradient_2)" fill-rule="nonzero" opacity="1" stroke="none" />
1002
+ <path d="M 500,517 C 394,444 333,374 380,207.82 L 400,173.2 C 367,295 421,350 603,428 C 572,440 524,474 500,517"
1003
+ fill="url(#LinearGradient_3)" fill-rule="nonzero" opacity="1" stroke="none" />
1004
+ <path d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 572,440 524,474 500,517 C 615,597 614,696 500,827"
1005
+ fill="url(#LinearGradient_4)" fill-rule="nonzero" opacity="1" stroke="none" />
1006
+ <path d="M 400,173.2 C 367,295 421,350 603,428 C 690,389, 750,445 788,500 L 600,173.2 C 550,86.6 450,86.6 400,173.2"
1007
+ fill="url(#LinearGradient_5)" fill-rule="nonzero" opacity="1" stroke="none" />
1008
+ <path
1009
+ d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 690,389, 750,445 788,500 C 816,554 797,606 750,640 L 500,827"
1010
+ fill="url(#LinearGradient_6)" fill-rule="nonzero" opacity="1" stroke="none" />
1011
+ <path
1012
+ d="M 788,500 C 816,554 797,606 750,640 L 500,827 C 497,851 513,862 540,866 L 800,866 C 900,866 950,779.4 900,692.8 L 788,500"
1013
+ fill="url(#LinearGradient_7)" fill-rule="nonzero" opacity="1" stroke="none" />
1014
+
1015
+ <!--左下角图案-->
1016
+ <g transform="translate(130, 675) scale(7)">
1017
+ <g viewBox="0 0 24 24">
1018
+ <path fill="#ffffff" d="M4.528 5.118a1 1 0 0 1 1.027.05l5.554 3.703A2 2 0 0 1 12 10.535V21a1 1 0 0 1-1.555.832l-5.554-3.703A2 2 0 0 1 4 16.465V6a1 1 0 0 1 .528-.882m4-2a1 1 0 0 1 1.027.05l5.554 3.703A2 2 0 0 1 16 8.535V19a1 1 0 0 1-1.555.832l-.945-.63v-8.667a3.5 3.5 0 0 0-1.559-2.912L8 4.995V4a1 1 0 0 1 .528-.882m4-2a1 1 0 0 1 1.027.05l5.554 3.703A2 2 0 0 1 20 6.535V17a1 1 0 0 1-1.555.832l-.945-.63V8.534a3.5 3.5 0 0 0-1.559-2.912L12 2.995V2a1 1 0 0 1 .528-.882" />
1019
+
1005
1020
  </g>
1006
1021
  </g>
1022
+ </g>
1007
1023
  <defs>
1008
- <linearGradient gradientTransform="matrix(104.391 -73.3432 73.3432 104.391 277.441 710.122)" gradientUnits="userSpaceOnUse" id="LinearGradient" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#373ebf" /><stop offset="1" stop-color="#5058e6" /></linearGradient>
1009
- <linearGradient gradientTransform="matrix(-173.747 557.324 -557.324 -173.747 508.829 258.172)" gradientUnits="userSpaceOnUse" id="LinearGradient_2" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#c2d6ff" /><stop offset="1" stop-color="#646cff" /></linearGradient>
1010
- <linearGradient gradientTransform="matrix(157.951 295.666 -295.666 157.951 382.944 193.642)" gradientUnits="userSpaceOnUse" id="LinearGradient_3" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#5058e6" /><stop offset="1" stop-color="#373ebf" /></linearGradient>
1011
- <linearGradient gradientTransform="matrix(-44.3023 219.578 -219.578 -44.3023 619.69 469.652)" gradientUnits="userSpaceOnUse" id="LinearGradient_4" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#91a7ff" /><stop offset="1" stop-color="#5058e6" /></linearGradient>
1012
- <linearGradient gradientTransform="matrix(125.52 334.256 -334.256 125.52 539.723 235.139)" gradientUnits="userSpaceOnUse" id="LinearGradient_5" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#646cff" /><stop offset="1" stop-color="#c2d6ff" /></linearGradient>
1013
- <linearGradient gradientTransform="matrix(-241.23 357.206 -357.206 -241.23 754.054 449.312)" gradientUnits="userSpaceOnUse" id="LinearGradient_6" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#c2d6ff" /><stop offset="1" stop-color="#646cff" /></linearGradient>
1014
- <linearGradient gradientTransform="matrix(125.978 210.065 -210.065 125.978 596.433 613.665)" gradientUnits="userSpaceOnUse" id="LinearGradient_7" x1="0" x2="1" y1="0" y2="0"><stop offset="0" stop-color="#373ebf" /><stop offset="1" stop-color="#5058e6" /></linearGradient>
1024
+ <linearGradient gradientTransform="matrix(104.391 -73.3432 73.3432 104.391 277.441 710.122)"
1025
+ gradientUnits="userSpaceOnUse" id="LinearGradient" x1="0" x2="1" y1="0" y2="0">
1026
+ <stop offset="0" stop-color="#30a772" />
1027
+ <stop offset="1" stop-color="#30e191" />
1028
+ </linearGradient>
1029
+ <linearGradient gradientTransform="matrix(-173.747 557.324 -557.324 -173.747 508.829 258.172)"
1030
+ gradientUnits="userSpaceOnUse" id="LinearGradient_2" x1="0" x2="1" y1="0" y2="0">
1031
+ <stop offset="0" stop-color="#98f6cc" />
1032
+ <stop offset="1" stop-color="#4aefa5" />
1033
+ </linearGradient>
1034
+ <linearGradient gradientTransform="matrix(157.951 295.666 -295.666 157.951 382.944 193.642)"
1035
+ gradientUnits="userSpaceOnUse" id="LinearGradient_3" x1="0" x2="1" y1="0" y2="0">
1036
+ <stop offset="0" stop-color="#30e191" />
1037
+ <stop offset="1" stop-color="#30a772" />
1038
+ </linearGradient>
1039
+ <linearGradient gradientTransform="matrix(-44.3023 219.578 -219.578 -44.3023 619.69 469.652)"
1040
+ gradientUnits="userSpaceOnUse" id="LinearGradient_4" x1="0" x2="1" y1="0" y2="0">
1041
+ <stop offset="0" stop-color="#6ff3b7" />
1042
+ <stop offset="1" stop-color="#30e191" />
1043
+ </linearGradient>
1044
+ <linearGradient gradientTransform="matrix(125.52 334.256 -334.256 125.52 539.723 235.139)"
1045
+ gradientUnits="userSpaceOnUse" id="LinearGradient_5" x1="0" x2="1" y1="0" y2="0">
1046
+ <stop offset="0" stop-color="#4aefa5" />
1047
+ <stop offset="1" stop-color="#98f6cc" />
1048
+ </linearGradient>
1049
+ <linearGradient gradientTransform="matrix(-241.23 357.206 -357.206 -241.23 754.054 449.312)"
1050
+ gradientUnits="userSpaceOnUse" id="LinearGradient_6" x1="0" x2="1" y1="0" y2="0">
1051
+ <stop offset="0" stop-color="#98f6cc" />
1052
+ <stop offset="1" stop-color="#4aefa5" />
1053
+ </linearGradient>
1054
+ <linearGradient gradientTransform="matrix(125.978 210.065 -210.065 125.978 596.433 613.665)"
1055
+ gradientUnits="userSpaceOnUse" id="LinearGradient_7" x1="0" x2="1" y1="0" y2="0">
1056
+ <stop offset="0" stop-color="#30a772" />
1057
+ <stop offset="1" stop-color="#30e191" />
1058
+ </linearGradient>
1015
1059
  </defs>
1016
1060
  </svg>
1017
1061
  `;
@@ -1255,7 +1299,7 @@ async function scaffoldBlogTemplate(fs, options) {
1255
1299
  }
1256
1300
  //#endregion
1257
1301
  //#region src/page.ts
1258
- const logger = consola.withTag("ubean-cli");
1302
+ const logger = getLogger("cli");
1259
1303
  function getSrcDir(cwd) {
1260
1304
  return join(cwd, "src");
1261
1305
  }
@@ -1326,7 +1370,7 @@ function getTemplateContent(type, name, path, method, schedule) {
1326
1370
  });
1327
1371
  case "reuse": return `import { definePage } from 'ubean';
1328
1372
 
1329
- export default definePage({
1373
+ definePage({
1330
1374
  name: '${name}'
1331
1375
  });
1332
1376
  `;
@@ -1532,7 +1576,7 @@ const pageCommand = {
1532
1576
  force: args.force,
1533
1577
  dry: args.dry
1534
1578
  });
1535
- for (const file of result.created) logger.success(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
1579
+ for (const file of result.created) logger.info(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
1536
1580
  for (const file of result.skipped) logger.warn(`Skipped ${file} (already exists, use --force to overwrite)`);
1537
1581
  for (const err of result.errors) logger.error(err);
1538
1582
  }
@@ -1567,7 +1611,7 @@ const pageCommand = {
1567
1611
  force: args.force,
1568
1612
  dry: args.dry
1569
1613
  });
1570
- for (const file of result.created) logger.success(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
1614
+ for (const file of result.created) logger.info(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
1571
1615
  for (const file of result.skipped) logger.warn(`Skipped ${file} (already exists, use --force to overwrite)`);
1572
1616
  for (const err of result.errors) logger.error(err);
1573
1617
  }
@@ -1612,7 +1656,7 @@ const pageCommand = {
1612
1656
  force: args.force,
1613
1657
  dry: args.dry
1614
1658
  });
1615
- for (const file of result.deleted) logger.success(`${args.dry ? "[dry-run] Would delete" : args.force ? "Deleted" : "Deleted (backup created)"} ${file}`);
1659
+ for (const file of result.deleted) logger.info(`${args.dry ? "[dry-run] Would delete" : args.force ? "Deleted" : "Deleted (backup created)"} ${file}`);
1616
1660
  for (const err of result.errors) logger.error(err);
1617
1661
  }
1618
1662
  },
@@ -1649,7 +1693,7 @@ const pageCommand = {
1649
1693
  path: args.path,
1650
1694
  dry: args.dry
1651
1695
  });
1652
- for (const file of result.restored) logger.success(`${args.dry ? "[dry-run] Backup exists for" : "Recovered"} ${file}`);
1696
+ for (const file of result.restored) logger.info(`${args.dry ? "[dry-run] Backup exists for" : "Recovered"} ${file}`);
1653
1697
  for (const err of result.errors) logger.error(err);
1654
1698
  }
1655
1699
  },
@@ -1671,7 +1715,7 @@ const pageCommand = {
1671
1715
  return;
1672
1716
  }
1673
1717
  logger.info(`Found ${files.length} ${type}(s):`);
1674
- for (const file of files) logger.log(` ${file}`);
1718
+ for (const file of files) logger.info(` ${file}`);
1675
1719
  }
1676
1720
  }
1677
1721
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ubean/cli",
3
- "version": "0.1.12",
3
+ "version": "0.2.0",
4
4
  "description": "CLI for ubean (ubean-next binary: dev, build, prepare, init, preview, page, env, config, devtools, api/layout/middleware/cron/plugin scaffolds)",
5
5
  "bin": {
6
6
  "ubean-next": "./bin/ubean-next.mjs"
@@ -25,27 +25,27 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "citty": "^0.2.2",
28
- "consola": "^3.4.2",
29
28
  "kolorist": "^1.8.0",
30
29
  "pathe": "^2.0.3",
31
- "@ubean/app": "0.1.12",
32
- "@ubean/codegen": "0.1.12",
33
- "@ubean/config": "0.1.12",
34
- "@ubean/prerender": "0.1.12",
35
- "@ubean/dev-server": "0.1.12",
36
- "@ubean/modules": "0.1.12",
37
- "@ubean/preset": "0.1.12",
38
- "@ubean/build": "0.1.12",
39
- "@ubean/utils": "0.1.12",
40
- "@ubean/routing": "0.1.12"
30
+ "@ubean/app": "0.2.0",
31
+ "@ubean/build": "0.2.0",
32
+ "@ubean/codegen": "0.2.0",
33
+ "@ubean/config": "0.2.0",
34
+ "@ubean/modules": "0.2.0",
35
+ "@ubean/logger": "0.2.0",
36
+ "@ubean/prerender": "0.2.0",
37
+ "@ubean/preset": "0.2.0",
38
+ "@ubean/dev-server": "0.2.0",
39
+ "@ubean/scan": "0.2.0",
40
+ "@ubean/shared": "0.2.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/node": "^26.1.2",
43
+ "@types/node": "^26.2.0",
44
44
  "typescript": "7.0.2",
45
- "vite-plus": "0.2.6"
45
+ "vite-plus": "0.2.9"
46
46
  },
47
47
  "peerDependencies": {
48
- "@ubean/devtools": "0.1.12"
48
+ "@ubean/devtools": "0.2.0"
49
49
  },
50
50
  "peerDependenciesMeta": {
51
51
  "@ubean/devtools": {