@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 +119 -92
- 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;
|
|
@@ -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.
|
|
467
|
+
logger$6.info(lines.join("\n"));
|
|
460
468
|
generateOpenApiTypesFromServer(url, { outDir: resolve$1(cwd, ".ubean") }).then((filePath) => {
|
|
461
|
-
logger$6.
|
|
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
576
|
-
logger$5.
|
|
577
|
-
logger$5.
|
|
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.
|
|
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.
|
|
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 =
|
|
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
|
|
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.
|
|
717
|
-
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}`);
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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 =
|
|
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 =
|
|
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/
|
|
1091
|
-
* npm → ['install', '@ubean/
|
|
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/
|
|
1116
|
-
* '@ubean/
|
|
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.
|
|
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.
|
|
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.
|
|
1250
|
-
logger$2.
|
|
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 =
|
|
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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:
|
|
1701
|
-
layout:
|
|
1702
|
-
middleware:
|
|
1703
|
-
cron:
|
|
1704
|
-
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-
|
|
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.
|
|
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.
|
|
32
|
-
"@ubean/
|
|
33
|
-
"@ubean/
|
|
34
|
-
"@ubean/
|
|
35
|
-
"@ubean/
|
|
36
|
-
"@ubean/
|
|
37
|
-
"@ubean/
|
|
38
|
-
"@ubean/
|
|
39
|
-
"@ubean/
|
|
40
|
-
"@ubean/
|
|
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.
|
|
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.
|
|
48
|
+
"@ubean/devtools": "0.2.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependenciesMeta": {
|
|
51
51
|
"@ubean/devtools": {
|