@ubean/cli 0.1.13 → 0.2.1
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 +115 -91
- package/dist/index.js +1 -1
- package/dist/{page-VyP_7yLT.js → page-D-LZUcPP.js} +69 -25
- package/package.json +15 -15
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-
|
|
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 {
|
|
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/
|
|
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/
|
|
21
|
+
import { findAvailablePort, waitForPort } from "@ubean/shared/node";
|
|
22
22
|
//#region src/config.ts
|
|
23
|
-
const logger$8 =
|
|
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
|
|
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.
|
|
112
|
-
logger$8.
|
|
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.
|
|
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
|
|
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.
|
|
134
|
+
logger$8.info("");
|
|
133
135
|
const content = await fs.readFile(configFile);
|
|
134
|
-
logger$8.
|
|
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.
|
|
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
|
|
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.
|
|
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 =
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
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 =
|
|
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.
|
|
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;
|
|
@@ -457,9 +464,9 @@ const devCommand = {
|
|
|
457
464
|
];
|
|
458
465
|
if (config.devtools.enabled) lines.push(` → ${label("DevTools:")} ${cyan(`${url}${config.devtools.route}`)}`);
|
|
459
466
|
lines.push(` → ${dim("Press Ctrl+C to stop")}`);
|
|
460
|
-
logger$6.
|
|
467
|
+
logger$6.info(lines.join("\n"));
|
|
461
468
|
generateOpenApiTypesFromServer(url, { outDir: resolve$1(cwd, ".ubean") }).then((filePath) => {
|
|
462
|
-
logger$6.
|
|
469
|
+
logger$6.info(`OpenAPI types generated: ${filePath}`);
|
|
463
470
|
}).catch((err) => {
|
|
464
471
|
logger$6.warn(`Failed to generate OpenAPI types: ${err instanceof Error ? err.message : String(err)}`);
|
|
465
472
|
});
|
|
@@ -468,7 +475,7 @@ const devCommand = {
|
|
|
468
475
|
logger$6.info("Reloading...");
|
|
469
476
|
},
|
|
470
477
|
onAfterReload() {
|
|
471
|
-
logger$6.
|
|
478
|
+
logger$6.info("Reloaded");
|
|
472
479
|
}
|
|
473
480
|
});
|
|
474
481
|
try {
|
|
@@ -548,10 +555,11 @@ async function buildApp(cwd, config) {
|
|
|
548
555
|
},
|
|
549
556
|
i18nConfig: config.i18n,
|
|
550
557
|
ssrExclude: config.ssr.exclude,
|
|
558
|
+
streaming: config.ssr.streaming,
|
|
551
559
|
notFoundPage: result.notFoundPage
|
|
552
560
|
});
|
|
553
561
|
app.hooks.hook("request:start", (c) => {
|
|
554
|
-
logger$6.
|
|
562
|
+
logger$6.info(`${c.req.method} ${c.req.path}`);
|
|
555
563
|
});
|
|
556
564
|
return {
|
|
557
565
|
app,
|
|
@@ -561,7 +569,7 @@ async function buildApp(cwd, config) {
|
|
|
561
569
|
}
|
|
562
570
|
//#endregion
|
|
563
571
|
//#region src/devtools.ts
|
|
564
|
-
const logger$5 =
|
|
572
|
+
const logger$5 = getLogger("cli");
|
|
565
573
|
const devtoolsCommand = {
|
|
566
574
|
meta: {
|
|
567
575
|
name: "devtools",
|
|
@@ -575,27 +583,27 @@ const devtoolsCommand = {
|
|
|
575
583
|
},
|
|
576
584
|
async run() {
|
|
577
585
|
logger$5.info("DevTools Information");
|
|
578
|
-
logger$5.
|
|
579
|
-
logger$5.
|
|
580
|
-
logger$5.
|
|
581
|
-
logger$5.
|
|
582
|
-
logger$5.
|
|
583
|
-
logger$5.
|
|
584
|
-
logger$5.
|
|
585
|
-
logger$5.
|
|
586
|
-
logger$5.
|
|
587
|
-
logger$5.
|
|
588
|
-
logger$5.
|
|
589
|
-
logger$5.
|
|
590
|
-
logger$5.
|
|
591
|
-
logger$5.
|
|
592
|
-
logger$5.
|
|
593
|
-
logger$5.
|
|
594
|
-
logger$5.
|
|
595
|
-
logger$5.
|
|
596
|
-
logger$5.
|
|
597
|
-
logger$5.
|
|
598
|
-
logger$5.
|
|
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");
|
|
599
607
|
}
|
|
600
608
|
},
|
|
601
609
|
path: {
|
|
@@ -610,14 +618,14 @@ const devtoolsCommand = {
|
|
|
610
618
|
} },
|
|
611
619
|
async run({ args }) {
|
|
612
620
|
const port = args.port;
|
|
613
|
-
logger$5.
|
|
621
|
+
logger$5.info(`http://localhost:${port}/__ubean/devtools/`);
|
|
614
622
|
}
|
|
615
623
|
}
|
|
616
624
|
}
|
|
617
625
|
};
|
|
618
626
|
//#endregion
|
|
619
627
|
//#region src/env.ts
|
|
620
|
-
const logger$4 =
|
|
628
|
+
const logger$4 = getLogger("cli");
|
|
621
629
|
function parseEnvContent(content) {
|
|
622
630
|
const vars = [];
|
|
623
631
|
const lines = content.split("\n");
|
|
@@ -697,7 +705,8 @@ const envCommand = {
|
|
|
697
705
|
}
|
|
698
706
|
},
|
|
699
707
|
async run({ args }) {
|
|
700
|
-
const
|
|
708
|
+
const cwd = process.cwd();
|
|
709
|
+
const fs = createFsOps(cwd);
|
|
701
710
|
const file = args.file;
|
|
702
711
|
let key = args.key;
|
|
703
712
|
const value = args.value;
|
|
@@ -716,8 +725,8 @@ const envCommand = {
|
|
|
716
725
|
public: key.startsWith("UBEAN_PUBLIC_") || key.startsWith("VITE_")
|
|
717
726
|
});
|
|
718
727
|
await writeEnvFile(fs, file, vars, args.dry);
|
|
719
|
-
if (args.dry) logger$4.
|
|
720
|
-
else logger$4.
|
|
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}`);
|
|
721
730
|
if (key.startsWith("UBEAN_PUBLIC_") || key.startsWith("VITE_") || key.startsWith("PUBLIC_")) logger$4.info(` Note: ${key} is exposed to client-side code`);
|
|
722
731
|
}
|
|
723
732
|
},
|
|
@@ -743,7 +752,8 @@ const envCommand = {
|
|
|
743
752
|
}
|
|
744
753
|
},
|
|
745
754
|
async run({ args }) {
|
|
746
|
-
const
|
|
755
|
+
const cwd = process.cwd();
|
|
756
|
+
const fs = createFsOps(cwd);
|
|
747
757
|
const file = args.file;
|
|
748
758
|
const key = args.key;
|
|
749
759
|
const vars = await readEnvFile(fs, file);
|
|
@@ -753,10 +763,10 @@ const envCommand = {
|
|
|
753
763
|
return;
|
|
754
764
|
}
|
|
755
765
|
vars.splice(index, 1);
|
|
756
|
-
if (args.dry) logger$4.
|
|
766
|
+
if (args.dry) logger$4.info(`[dry-run] Would remove ${key} from ${file}`);
|
|
757
767
|
else {
|
|
758
768
|
await writeEnvFile(fs, file, vars);
|
|
759
|
-
logger$4.
|
|
769
|
+
logger$4.info(`Removed ${key} from ${file}`);
|
|
760
770
|
}
|
|
761
771
|
}
|
|
762
772
|
},
|
|
@@ -778,7 +788,8 @@ const envCommand = {
|
|
|
778
788
|
}
|
|
779
789
|
},
|
|
780
790
|
async run({ args }) {
|
|
781
|
-
const
|
|
791
|
+
const cwd = process.cwd();
|
|
792
|
+
const fs = createFsOps(cwd);
|
|
782
793
|
const file = args.file;
|
|
783
794
|
if (!await fs.exists(file)) {
|
|
784
795
|
logger$4.info(`${file} does not exist`);
|
|
@@ -793,7 +804,7 @@ const envCommand = {
|
|
|
793
804
|
logger$4.info(`Variables in ${file} (${filtered.length}):`);
|
|
794
805
|
for (const v of filtered) {
|
|
795
806
|
const suffix = v.public ? " [public]" : "";
|
|
796
|
-
logger$4.
|
|
807
|
+
logger$4.info(` ${v.key}=${v.value}${suffix}`);
|
|
797
808
|
}
|
|
798
809
|
const publicCount = vars.filter((v) => v.public).length;
|
|
799
810
|
const privateCount = vars.length - publicCount;
|
|
@@ -819,7 +830,8 @@ const envCommand = {
|
|
|
819
830
|
}
|
|
820
831
|
},
|
|
821
832
|
async run({ args }) {
|
|
822
|
-
const
|
|
833
|
+
const cwd = process.cwd();
|
|
834
|
+
const fs = createFsOps(cwd);
|
|
823
835
|
for (const [file, content] of [[".env", `# ubean environment variables
|
|
824
836
|
# Server-only variables (never exposed to client)
|
|
825
837
|
DATABASE_URL=
|
|
@@ -836,10 +848,10 @@ SESSION_SECRET=your-session-secret
|
|
|
836
848
|
logger$4.warn(`Skipping ${file} (already exists, use --force to overwrite)`);
|
|
837
849
|
continue;
|
|
838
850
|
}
|
|
839
|
-
if (args.dry) logger$4.
|
|
851
|
+
if (args.dry) logger$4.info(`[dry-run] Would create ${file}`);
|
|
840
852
|
else {
|
|
841
853
|
await fs.writeFile(file, content);
|
|
842
|
-
logger$4.
|
|
854
|
+
logger$4.info(`Created ${file}`);
|
|
843
855
|
}
|
|
844
856
|
}
|
|
845
857
|
logger$4.info("\nTip: Add .env to .gitignore (but commit .env.example)");
|
|
@@ -849,7 +861,7 @@ SESSION_SECRET=your-session-secret
|
|
|
849
861
|
};
|
|
850
862
|
//#endregion
|
|
851
863
|
//#region src/init.ts
|
|
852
|
-
const logger$3 =
|
|
864
|
+
const logger$3 = getLogger("cli");
|
|
853
865
|
const TEMPLATES = [
|
|
854
866
|
{
|
|
855
867
|
value: "unify",
|
|
@@ -972,9 +984,7 @@ async function scaffoldProject(options) {
|
|
|
972
984
|
case "blog":
|
|
973
985
|
await scaffoldBlogTemplate(fs, templateOptions);
|
|
974
986
|
break;
|
|
975
|
-
default:
|
|
976
|
-
await scaffoldStarterTemplate(fs, templateOptions);
|
|
977
|
-
break;
|
|
987
|
+
default: await scaffoldStarterTemplate(fs, templateOptions);
|
|
978
988
|
}
|
|
979
989
|
if (options.git) try {
|
|
980
990
|
const { execSync } = await import("node:child_process");
|
|
@@ -1072,7 +1082,7 @@ const initCommand = {
|
|
|
1072
1082
|
};
|
|
1073
1083
|
//#endregion
|
|
1074
1084
|
//#region src/prepare.ts
|
|
1075
|
-
const logger$2 =
|
|
1085
|
+
const logger$2 = getLogger("cli");
|
|
1076
1086
|
async function ensureBuildDir(cwd, buildDir) {
|
|
1077
1087
|
const fullPath = join$1(cwd, buildDir);
|
|
1078
1088
|
if (!existsSync(fullPath)) mkdirSync(fullPath, { recursive: true });
|
|
@@ -1080,6 +1090,8 @@ async function ensureBuildDir(cwd, buildDir) {
|
|
|
1080
1090
|
/**
|
|
1081
1091
|
* Detects the package manager used in the project by inspecting lockfiles.
|
|
1082
1092
|
* Priority: pnpm > yarn > bun > npm (npm as default fallback).
|
|
1093
|
+
*
|
|
1094
|
+
* 导出供单测复用(OPT-04 4c)。
|
|
1083
1095
|
*/
|
|
1084
1096
|
function detectPackageManager(cwd) {
|
|
1085
1097
|
if (existsSync(join$1(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
@@ -1090,8 +1102,10 @@ function detectPackageManager(cwd) {
|
|
|
1090
1102
|
/**
|
|
1091
1103
|
* Builds the install command args for a given package manager and package list.
|
|
1092
1104
|
* Examples:
|
|
1093
|
-
* pnpm → ['add', '@ubean/
|
|
1094
|
-
* npm → ['install', '@ubean/
|
|
1105
|
+
* pnpm → ['add', '@ubean/integrations@^0.1.3']
|
|
1106
|
+
* npm → ['install', '@ubean/integrations@^0.1.3']
|
|
1107
|
+
*
|
|
1108
|
+
* 导出供单测复用(OPT-04 4c)。
|
|
1095
1109
|
*/
|
|
1096
1110
|
function buildInstallCommand(pm, packages) {
|
|
1097
1111
|
switch (pm) {
|
|
@@ -1115,8 +1129,10 @@ function buildInstallCommand(pm, packages) {
|
|
|
1115
1129
|
}
|
|
1116
1130
|
/**
|
|
1117
1131
|
* Extracts the bare package name from a module path.
|
|
1118
|
-
* '@ubean/
|
|
1119
|
-
* '@ubean/
|
|
1132
|
+
* '@ubean/integrations/pwa' → '@ubean/integrations'
|
|
1133
|
+
* '@ubean/icon/vite' → '@ubean/icon'
|
|
1134
|
+
*
|
|
1135
|
+
* 导出供单测复用(OPT-04 4c)。
|
|
1120
1136
|
*/
|
|
1121
1137
|
function extractPackageName(modulePath) {
|
|
1122
1138
|
if (modulePath.startsWith("@")) return modulePath.split("/").slice(0, 2).join("/");
|
|
@@ -1126,6 +1142,8 @@ function extractPackageName(modulePath) {
|
|
|
1126
1142
|
* Reads the `ubean` package version from the project's package.json so we can
|
|
1127
1143
|
* install matching versions of `@ubean/*` extension packages.
|
|
1128
1144
|
* Returns `null` if ubean isn't declared or version can't be parsed.
|
|
1145
|
+
*
|
|
1146
|
+
* 导出供单测复用(OPT-04 4c)。
|
|
1129
1147
|
*/
|
|
1130
1148
|
function getUbeanVersion(cwd) {
|
|
1131
1149
|
try {
|
|
@@ -1197,7 +1215,7 @@ async function ensureBuiltinModules(cwd, config, autoInstall) {
|
|
|
1197
1215
|
stdio: "inherit",
|
|
1198
1216
|
env: { ...process.env }
|
|
1199
1217
|
});
|
|
1200
|
-
logger$2.
|
|
1218
|
+
logger$2.info(`Installed: ${packagesToInstall.join(", ")}`);
|
|
1201
1219
|
} catch (err) {
|
|
1202
1220
|
logger$2.error(`Failed to auto-install packages: ${err instanceof Error ? err.message : String(err)}`);
|
|
1203
1221
|
for (const m of missing) {
|
|
@@ -1225,7 +1243,7 @@ const prepareCommand = {
|
|
|
1225
1243
|
},
|
|
1226
1244
|
async run({ args }) {
|
|
1227
1245
|
const cwd = resolve$1(args.cwd || process.cwd());
|
|
1228
|
-
logger$2.
|
|
1246
|
+
logger$2.info(`Preparing ubean project at ${cwd}...`);
|
|
1229
1247
|
const config = await loadUbeanConfig(cwd);
|
|
1230
1248
|
await ensureBuiltinModules(cwd, config, args.install !== false);
|
|
1231
1249
|
const typesDir = ".ubean";
|
|
@@ -1249,8 +1267,8 @@ const prepareCommand = {
|
|
|
1249
1267
|
composablesDirs: config.imports.dirs,
|
|
1250
1268
|
componentsDirs: config.components.dirs
|
|
1251
1269
|
});
|
|
1252
|
-
for (const file of codegenResult.generated) logger$2.
|
|
1253
|
-
logger$2.
|
|
1270
|
+
for (const file of codegenResult.generated) logger$2.info(`Generated ${file.replace(`${cwd}/`, "")}`);
|
|
1271
|
+
logger$2.info("Prepare complete!");
|
|
1254
1272
|
}
|
|
1255
1273
|
};
|
|
1256
1274
|
//#endregion
|
|
@@ -1346,7 +1364,7 @@ function startStaticServer(opts) {
|
|
|
1346
1364
|
}
|
|
1347
1365
|
}).listen(port, host);
|
|
1348
1366
|
}
|
|
1349
|
-
const logger$1 =
|
|
1367
|
+
const logger$1 = getLogger("cli");
|
|
1350
1368
|
const previewCommand = {
|
|
1351
1369
|
meta: {
|
|
1352
1370
|
name: "preview",
|
|
@@ -1374,7 +1392,7 @@ const previewCommand = {
|
|
|
1374
1392
|
},
|
|
1375
1393
|
async run({ args }) {
|
|
1376
1394
|
const cwd = resolve$1(args.cwd || process.cwd());
|
|
1377
|
-
logger$1.
|
|
1395
|
+
logger$1.info("Starting ubean preview server...");
|
|
1378
1396
|
registerBuiltinPresets();
|
|
1379
1397
|
const config = await loadUbeanConfig(cwd);
|
|
1380
1398
|
const preset = resolvePresetByName(config.build.preset);
|
|
@@ -1399,7 +1417,7 @@ const previewCommand = {
|
|
|
1399
1417
|
const label = (text) => dim(text);
|
|
1400
1418
|
const printBanner = (port, modeLabel) => {
|
|
1401
1419
|
const bannerUrl = `http://${host}:${port}`;
|
|
1402
|
-
logger$1.
|
|
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")}`);
|
|
1403
1421
|
};
|
|
1404
1422
|
if (mode === "spa" || mode === "ssg") {
|
|
1405
1423
|
const staticRoot = join$1(cwd, outputDir, "public");
|
|
@@ -1507,7 +1525,7 @@ function spawnPreviewServer(opts) {
|
|
|
1507
1525
|
}
|
|
1508
1526
|
//#endregion
|
|
1509
1527
|
//#region src/scaffold-commands.ts
|
|
1510
|
-
const logger =
|
|
1528
|
+
const logger = getLogger("cli");
|
|
1511
1529
|
const COMMAND_META = {
|
|
1512
1530
|
api: {
|
|
1513
1531
|
name: "api",
|
|
@@ -1590,7 +1608,7 @@ function createScaffoldCommand(type) {
|
|
|
1590
1608
|
force: args.force,
|
|
1591
1609
|
dry: args.dry
|
|
1592
1610
|
});
|
|
1593
|
-
for (const file of result.created) logger.
|
|
1611
|
+
for (const file of result.created) logger.info(`${args.dry ? "[dry-run] Would create" : "Created"} ${file}`);
|
|
1594
1612
|
for (const file of result.skipped) logger.warn(`Skipped ${file} (already exists, use --force to overwrite)`);
|
|
1595
1613
|
for (const err of result.errors) logger.error(err);
|
|
1596
1614
|
}
|
|
@@ -1625,7 +1643,7 @@ function createScaffoldCommand(type) {
|
|
|
1625
1643
|
force: args.force,
|
|
1626
1644
|
dry: args.dry
|
|
1627
1645
|
});
|
|
1628
|
-
for (const file of result.deleted) logger.
|
|
1646
|
+
for (const file of result.deleted) logger.info(`${args.dry ? "[dry-run] Would delete" : args.force ? "Deleted" : "Deleted (backup created)"} ${file}`);
|
|
1629
1647
|
for (const err of result.errors) logger.error(err);
|
|
1630
1648
|
}
|
|
1631
1649
|
},
|
|
@@ -1652,7 +1670,7 @@ function createScaffoldCommand(type) {
|
|
|
1652
1670
|
path: args.path,
|
|
1653
1671
|
dry: args.dry
|
|
1654
1672
|
});
|
|
1655
|
-
for (const file of result.restored) logger.
|
|
1673
|
+
for (const file of result.restored) logger.info(`${args.dry ? "[dry-run] Backup exists for" : "Recovered"} ${file}`);
|
|
1656
1674
|
for (const err of result.errors) logger.error(err);
|
|
1657
1675
|
}
|
|
1658
1676
|
},
|
|
@@ -1668,12 +1686,17 @@ function createScaffoldCommand(type) {
|
|
|
1668
1686
|
return;
|
|
1669
1687
|
}
|
|
1670
1688
|
logger.info(`Found ${files.length} ${type}(s):`);
|
|
1671
|
-
for (const file of files) logger.
|
|
1689
|
+
for (const file of files) logger.info(` ${file}`);
|
|
1672
1690
|
}
|
|
1673
1691
|
}
|
|
1674
1692
|
}
|
|
1675
1693
|
};
|
|
1676
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");
|
|
1677
1700
|
//#endregion
|
|
1678
1701
|
//#region src/cli.ts
|
|
1679
1702
|
/**
|
|
@@ -1684,7 +1707,7 @@ function createScaffoldCommand(type) {
|
|
|
1684
1707
|
*
|
|
1685
1708
|
* 库代码请从 `@ubean/cli`(主入口)导入 scaffold / fs-ops / templates。
|
|
1686
1709
|
*/
|
|
1687
|
-
|
|
1710
|
+
const main = defineCommand({
|
|
1688
1711
|
meta: {
|
|
1689
1712
|
name: "ubean",
|
|
1690
1713
|
version: "0.0.1",
|
|
@@ -1700,12 +1723,13 @@ runMain(defineCommand({
|
|
|
1700
1723
|
env: envCommand,
|
|
1701
1724
|
config: configCommand,
|
|
1702
1725
|
devtools: devtoolsCommand,
|
|
1703
|
-
api:
|
|
1704
|
-
layout:
|
|
1705
|
-
middleware:
|
|
1706
|
-
cron:
|
|
1707
|
-
plugin:
|
|
1726
|
+
api: apiCommand,
|
|
1727
|
+
layout: layoutCommand,
|
|
1728
|
+
middleware: middlewareCommand,
|
|
1729
|
+
cron: cronCommand,
|
|
1730
|
+
plugin: pluginCommand
|
|
1708
1731
|
}
|
|
1709
|
-
})
|
|
1732
|
+
});
|
|
1733
|
+
runMain(main);
|
|
1710
1734
|
//#endregion
|
|
1711
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-
|
|
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 {
|
|
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
|
-
|
|
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
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
<path
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
<path d="M
|
|
1003
|
-
|
|
1004
|
-
|
|
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)"
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
<linearGradient gradientTransform="matrix(-
|
|
1014
|
-
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
3
|
+
"version": "0.2.1",
|
|
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
|
|
32
|
-
"@ubean/build": "0.1
|
|
33
|
-
"@ubean/codegen": "0.1
|
|
34
|
-
"@ubean/
|
|
35
|
-
"@ubean/
|
|
36
|
-
"@ubean/
|
|
37
|
-
"@ubean/
|
|
38
|
-
"@ubean/
|
|
39
|
-
"@ubean/
|
|
40
|
-
"@ubean/
|
|
30
|
+
"@ubean/app": "0.2.1",
|
|
31
|
+
"@ubean/build": "0.2.1",
|
|
32
|
+
"@ubean/codegen": "0.2.1",
|
|
33
|
+
"@ubean/config": "0.2.1",
|
|
34
|
+
"@ubean/dev-server": "0.2.1",
|
|
35
|
+
"@ubean/logger": "0.2.1",
|
|
36
|
+
"@ubean/preset": "0.2.1",
|
|
37
|
+
"@ubean/prerender": "0.2.1",
|
|
38
|
+
"@ubean/scan": "0.2.1",
|
|
39
|
+
"@ubean/shared": "0.2.1",
|
|
40
|
+
"@ubean/modules": "0.2.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/node": "^26.
|
|
43
|
+
"@types/node": "^26.2.0",
|
|
44
44
|
"typescript": "7.0.2",
|
|
45
|
-
"vite-plus": "0.2.
|
|
45
|
+
"vite-plus": "0.2.9"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
|
-
"@ubean/devtools": "0.1
|
|
48
|
+
"@ubean/devtools": "0.2.1"
|
|
49
49
|
},
|
|
50
50
|
"peerDependenciesMeta": {
|
|
51
51
|
"@ubean/devtools": {
|