@vobs/cli 0.3.0 → 1.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/LICENSE +1 -1
- package/README.md +116 -0
- package/bin/vobs.js +12 -0
- package/dist/banner.cjs +37 -0
- package/dist/banner.cjs.map +1 -0
- package/dist/banner.d.cts +18 -0
- package/dist/banner.d.ts +18 -0
- package/dist/banner.js +33 -0
- package/dist/banner.js.map +1 -0
- package/dist/cli.cjs +416 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +5 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +389 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.cjs +113 -0
- package/dist/commands/add.cjs.map +1 -0
- package/dist/commands/add.d.cts +5 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.js +88 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/build.cjs +55 -0
- package/dist/commands/build.cjs.map +1 -0
- package/dist/commands/build.d.cts +5 -0
- package/dist/commands/build.d.ts +5 -0
- package/dist/commands/build.js +49 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.cjs +57 -0
- package/dist/commands/dev.cjs.map +1 -0
- package/dist/commands/dev.d.cts +5 -0
- package/dist/commands/dev.d.ts +5 -0
- package/dist/commands/dev.js +51 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate.cjs +153 -0
- package/dist/commands/generate.cjs.map +1 -0
- package/dist/commands/generate.d.cts +5 -0
- package/dist/commands/generate.d.ts +5 -0
- package/dist/commands/generate.js +126 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/index.cjs +331 -0
- package/dist/commands/index.cjs.map +1 -0
- package/dist/commands/index.d.cts +6 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.js +300 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.cjs +187 -0
- package/dist/commands/init.cjs.map +1 -0
- package/dist/commands/init.d.cts +5 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.js +160 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.cjs +561 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +14 -0
- package/dist/index.d.ts +14 -18
- package/dist/index.js +489 -486
- package/dist/index.js.map +1 -0
- package/dist/repl.cjs +436 -0
- package/dist/repl.cjs.map +1 -0
- package/dist/repl.d.cts +8 -0
- package/dist/repl.d.ts +8 -0
- package/dist/repl.js +409 -0
- package/dist/repl.js.map +1 -0
- package/dist/start.cjs +543 -0
- package/dist/start.cjs.map +1 -0
- package/dist/start.d.cts +4 -0
- package/dist/start.d.ts +4 -0
- package/dist/start.js +516 -0
- package/dist/start.js.map +1 -0
- package/dist/templates/basic/.gitignore.hbs +4 -0
- package/dist/templates/basic/index.html.hbs +12 -0
- package/dist/templates/basic/package.json.hbs +25 -0
- package/dist/templates/basic/src/App.tsx.hbs +8 -0
- package/dist/templates/basic/src/app.css.hbs +32 -0
- package/dist/templates/basic/src/main.ts.hbs +20 -0
- package/dist/templates/basic/tsconfig.json.hbs +19 -0
- package/dist/templates/basic/vite.config.ts.hbs +10 -0
- package/dist/templates/component.hbs +7 -0
- package/dist/templates/page.hbs +7 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +71 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file.cjs +79 -0
- package/dist/utils/file.cjs.map +1 -0
- package/dist/utils/file.d.cts +14 -0
- package/dist/utils/file.d.ts +14 -0
- package/dist/utils/file.js +67 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.cjs +45 -0
- package/dist/utils/logger.cjs.map +1 -0
- package/dist/utils/logger.d.cts +14 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.js +34 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pm.cjs +38 -0
- package/dist/utils/pm.cjs.map +1 -0
- package/dist/utils/pm.d.cts +9 -0
- package/dist/utils/pm.d.ts +9 -0
- package/dist/utils/pm.js +34 -0
- package/dist/utils/pm.js.map +1 -0
- package/package.json +34 -40
- package/src/banner.ts +41 -0
- package/src/cli.ts +108 -0
- package/src/commands/add.ts +37 -0
- package/src/commands/build.ts +17 -0
- package/src/commands/dev.ts +19 -0
- package/src/commands/generate.ts +87 -0
- package/src/commands/index.ts +5 -0
- package/src/commands/init.ts +84 -0
- package/src/index.ts +13 -0
- package/src/repl.ts +140 -0
- package/src/start.ts +20 -0
- package/src/templates/basic/.gitignore.hbs +4 -0
- package/src/templates/basic/index.html.hbs +12 -0
- package/src/templates/basic/package.json.hbs +25 -0
- package/src/templates/basic/src/App.tsx.hbs +8 -0
- package/src/templates/basic/src/app.css.hbs +32 -0
- package/src/templates/basic/src/main.ts.hbs +20 -0
- package/src/templates/basic/tsconfig.json.hbs +19 -0
- package/src/templates/basic/vite.config.ts.hbs +10 -0
- package/src/templates/component.hbs +7 -0
- package/src/templates/page.hbs +7 -0
- package/src/types.ts +78 -0
- package/src/utils/file.ts +77 -0
- package/src/utils/logger.ts +27 -0
- package/src/utils/pm.ts +42 -0
- package/dist/ai-server.d.ts +0 -11
- package/dist/ai-server.js +0 -212
- package/dist/context.d.ts +0 -12
- package/dist/context.js +0 -301
- package/dist/diagnose.d.ts +0 -12
- package/dist/diagnose.js +0 -122
- package/dist/enterprise-template.d.ts +0 -83
- package/dist/enterprise-template.js +0 -638
- package/dist/inspect.d.ts +0 -11
- package/dist/inspect.js +0 -576
- package/dist/logo/cli-logo.d.ts +0 -5
- package/dist/logo/cli-logo.js +0 -16
- package/dist/scaffold.d.ts +0 -23
- package/dist/scaffold.js +0 -448
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type PackageManager = 'pnpm' | 'npm' | 'yarn';
|
|
2
|
+
/** Detect the package manager to use */
|
|
3
|
+
declare function detectPackageManager(targetDir?: string): PackageManager;
|
|
4
|
+
/** Install dependencies in a directory */
|
|
5
|
+
declare function installDependencies(targetDir: string, pm: PackageManager): void;
|
|
6
|
+
/** Add a package as a dependency */
|
|
7
|
+
declare function addPackage(targetDir: string, pm: PackageManager, pkg: string, dev: boolean): void;
|
|
8
|
+
|
|
9
|
+
export { type PackageManager, addPackage, detectPackageManager, installDependencies };
|
package/dist/utils/pm.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
function detectPackageManager(targetDir) {
|
|
8
|
+
if (targetDir) {
|
|
9
|
+
if (existsSync(resolve(targetDir, "pnpm-lock.yaml"))) return "pnpm";
|
|
10
|
+
if (existsSync(resolve(targetDir, "yarn.lock"))) return "yarn";
|
|
11
|
+
if (existsSync(resolve(targetDir, "package-lock.json"))) return "npm";
|
|
12
|
+
}
|
|
13
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
14
|
+
if (userAgent.startsWith("pnpm")) return "pnpm";
|
|
15
|
+
if (userAgent.startsWith("yarn")) return "yarn";
|
|
16
|
+
if (userAgent.startsWith("npm")) return "npm";
|
|
17
|
+
return "pnpm";
|
|
18
|
+
}
|
|
19
|
+
__name(detectPackageManager, "detectPackageManager");
|
|
20
|
+
function installDependencies(targetDir, pm) {
|
|
21
|
+
const cmd = pm === "yarn" ? "yarn" : `${pm} install`;
|
|
22
|
+
execSync(cmd, { cwd: targetDir, stdio: "inherit" });
|
|
23
|
+
}
|
|
24
|
+
__name(installDependencies, "installDependencies");
|
|
25
|
+
function addPackage(targetDir, pm, pkg, dev) {
|
|
26
|
+
const installFlag = dev ? "-D" : "";
|
|
27
|
+
const cmd = pm === "npm" ? `npm install ${installFlag} ${pkg}` : pm === "yarn" ? `yarn add ${installFlag} ${pkg}` : `pnpm add ${installFlag} ${pkg}`;
|
|
28
|
+
execSync(cmd, { cwd: targetDir, stdio: "inherit" });
|
|
29
|
+
}
|
|
30
|
+
__name(addPackage, "addPackage");
|
|
31
|
+
|
|
32
|
+
export { addPackage, detectPackageManager, installDependencies };
|
|
33
|
+
//# sourceMappingURL=pm.js.map
|
|
34
|
+
//# sourceMappingURL=pm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/pm.ts"],"names":[],"mappings":";;;;;;AAOO,SAAS,qBAAqB,SAAA,EAAoC;AAEvE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,WAAW,OAAA,CAAQ,SAAA,EAAW,gBAAgB,CAAC,GAAG,OAAO,MAAA;AAC7D,IAAA,IAAI,WAAW,OAAA,CAAQ,SAAA,EAAW,WAAW,CAAC,GAAG,OAAO,MAAA;AACxD,IAAA,IAAI,WAAW,OAAA,CAAQ,SAAA,EAAW,mBAAmB,CAAC,GAAG,OAAO,KAAA;AAAA,EAClE;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,qBAAA,IAAyB,EAAA;AACvD,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,MAAA;AACzC,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,MAAA;AACzC,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,KAAA;AAGxC,EAAA,OAAO,MAAA;AACT;AAhBgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAmBT,SAAS,mBAAA,CAAoB,WAAmB,EAAA,EAA0B;AAC/E,EAAA,MAAM,GAAA,GAAM,EAAA,KAAO,MAAA,GAAS,MAAA,GAAS,GAAG,EAAE,CAAA,QAAA,CAAA;AAC1C,EAAA,QAAA,CAAS,KAAK,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,WAAW,CAAA;AACpD;AAHgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAMT,SAAS,UAAA,CAAW,SAAA,EAAmB,EAAA,EAAoB,GAAA,EAAa,GAAA,EAAoB;AACjG,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,GAAO,EAAA;AACjC,EAAA,MAAM,MAAM,EAAA,KAAO,KAAA,GACf,eAAe,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GACjC,EAAA,KAAO,MAAA,GACL,CAAA,SAAA,EAAY,WAAW,CAAA,CAAA,EAAI,GAAG,KAC9B,CAAA,SAAA,EAAY,WAAW,IAAI,GAAG,CAAA,CAAA;AAEpC,EAAA,QAAA,CAAS,KAAK,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,WAAW,CAAA;AACpD;AATgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA","file":"pm.js","sourcesContent":["import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/** Detect the package manager to use */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // Check if a specific package manager is locked\n if (targetDir) {\n if (existsSync(resolve(targetDir, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(targetDir, 'yarn.lock'))) return 'yarn'\n if (existsSync(resolve(targetDir, 'package-lock.json'))) return 'npm'\n }\n\n // Check for global preference\n const userAgent = process.env.npm_config_user_agent || ''\n if (userAgent.startsWith('pnpm')) return 'pnpm'\n if (userAgent.startsWith('yarn')) return 'yarn'\n if (userAgent.startsWith('npm')) return 'npm'\n\n // Default to pnpm\n return 'pnpm'\n}\n\n/** Install dependencies in a directory */\nexport function installDependencies(targetDir: string, pm: PackageManager): void {\n const cmd = pm === 'yarn' ? 'yarn' : `${pm} install`\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}\n\n/** Add a package as a dependency */\nexport function addPackage(targetDir: string, pm: PackageManager, pkg: string, dev: boolean): void {\n const installFlag = dev ? '-D' : ''\n const cmd = pm === 'npm'\n ? `npm install ${installFlag} ${pkg}`\n : pm === 'yarn'\n ? `yarn add ${installFlag} ${pkg}`\n : `pnpm add ${installFlag} ${pkg}`\n\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}"]}
|
package/package.json
CHANGED
|
@@ -1,54 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vobs/cli",
|
|
3
|
-
"version": "0.3.0",
|
|
4
|
-
"description": "Command line diagnostics for vobs projects.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"publishConfig": {
|
|
7
|
-
"access": "public"
|
|
8
|
-
},
|
|
9
|
-
"license": "MIT",
|
|
10
|
-
"author": "vobsjs",
|
|
11
3
|
"repository": {
|
|
12
4
|
"type": "git",
|
|
13
|
-
"url": "git+https://github.com/vobsjs/vobs.git"
|
|
14
|
-
"directory": "packages/tools/cli"
|
|
15
|
-
},
|
|
16
|
-
"bugs": {
|
|
17
|
-
"url": "https://github.com/vobsjs/vobs/issues"
|
|
5
|
+
"url": "git+https://github.com/vobsjs/vobs.git"
|
|
18
6
|
},
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"typescript": "^5.7.0",
|
|
23
|
-
"@vobs/ai-contracts": "0.3.0",
|
|
24
|
-
"@vobs/ui": "0.3.0",
|
|
25
|
-
"@vobs/vite-plugin": "0.3.0",
|
|
26
|
-
"@vobs/compiler-dom": "0.3.0",
|
|
27
|
-
"@vobs/server-renderer": "0.3.0",
|
|
28
|
-
"@vobs/runtime-dom": "0.3.0",
|
|
29
|
-
"@vobs/reactivity": "0.3.0",
|
|
30
|
-
"@vobs/router": "0.3.0",
|
|
31
|
-
"@vobs/di": "0.3.0",
|
|
32
|
-
"@vobs/forms": "0.3.0"
|
|
7
|
+
"version": "1.2.1",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
33
10
|
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"description": "Vobs framework CLI - project scaffolding, code generation, and dev/build tools",
|
|
34
14
|
"bin": {
|
|
35
|
-
"vobs": "./
|
|
15
|
+
"vobs": "./bin/vobs.js"
|
|
36
16
|
},
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
17
|
+
"main": "./dist/index.cjs",
|
|
18
|
+
"module": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
40
20
|
"exports": {
|
|
41
21
|
".": {
|
|
42
22
|
"types": "./dist/index.d.ts",
|
|
43
|
-
"import": "./dist/index.js"
|
|
23
|
+
"import": "./dist/index.js",
|
|
24
|
+
"require": "./dist/index.cjs",
|
|
25
|
+
"default": "./dist/index.js"
|
|
44
26
|
},
|
|
45
|
-
"./
|
|
27
|
+
"./source": {
|
|
28
|
+
"types": "./src/index.ts",
|
|
29
|
+
"default": "./src/index.ts"
|
|
30
|
+
},
|
|
31
|
+
"./source/*": "./src/*"
|
|
46
32
|
},
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
}
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@clack/prompts": "^0.7.0",
|
|
35
|
+
"cac": "^6.7.14",
|
|
36
|
+
"handlebars": "^4.7.8",
|
|
37
|
+
"picocolors": "^1.0.0",
|
|
38
|
+
"tsx": "^4.19.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"bin",
|
|
45
|
+
"dist",
|
|
46
|
+
"src"
|
|
47
|
+
]
|
|
54
48
|
}
|
package/src/banner.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VOBS CLI Banner — Mathematical Bold Sans-Serif
|
|
3
|
+
* 𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬
|
|
4
|
+
* Signals First · Zero Re-renders · Ultra Lightweight
|
|
5
|
+
*
|
|
6
|
+
* The banner is left-aligned with a fixed indent rather than horizontally
|
|
7
|
+
* centered. Centering depends on the terminal column width and per-glyph
|
|
8
|
+
* render width, neither of which is reliably knowable, so it drifts as the
|
|
9
|
+
* window resizes. Fixed indent is stable across any terminal size.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const BANNER_LINE1 = '𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬'
|
|
13
|
+
const BANNER_TAGLINE = 'Signals First · Zero Re-renders · Ultra Lightweight'
|
|
14
|
+
|
|
15
|
+
/** Fixed left indent applied to every banner line (2 spaces). */
|
|
16
|
+
const INDENT = ' '
|
|
17
|
+
const DIM = '\x1b[2m'
|
|
18
|
+
const RESET = '\x1b[0m'
|
|
19
|
+
|
|
20
|
+
/** Show full banner (used for logo command, --help) */
|
|
21
|
+
export function showLogo(): void {
|
|
22
|
+
console.log()
|
|
23
|
+
console.log()
|
|
24
|
+
console.log(`${INDENT}${BANNER_LINE1}`)
|
|
25
|
+
console.log()
|
|
26
|
+
console.log(`${INDENT}${DIM}${BANNER_TAGLINE}${RESET}`)
|
|
27
|
+
console.log()
|
|
28
|
+
console.log()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Show single-line version banner (used for --version) */
|
|
32
|
+
export function showBanner(): void {
|
|
33
|
+
console.log(`${INDENT}${BANNER_LINE1}`)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Show the dev server start banner */
|
|
37
|
+
export function showDevBanner(): void {
|
|
38
|
+
console.log()
|
|
39
|
+
console.log(`${INDENT}${BANNER_LINE1}`)
|
|
40
|
+
console.log()
|
|
41
|
+
}
|
package/src/cli.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { cac } from 'cac'
|
|
2
|
+
import { initCommand } from './commands/init.js'
|
|
3
|
+
import { devCommand } from './commands/dev.js'
|
|
4
|
+
import { buildCommand } from './commands/build.js'
|
|
5
|
+
import { generateCommand } from './commands/generate.js'
|
|
6
|
+
import { addCommand } from './commands/add.js'
|
|
7
|
+
import { showBanner, showLogo, showDevBanner } from './banner.js'
|
|
8
|
+
|
|
9
|
+
export function createCLI(): ReturnType<typeof cac> {
|
|
10
|
+
const cli = cac('vobs')
|
|
11
|
+
|
|
12
|
+
cli
|
|
13
|
+
.command('init [name]', 'Create a new vobs project')
|
|
14
|
+
.option('--dir <dir>', 'Target directory')
|
|
15
|
+
.option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')
|
|
16
|
+
.option('--no-typescript', 'Do not use TypeScript')
|
|
17
|
+
.option('--no-git', 'Do not initialize git')
|
|
18
|
+
.action(async (name: string, options: Record<string, unknown>) => {
|
|
19
|
+
await initCommand({
|
|
20
|
+
name,
|
|
21
|
+
targetDir: options.dir as string | undefined,
|
|
22
|
+
packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,
|
|
23
|
+
typescript: options.typescript !== false,
|
|
24
|
+
git: options.git !== false
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
cli
|
|
29
|
+
.command('create [name]', 'Alias for init')
|
|
30
|
+
.option('--dir <dir>', 'Target directory')
|
|
31
|
+
.option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')
|
|
32
|
+
.option('--no-typescript', 'Do not use TypeScript')
|
|
33
|
+
.option('--no-git', 'Do not initialize git')
|
|
34
|
+
.action(async (name: string, options: Record<string, unknown>) => {
|
|
35
|
+
await initCommand({
|
|
36
|
+
name,
|
|
37
|
+
targetDir: options.dir as string | undefined,
|
|
38
|
+
packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,
|
|
39
|
+
typescript: options.typescript !== false,
|
|
40
|
+
git: options.git !== false
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
cli
|
|
45
|
+
.command('dev', 'Start the dev server')
|
|
46
|
+
.option('--config <path>', 'Vite config file')
|
|
47
|
+
.option('--port <port>', 'Port to listen on')
|
|
48
|
+
.option('--open', 'Open browser on start')
|
|
49
|
+
.action(async (options: Record<string, unknown>) => {
|
|
50
|
+
showDevBanner()
|
|
51
|
+
await devCommand({
|
|
52
|
+
config: options.config as string | undefined,
|
|
53
|
+
port: options.port as number | undefined,
|
|
54
|
+
open: options.open as boolean | undefined
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
cli
|
|
59
|
+
.command('build', 'Build for production')
|
|
60
|
+
.option('--config <path>', 'Vite config file')
|
|
61
|
+
.option('--outDir <dir>', 'Output directory')
|
|
62
|
+
.option('--mode <mode>', 'Build mode')
|
|
63
|
+
.action(async (options: Record<string, unknown>) => {
|
|
64
|
+
await buildCommand({
|
|
65
|
+
config: options.config as string | undefined,
|
|
66
|
+
outDir: options.outDir as string | undefined,
|
|
67
|
+
mode: options.mode as string | undefined
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
cli
|
|
72
|
+
.command('generate [name]', 'Generate code (component/page)')
|
|
73
|
+
.alias('g')
|
|
74
|
+
.option('--type <type>', 'Type: component or page')
|
|
75
|
+
.option('--dir <dir>', 'Target directory')
|
|
76
|
+
.action(async (name: string, options: Record<string, unknown>) => {
|
|
77
|
+
await generateCommand({
|
|
78
|
+
name,
|
|
79
|
+
type: (options.type as 'component' | 'page') || undefined,
|
|
80
|
+
targetDir: options.dir as string | undefined
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
cli
|
|
85
|
+
.command('add [package]', 'Add a package')
|
|
86
|
+
.option('-D, --dev', 'Save as dev dependency')
|
|
87
|
+
.action(async (pkg: string, options: Record<string, unknown>) => {
|
|
88
|
+
await addCommand({
|
|
89
|
+
package: pkg,
|
|
90
|
+
dev: options.dev as boolean | undefined
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
cli
|
|
95
|
+
.command('logo', 'Show the vobs CLI logo and version info')
|
|
96
|
+
.action(() => {
|
|
97
|
+
showLogo()
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
cli.on('--help', () => {
|
|
101
|
+
showBanner()
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
cli.help()
|
|
105
|
+
cli.version('1.0.0')
|
|
106
|
+
|
|
107
|
+
return cli
|
|
108
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as p from '@clack/prompts'
|
|
2
|
+
import { logger } from '../utils/logger.js'
|
|
3
|
+
import { detectPackageManager, addPackage } from '../utils/pm.js'
|
|
4
|
+
import type { AddOptions } from '../types.js'
|
|
5
|
+
|
|
6
|
+
export async function addCommand(options: Partial<AddOptions>): Promise<void> {
|
|
7
|
+
const pkg = options.package || (await p.text({
|
|
8
|
+
message: 'Package to add:',
|
|
9
|
+
placeholder: '@vobs/ui',
|
|
10
|
+
validate: (v) => !v ? 'Package name is required' : undefined
|
|
11
|
+
})) as string
|
|
12
|
+
|
|
13
|
+
if (p.isCancel(pkg)) {
|
|
14
|
+
p.cancel('Cancelled')
|
|
15
|
+
return
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const isDev = options.dev ?? (await p.confirm({
|
|
19
|
+
message: 'Save as dev dependency?',
|
|
20
|
+
initialValue: false
|
|
21
|
+
})) as boolean
|
|
22
|
+
|
|
23
|
+
if (p.isCancel(isDev)) {
|
|
24
|
+
p.cancel('Cancelled')
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const pm = detectPackageManager(process.cwd())
|
|
29
|
+
|
|
30
|
+
logger.step(`Installing ${pkg}...`)
|
|
31
|
+
addPackage(process.cwd(), pm, pkg, isDev)
|
|
32
|
+
|
|
33
|
+
logger.success(`Installed ${pkg}`)
|
|
34
|
+
console.log(`\n Import it in your code:\n`)
|
|
35
|
+
console.log(` import { ... } from '${pkg}'`)
|
|
36
|
+
console.log()
|
|
37
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { build } from 'vite'
|
|
2
|
+
import { logger } from '../utils/logger.js'
|
|
3
|
+
import type { BuildOptions } from '../types.js'
|
|
4
|
+
|
|
5
|
+
export async function buildCommand(options: BuildOptions): Promise<void> {
|
|
6
|
+
logger.info('Building for production...')
|
|
7
|
+
|
|
8
|
+
await build({
|
|
9
|
+
configFile: options.config,
|
|
10
|
+
build: {
|
|
11
|
+
outDir: options.outDir
|
|
12
|
+
},
|
|
13
|
+
mode: options.mode || 'production'
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
logger.success('Build complete')
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createServer } from 'vite'
|
|
2
|
+
import { logger } from '../utils/logger.js'
|
|
3
|
+
import type { DevOptions } from '../types.js'
|
|
4
|
+
|
|
5
|
+
export async function devCommand(options: DevOptions): Promise<void> {
|
|
6
|
+
logger.info('Starting dev server...')
|
|
7
|
+
|
|
8
|
+
const server = await createServer({
|
|
9
|
+
configFile: options.config,
|
|
10
|
+
server: {
|
|
11
|
+
port: options.port,
|
|
12
|
+
open: options.open
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
await server.listen()
|
|
17
|
+
server.printUrls()
|
|
18
|
+
logger.success('Dev server is running')
|
|
19
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import * as p from '@clack/prompts'
|
|
3
|
+
import { logger } from '../utils/logger.js'
|
|
4
|
+
import { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'
|
|
5
|
+
import type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'
|
|
6
|
+
|
|
7
|
+
export async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {
|
|
8
|
+
const type = options.type || (await p.select({
|
|
9
|
+
message: 'What to generate?',
|
|
10
|
+
options: [
|
|
11
|
+
{ value: 'component', label: 'Component' },
|
|
12
|
+
{ value: 'page', label: 'Page' }
|
|
13
|
+
]
|
|
14
|
+
})) as 'component' | 'page'
|
|
15
|
+
|
|
16
|
+
if (p.isCancel(type)) {
|
|
17
|
+
p.cancel('Cancelled')
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const name = options.name || (await p.text({
|
|
22
|
+
message: 'Name:',
|
|
23
|
+
placeholder: type === 'component' ? 'Button' : 'AboutPage',
|
|
24
|
+
validate: (v) => !v ? 'Name is required' : undefined
|
|
25
|
+
})) as string
|
|
26
|
+
|
|
27
|
+
if (p.isCancel(name)) {
|
|
28
|
+
p.cancel('Cancelled')
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const templatesDir = getTemplatesDir()
|
|
33
|
+
|
|
34
|
+
if (type === 'component') {
|
|
35
|
+
const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')
|
|
36
|
+
ensureDir(targetDir)
|
|
37
|
+
|
|
38
|
+
const context: ComponentTemplateContext = {
|
|
39
|
+
name: toPascalCase(name),
|
|
40
|
+
kebabName: toKebabCase(name)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const content = renderTemplate(
|
|
44
|
+
resolve(templatesDir, 'component.hbs'),
|
|
45
|
+
context as unknown as Record<string, unknown>
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
const filename = `${context.name}.tsx`
|
|
49
|
+
writeFile(targetDir, filename, content)
|
|
50
|
+
logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)
|
|
51
|
+
} else {
|
|
52
|
+
const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')
|
|
53
|
+
ensureDir(targetDir)
|
|
54
|
+
|
|
55
|
+
const context: PageTemplateContext = {
|
|
56
|
+
name: toPascalCase(name),
|
|
57
|
+
path: `/${toKebabCase(name)}`
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const content = renderTemplate(
|
|
61
|
+
resolve(templatesDir, 'page.hbs'),
|
|
62
|
+
context as unknown as Record<string, unknown>
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
const filename = `${context.name}.tsx`
|
|
66
|
+
writeFile(targetDir, filename, content)
|
|
67
|
+
logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function toPascalCase(str: string): string {
|
|
72
|
+
return str
|
|
73
|
+
.replace(/[^a-zA-Z0-9]/g, ' ')
|
|
74
|
+
.split(/\s+/)
|
|
75
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
76
|
+
.join('')
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function toKebabCase(str: string): string {
|
|
80
|
+
return str
|
|
81
|
+
.replace(/([A-Z])/g, '-$1')
|
|
82
|
+
.toLowerCase()
|
|
83
|
+
.replace(/^-/, '')
|
|
84
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
85
|
+
.replace(/--+/g, '-')
|
|
86
|
+
.replace(/^-|-$/g, '')
|
|
87
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import { execSync } from 'node:child_process'
|
|
3
|
+
import * as p from '@clack/prompts'
|
|
4
|
+
import { logger } from '../utils/logger.js'
|
|
5
|
+
import { scaffoldProject } from '../utils/file.js'
|
|
6
|
+
import { installDependencies } from '../utils/pm.js'
|
|
7
|
+
import type { InitOptions } from '../types.js'
|
|
8
|
+
|
|
9
|
+
export async function initCommand(options: Partial<InitOptions>): Promise<void> {
|
|
10
|
+
const projectName = options.name || (await p.text({
|
|
11
|
+
message: 'Project name:',
|
|
12
|
+
placeholder: 'my-vobs-app',
|
|
13
|
+
validate: (v) => !v ? 'Project name is required' : undefined
|
|
14
|
+
})) as string
|
|
15
|
+
|
|
16
|
+
if (p.isCancel(projectName)) {
|
|
17
|
+
p.cancel('Cancelled')
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const targetDir = options.targetDir || resolve(process.cwd(), projectName)
|
|
22
|
+
|
|
23
|
+
const packageManager = options.packageManager || (await p.select({
|
|
24
|
+
message: 'Package manager:',
|
|
25
|
+
options: [
|
|
26
|
+
{ value: 'pnpm', label: 'pnpm' },
|
|
27
|
+
{ value: 'npm', label: 'npm' },
|
|
28
|
+
{ value: 'yarn', label: 'yarn' }
|
|
29
|
+
]
|
|
30
|
+
})) as 'pnpm' | 'npm' | 'yarn'
|
|
31
|
+
|
|
32
|
+
if (p.isCancel(packageManager)) {
|
|
33
|
+
p.cancel('Cancelled')
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const useTypescript = options.typescript ?? (await p.confirm({
|
|
38
|
+
message: 'Use TypeScript?',
|
|
39
|
+
initialValue: true
|
|
40
|
+
})) as boolean
|
|
41
|
+
|
|
42
|
+
if (p.isCancel(useTypescript)) {
|
|
43
|
+
p.cancel('Cancelled')
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const initGit = options.git ?? (await p.confirm({
|
|
48
|
+
message: 'Initialize a git repository?',
|
|
49
|
+
initialValue: true
|
|
50
|
+
})) as boolean
|
|
51
|
+
|
|
52
|
+
if (p.isCancel(initGit)) {
|
|
53
|
+
p.cancel('Cancelled')
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
logger.step(`Creating project ${projectName}...`)
|
|
58
|
+
|
|
59
|
+
await scaffoldProject(targetDir, {
|
|
60
|
+
name: projectName,
|
|
61
|
+
packageName: projectName.toLowerCase().replace(/\s+/g, '-'),
|
|
62
|
+
typescript: useTypescript,
|
|
63
|
+
vobsVersion: '1.0.0'
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
logger.success('Project scaffolded')
|
|
67
|
+
|
|
68
|
+
logger.step('Installing dependencies...')
|
|
69
|
+
installDependencies(targetDir, packageManager)
|
|
70
|
+
logger.success('Dependencies installed')
|
|
71
|
+
|
|
72
|
+
if (initGit) {
|
|
73
|
+
logger.step('Initializing git repository...')
|
|
74
|
+
try {
|
|
75
|
+
execSync('git init', { cwd: targetDir, stdio: 'ignore' })
|
|
76
|
+
logger.success('Git repository initialized')
|
|
77
|
+
} catch {
|
|
78
|
+
logger.warn('Git not found, skipping git init')
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
logger.step('Done!')
|
|
83
|
+
console.log(`\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\n`)
|
|
84
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { createCLI } from './cli.js'
|
|
2
|
+
export { initCommand } from './commands/init.js'
|
|
3
|
+
export { devCommand } from './commands/dev.js'
|
|
4
|
+
export { buildCommand } from './commands/build.js'
|
|
5
|
+
export { generateCommand } from './commands/generate.js'
|
|
6
|
+
export { addCommand } from './commands/add.js'
|
|
7
|
+
export { showBanner, showLogo, showDevBanner } from './banner.js'
|
|
8
|
+
export { startRepl } from './repl.js'
|
|
9
|
+
export { start } from './start.js'
|
|
10
|
+
export { logger } from './utils/logger.js'
|
|
11
|
+
export { detectPackageManager, installDependencies, addPackage } from './utils/pm.js'
|
|
12
|
+
export { renderTemplate, writeFile, ensureDir, scaffoldProject } from './utils/file.js'
|
|
13
|
+
export type * from './types.js'
|