@vobs/cli 1.2.1 → 1.2.2
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/banner.cjs +31 -7
- package/dist/banner.cjs.map +1 -1
- package/dist/banner.js +5 -3
- package/dist/banner.js.map +1 -1
- package/dist/cli.cjs +130 -98
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +65 -40
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.cjs +63 -49
- package/dist/commands/add.cjs.map +1 -1
- package/dist/commands/add.js +14 -9
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/build.cjs +50 -19
- package/dist/commands/build.cjs.map +1 -1
- package/dist/commands/build.js +9 -6
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/dev.cjs +50 -19
- package/dist/commands/dev.cjs.map +1 -1
- package/dist/commands/dev.js +9 -6
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/generate.cjs +76 -63
- package/dist/commands/generate.cjs.map +1 -1
- package/dist/commands/generate.js +24 -18
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/index.cjs +136 -100
- package/dist/commands/index.cjs.map +1 -1
- package/dist/commands/index.js +66 -39
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.cjs +89 -71
- package/dist/commands/init.cjs.map +1 -1
- package/dist/commands/init.js +28 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/index.cjs +187 -132
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +94 -48
- package/dist/index.js.map +1 -1
- package/dist/repl.cjs +139 -111
- package/dist/repl.cjs.map +1 -1
- package/dist/repl.js +67 -46
- package/dist/repl.js.map +1 -1
- package/dist/start.cjs +151 -114
- package/dist/start.cjs.map +1 -1
- package/dist/start.js +76 -48
- package/dist/start.js.map +1 -1
- package/dist/types.cjs +18 -2
- package/dist/types.cjs.map +1 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/file.cjs +67 -34
- package/dist/utils/file.cjs.map +1 -1
- package/dist/utils/file.js +18 -12
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/logger.cjs +56 -22
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.js +11 -5
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/pm.cjs +41 -16
- package/dist/utils/pm.cjs.map +1 -1
- package/dist/utils/pm.js +10 -7
- package/dist/utils/pm.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/index.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { dirname, resolve } from 'path';
|
|
2
|
-
import { execSync } from 'child_process';
|
|
3
|
-
import * as p from '@clack/prompts';
|
|
4
|
-
import pc from 'picocolors';
|
|
5
|
-
import { readFileSync, mkdirSync, writeFileSync, existsSync } from 'fs';
|
|
6
|
-
import { fileURLToPath } from 'url';
|
|
7
|
-
import Handlebars from 'handlebars';
|
|
8
|
-
import { createServer, build } from 'vite';
|
|
9
|
-
|
|
10
1
|
var __defProp = Object.defineProperty;
|
|
11
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// packages/cli/src/commands/init.ts
|
|
5
|
+
import { resolve as resolve3 } from "path";
|
|
6
|
+
import { execSync as execSync2 } from "child_process";
|
|
7
|
+
import * as p from "@clack/prompts";
|
|
8
|
+
|
|
9
|
+
// packages/cli/src/utils/logger.ts
|
|
10
|
+
import pc from "picocolors";
|
|
12
11
|
function timestamp() {
|
|
13
12
|
return pc.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}]`);
|
|
14
13
|
}
|
|
@@ -35,8 +34,14 @@ function step(msg) {
|
|
|
35
34
|
}
|
|
36
35
|
__name(step, "step");
|
|
37
36
|
var logger = { info, success, warn, error, step };
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
|
|
38
|
+
// packages/cli/src/utils/file.ts
|
|
39
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
|
|
40
|
+
import { resolve, dirname } from "path";
|
|
41
|
+
import { fileURLToPath } from "url";
|
|
42
|
+
import Handlebars from "handlebars";
|
|
43
|
+
var __dirname = dirname(fileURLToPath(import.meta.url));
|
|
44
|
+
var TEMPLATES_ROOT = resolve(__dirname, "..", "templates");
|
|
40
45
|
function getTemplatesDir() {
|
|
41
46
|
return TEMPLATES_ROOT;
|
|
42
47
|
}
|
|
@@ -60,8 +65,8 @@ function ensureDir(dir) {
|
|
|
60
65
|
}
|
|
61
66
|
__name(ensureDir, "ensureDir");
|
|
62
67
|
async function copyDirRecursive(srcDir, destDir, context) {
|
|
63
|
-
const { readdirSync } = await import(
|
|
64
|
-
const { join } = await import(
|
|
68
|
+
const { readdirSync } = await import("fs");
|
|
69
|
+
const { join } = await import("path");
|
|
65
70
|
const entries = readdirSync(srcDir, { withFileTypes: true });
|
|
66
71
|
for (const entry of entries) {
|
|
67
72
|
const srcPath = join(srcDir, entry.name);
|
|
@@ -87,11 +92,16 @@ async function scaffoldProject(targetDir, context) {
|
|
|
87
92
|
await copyDirRecursive(templateDir, targetDir, context);
|
|
88
93
|
}
|
|
89
94
|
__name(scaffoldProject, "scaffoldProject");
|
|
95
|
+
|
|
96
|
+
// packages/cli/src/utils/pm.ts
|
|
97
|
+
import { existsSync as existsSync2 } from "fs";
|
|
98
|
+
import { resolve as resolve2 } from "path";
|
|
99
|
+
import { execSync } from "child_process";
|
|
90
100
|
function detectPackageManager(targetDir) {
|
|
91
101
|
if (targetDir) {
|
|
92
|
-
if (
|
|
93
|
-
if (
|
|
94
|
-
if (
|
|
102
|
+
if (existsSync2(resolve2(targetDir, "pnpm-lock.yaml"))) return "pnpm";
|
|
103
|
+
if (existsSync2(resolve2(targetDir, "yarn.lock"))) return "yarn";
|
|
104
|
+
if (existsSync2(resolve2(targetDir, "package-lock.json"))) return "npm";
|
|
95
105
|
}
|
|
96
106
|
const userAgent = process.env.npm_config_user_agent || "";
|
|
97
107
|
if (userAgent.startsWith("pnpm")) return "pnpm";
|
|
@@ -123,7 +133,7 @@ async function initCommand(options) {
|
|
|
123
133
|
p.cancel("Cancelled");
|
|
124
134
|
return;
|
|
125
135
|
}
|
|
126
|
-
const targetDir = options.targetDir ||
|
|
136
|
+
const targetDir = options.targetDir || resolve3(process.cwd(), projectName);
|
|
127
137
|
const packageManager = options.packageManager || await p.select({
|
|
128
138
|
message: "Package manager:",
|
|
129
139
|
options: [
|
|
@@ -166,7 +176,7 @@ async function initCommand(options) {
|
|
|
166
176
|
if (initGit) {
|
|
167
177
|
logger.step("Initializing git repository...");
|
|
168
178
|
try {
|
|
169
|
-
|
|
179
|
+
execSync2("git init", { cwd: targetDir, stdio: "ignore" });
|
|
170
180
|
logger.success("Git repository initialized");
|
|
171
181
|
} catch {
|
|
172
182
|
logger.warn("Git not found, skipping git init");
|
|
@@ -178,6 +188,9 @@ async function initCommand(options) {
|
|
|
178
188
|
`);
|
|
179
189
|
}
|
|
180
190
|
__name(initCommand, "initCommand");
|
|
191
|
+
|
|
192
|
+
// packages/cli/src/commands/dev.ts
|
|
193
|
+
import { createServer } from "vite";
|
|
181
194
|
async function devCommand(options) {
|
|
182
195
|
logger.info("Starting dev server...");
|
|
183
196
|
const server = await createServer({
|
|
@@ -192,6 +205,9 @@ async function devCommand(options) {
|
|
|
192
205
|
logger.success("Dev server is running");
|
|
193
206
|
}
|
|
194
207
|
__name(devCommand, "devCommand");
|
|
208
|
+
|
|
209
|
+
// packages/cli/src/commands/build.ts
|
|
210
|
+
import { build } from "vite";
|
|
195
211
|
async function buildCommand(options) {
|
|
196
212
|
logger.info("Building for production...");
|
|
197
213
|
await build({
|
|
@@ -204,56 +220,60 @@ async function buildCommand(options) {
|
|
|
204
220
|
logger.success("Build complete");
|
|
205
221
|
}
|
|
206
222
|
__name(buildCommand, "buildCommand");
|
|
223
|
+
|
|
224
|
+
// packages/cli/src/commands/generate.ts
|
|
225
|
+
import { resolve as resolve4 } from "path";
|
|
226
|
+
import * as p2 from "@clack/prompts";
|
|
207
227
|
async function generateCommand(options) {
|
|
208
|
-
const type = options.type || await
|
|
228
|
+
const type = options.type || await p2.select({
|
|
209
229
|
message: "What to generate?",
|
|
210
230
|
options: [
|
|
211
231
|
{ value: "component", label: "Component" },
|
|
212
232
|
{ value: "page", label: "Page" }
|
|
213
233
|
]
|
|
214
234
|
});
|
|
215
|
-
if (
|
|
216
|
-
|
|
235
|
+
if (p2.isCancel(type)) {
|
|
236
|
+
p2.cancel("Cancelled");
|
|
217
237
|
return;
|
|
218
238
|
}
|
|
219
|
-
const name = options.name || await
|
|
239
|
+
const name = options.name || await p2.text({
|
|
220
240
|
message: "Name:",
|
|
221
241
|
placeholder: type === "component" ? "Button" : "AboutPage",
|
|
222
242
|
validate: /* @__PURE__ */ __name((v) => !v ? "Name is required" : void 0, "validate")
|
|
223
243
|
});
|
|
224
|
-
if (
|
|
225
|
-
|
|
244
|
+
if (p2.isCancel(name)) {
|
|
245
|
+
p2.cancel("Cancelled");
|
|
226
246
|
return;
|
|
227
247
|
}
|
|
228
248
|
const templatesDir = getTemplatesDir();
|
|
229
249
|
if (type === "component") {
|
|
230
|
-
const targetDir = options.targetDir ||
|
|
250
|
+
const targetDir = options.targetDir || resolve4(process.cwd(), "src/components");
|
|
231
251
|
ensureDir(targetDir);
|
|
232
252
|
const context = {
|
|
233
253
|
name: toPascalCase(name),
|
|
234
254
|
kebabName: toKebabCase(name)
|
|
235
255
|
};
|
|
236
256
|
const content = renderTemplate(
|
|
237
|
-
|
|
257
|
+
resolve4(templatesDir, "component.hbs"),
|
|
238
258
|
context
|
|
239
259
|
);
|
|
240
260
|
const filename = `${context.name}.tsx`;
|
|
241
261
|
writeFile(targetDir, filename, content);
|
|
242
|
-
logger.success(`Created ${type} at ${
|
|
262
|
+
logger.success(`Created ${type} at ${resolve4(targetDir, filename)}`);
|
|
243
263
|
} else {
|
|
244
|
-
const targetDir = options.targetDir ||
|
|
264
|
+
const targetDir = options.targetDir || resolve4(process.cwd(), "src/pages");
|
|
245
265
|
ensureDir(targetDir);
|
|
246
266
|
const context = {
|
|
247
267
|
name: toPascalCase(name),
|
|
248
268
|
path: `/${toKebabCase(name)}`
|
|
249
269
|
};
|
|
250
270
|
const content = renderTemplate(
|
|
251
|
-
|
|
271
|
+
resolve4(templatesDir, "page.hbs"),
|
|
252
272
|
context
|
|
253
273
|
);
|
|
254
274
|
const filename = `${context.name}.tsx`;
|
|
255
275
|
writeFile(targetDir, filename, content);
|
|
256
|
-
logger.success(`Created ${type} at ${
|
|
276
|
+
logger.success(`Created ${type} at ${resolve4(targetDir, filename)}`);
|
|
257
277
|
}
|
|
258
278
|
}
|
|
259
279
|
__name(generateCommand, "generateCommand");
|
|
@@ -265,22 +285,25 @@ function toKebabCase(str) {
|
|
|
265
285
|
return str.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/[^a-z0-9-]/g, "-").replace(/--+/g, "-").replace(/^-|-$/g, "");
|
|
266
286
|
}
|
|
267
287
|
__name(toKebabCase, "toKebabCase");
|
|
288
|
+
|
|
289
|
+
// packages/cli/src/commands/add.ts
|
|
290
|
+
import * as p3 from "@clack/prompts";
|
|
268
291
|
async function addCommand(options) {
|
|
269
|
-
const pkg = options.package || await
|
|
292
|
+
const pkg = options.package || await p3.text({
|
|
270
293
|
message: "Package to add:",
|
|
271
294
|
placeholder: "@vobs/ui",
|
|
272
295
|
validate: /* @__PURE__ */ __name((v) => !v ? "Package name is required" : void 0, "validate")
|
|
273
296
|
});
|
|
274
|
-
if (
|
|
275
|
-
|
|
297
|
+
if (p3.isCancel(pkg)) {
|
|
298
|
+
p3.cancel("Cancelled");
|
|
276
299
|
return;
|
|
277
300
|
}
|
|
278
|
-
const isDev = options.dev ?? await
|
|
301
|
+
const isDev = options.dev ?? await p3.confirm({
|
|
279
302
|
message: "Save as dev dependency?",
|
|
280
303
|
initialValue: false
|
|
281
304
|
});
|
|
282
|
-
if (
|
|
283
|
-
|
|
305
|
+
if (p3.isCancel(isDev)) {
|
|
306
|
+
p3.cancel("Cancelled");
|
|
284
307
|
return;
|
|
285
308
|
}
|
|
286
309
|
const pm = detectPackageManager(process.cwd());
|
|
@@ -294,7 +317,11 @@ async function addCommand(options) {
|
|
|
294
317
|
console.log();
|
|
295
318
|
}
|
|
296
319
|
__name(addCommand, "addCommand");
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
320
|
+
export {
|
|
321
|
+
addCommand,
|
|
322
|
+
buildCommand,
|
|
323
|
+
devCommand,
|
|
324
|
+
generateCommand,
|
|
325
|
+
initCommand
|
|
326
|
+
};
|
|
300
327
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/logger.ts","../../src/utils/file.ts","../../src/utils/pm.ts","../../src/commands/init.ts","../../src/commands/dev.ts","../../src/commands/build.ts","../../src/commands/generate.ts","../../src/commands/add.ts"],"names":["__dirname","existsSync","resolve","execSync","p2","p3"],"mappings":"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","file":"index.js","sourcesContent":["import pc from 'picocolors'\n\nfunction timestamp(): string {\n return pc.dim(`[${new Date().toLocaleTimeString()}]`)\n}\n\nexport function info(msg: string): void {\n console.log(`${timestamp()} ${pc.cyan('ℹ')} ${msg}`)\n}\n\nexport function success(msg: string): void {\n console.log(`${timestamp()} ${pc.green('✔')} ${msg}`)\n}\n\nexport function warn(msg: string): void {\n console.log(`${timestamp()} ${pc.yellow('⚠')} ${msg}`)\n}\n\nexport function error(msg: string): void {\n console.error(`${timestamp()} ${pc.red('✖')} ${msg}`)\n}\n\nexport function step(msg: string): void {\n console.log(`\\n ${pc.bold(pc.cyan(msg))}`)\n}\n\nexport const logger = { info, success, warn, error, step }","import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport Handlebars from 'handlebars'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_ROOT = resolve(__dirname, '..', 'templates')\n\n/** Get the absolute path to the templates directory */\nexport function getTemplatesDir(): string {\n return TEMPLATES_ROOT\n}\n\n/** Read a template file and compile it with Handlebars */\nexport function renderTemplate(\n templatePath: string,\n context: Record<string, unknown>\n): string {\n const source = readFileSync(templatePath, 'utf-8')\n const template = Handlebars.compile(source)\n return template(context)\n}\n\n/** Write a file, creating parent directories if needed */\nexport function writeFile(dir: string, filename: string, content: string): void {\n const filePath = resolve(dir, filename)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/** Check if a path exists */\nexport function pathExists(path: string): boolean {\n return existsSync(path)\n}\n\n/** Copy a template directory recursively, rendering each .hbs file */\nasync function copyDirRecursive(srcDir: string, destDir: string, context: Record<string, unknown>): Promise<void> {\n const { readdirSync } = await import('node:fs')\n const { join } = await import('node:path')\n\n const entries = readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const isHbs = entry.name.endsWith('.hbs')\n const destName = isHbs ? entry.name.slice(0, -4) : entry.name\n const destPath = join(destDir, destName)\n\n if (entry.isDirectory()) {\n ensureDir(destPath)\n await copyDirRecursive(srcPath, destPath, context)\n } else if (isHbs) {\n const content = renderTemplate(srcPath, context)\n writeFile(destDir, destName, content)\n } else {\n const content = readFileSync(srcPath, 'utf-8')\n writeFile(destDir, destName, content)\n }\n }\n}\n\n/** Scaffold a project from the basic template */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, 'basic')\n ensureDir(targetDir)\n await copyDirRecursive(templateDir, targetDir, context)\n}","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}","import { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { scaffoldProject } from '../utils/file.js'\nimport { installDependencies } from '../utils/pm.js'\nimport type { InitOptions } from '../types.js'\n\nexport async function initCommand(options: Partial<InitOptions>): Promise<void> {\n const projectName = options.name || (await p.text({\n message: 'Project name:',\n placeholder: 'my-vobs-app',\n validate: (v) => !v ? 'Project name is required' : undefined\n })) as string\n\n if (p.isCancel(projectName)) {\n p.cancel('Cancelled')\n return\n }\n\n const targetDir = options.targetDir || resolve(process.cwd(), projectName)\n\n const packageManager = options.packageManager || (await p.select({\n message: 'Package manager:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' }\n ]\n })) as 'pnpm' | 'npm' | 'yarn'\n\n if (p.isCancel(packageManager)) {\n p.cancel('Cancelled')\n return\n }\n\n const useTypescript = options.typescript ?? (await p.confirm({\n message: 'Use TypeScript?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(useTypescript)) {\n p.cancel('Cancelled')\n return\n }\n\n const initGit = options.git ?? (await p.confirm({\n message: 'Initialize a git repository?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(initGit)) {\n p.cancel('Cancelled')\n return\n }\n\n logger.step(`Creating project ${projectName}...`)\n\n await scaffoldProject(targetDir, {\n name: projectName,\n packageName: projectName.toLowerCase().replace(/\\s+/g, '-'),\n typescript: useTypescript,\n vobsVersion: '1.0.0'\n })\n\n logger.success('Project scaffolded')\n\n logger.step('Installing dependencies...')\n installDependencies(targetDir, packageManager)\n logger.success('Dependencies installed')\n\n if (initGit) {\n logger.step('Initializing git repository...')\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n logger.success('Git repository initialized')\n } catch {\n logger.warn('Git not found, skipping git init')\n }\n }\n\n logger.step('Done!')\n console.log(`\\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\\n`)\n}","import { createServer } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { DevOptions } from '../types.js'\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n logger.info('Starting dev server...')\n\n const server = await createServer({\n configFile: options.config,\n server: {\n port: options.port,\n open: options.open\n }\n })\n\n await server.listen()\n server.printUrls()\n logger.success('Dev server is running')\n}","import { build } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { BuildOptions } from '../types.js'\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n logger.info('Building for production...')\n\n await build({\n configFile: options.config,\n build: {\n outDir: options.outDir\n },\n mode: options.mode || 'production'\n })\n\n logger.success('Build complete')\n}","import { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'\nimport type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'\n\nexport async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {\n const type = options.type || (await p.select({\n message: 'What to generate?',\n options: [\n { value: 'component', label: 'Component' },\n { value: 'page', label: 'Page' }\n ]\n })) as 'component' | 'page'\n\n if (p.isCancel(type)) {\n p.cancel('Cancelled')\n return\n }\n\n const name = options.name || (await p.text({\n message: 'Name:',\n placeholder: type === 'component' ? 'Button' : 'AboutPage',\n validate: (v) => !v ? 'Name is required' : undefined\n })) as string\n\n if (p.isCancel(name)) {\n p.cancel('Cancelled')\n return\n }\n\n const templatesDir = getTemplatesDir()\n\n if (type === 'component') {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')\n ensureDir(targetDir)\n\n const context: ComponentTemplateContext = {\n name: toPascalCase(name),\n kebabName: toKebabCase(name)\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'component.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n } else {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')\n ensureDir(targetDir)\n\n const context: PageTemplateContext = {\n name: toPascalCase(name),\n path: `/${toKebabCase(name)}`\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'page.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n}","import * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { detectPackageManager, addPackage } from '../utils/pm.js'\nimport type { AddOptions } from '../types.js'\n\nexport async function addCommand(options: Partial<AddOptions>): Promise<void> {\n const pkg = options.package || (await p.text({\n message: 'Package to add:',\n placeholder: '@vobs/ui',\n validate: (v) => !v ? 'Package name is required' : undefined\n })) as string\n\n if (p.isCancel(pkg)) {\n p.cancel('Cancelled')\n return\n }\n\n const isDev = options.dev ?? (await p.confirm({\n message: 'Save as dev dependency?',\n initialValue: false\n })) as boolean\n\n if (p.isCancel(isDev)) {\n p.cancel('Cancelled')\n return\n }\n\n const pm = detectPackageManager(process.cwd())\n\n logger.step(`Installing ${pkg}...`)\n addPackage(process.cwd(), pm, pkg, isDev)\n\n logger.success(`Installed ${pkg}`)\n console.log(`\\n Import it in your code:\\n`)\n console.log(` import { ... } from '${pkg}'`)\n console.log()\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/init.ts","../../src/utils/logger.ts","../../src/utils/file.ts","../../src/utils/pm.ts","../../src/commands/dev.ts","../../src/commands/build.ts","../../src/commands/generate.ts","../../src/commands/add.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { scaffoldProject } from '../utils/file.js'\nimport { installDependencies } from '../utils/pm.js'\nimport type { InitOptions } from '../types.js'\n\nexport async function initCommand(options: Partial<InitOptions>): Promise<void> {\n const projectName = options.name || (await p.text({\n message: 'Project name:',\n placeholder: 'my-vobs-app',\n validate: (v) => !v ? 'Project name is required' : undefined\n })) as string\n\n if (p.isCancel(projectName)) {\n p.cancel('Cancelled')\n return\n }\n\n const targetDir = options.targetDir || resolve(process.cwd(), projectName)\n\n const packageManager = options.packageManager || (await p.select({\n message: 'Package manager:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' }\n ]\n })) as 'pnpm' | 'npm' | 'yarn'\n\n if (p.isCancel(packageManager)) {\n p.cancel('Cancelled')\n return\n }\n\n const useTypescript = options.typescript ?? (await p.confirm({\n message: 'Use TypeScript?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(useTypescript)) {\n p.cancel('Cancelled')\n return\n }\n\n const initGit = options.git ?? (await p.confirm({\n message: 'Initialize a git repository?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(initGit)) {\n p.cancel('Cancelled')\n return\n }\n\n logger.step(`Creating project ${projectName}...`)\n\n await scaffoldProject(targetDir, {\n name: projectName,\n packageName: projectName.toLowerCase().replace(/\\s+/g, '-'),\n typescript: useTypescript,\n vobsVersion: '1.0.0'\n })\n\n logger.success('Project scaffolded')\n\n logger.step('Installing dependencies...')\n installDependencies(targetDir, packageManager)\n logger.success('Dependencies installed')\n\n if (initGit) {\n logger.step('Initializing git repository...')\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n logger.success('Git repository initialized')\n } catch {\n logger.warn('Git not found, skipping git init')\n }\n }\n\n logger.step('Done!')\n console.log(`\\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\\n`)\n}","import pc from 'picocolors'\n\nfunction timestamp(): string {\n return pc.dim(`[${new Date().toLocaleTimeString()}]`)\n}\n\nexport function info(msg: string): void {\n console.log(`${timestamp()} ${pc.cyan('ℹ')} ${msg}`)\n}\n\nexport function success(msg: string): void {\n console.log(`${timestamp()} ${pc.green('✔')} ${msg}`)\n}\n\nexport function warn(msg: string): void {\n console.log(`${timestamp()} ${pc.yellow('⚠')} ${msg}`)\n}\n\nexport function error(msg: string): void {\n console.error(`${timestamp()} ${pc.red('✖')} ${msg}`)\n}\n\nexport function step(msg: string): void {\n console.log(`\\n ${pc.bold(pc.cyan(msg))}`)\n}\n\nexport const logger = { info, success, warn, error, step }","import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport Handlebars from 'handlebars'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_ROOT = resolve(__dirname, '..', 'templates')\n\n/** Get the absolute path to the templates directory */\nexport function getTemplatesDir(): string {\n return TEMPLATES_ROOT\n}\n\n/** Read a template file and compile it with Handlebars */\nexport function renderTemplate(\n templatePath: string,\n context: Record<string, unknown>\n): string {\n const source = readFileSync(templatePath, 'utf-8')\n const template = Handlebars.compile(source)\n return template(context)\n}\n\n/** Write a file, creating parent directories if needed */\nexport function writeFile(dir: string, filename: string, content: string): void {\n const filePath = resolve(dir, filename)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/** Check if a path exists */\nexport function pathExists(path: string): boolean {\n return existsSync(path)\n}\n\n/** Copy a template directory recursively, rendering each .hbs file */\nasync function copyDirRecursive(srcDir: string, destDir: string, context: Record<string, unknown>): Promise<void> {\n const { readdirSync } = await import('node:fs')\n const { join } = await import('node:path')\n\n const entries = readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const isHbs = entry.name.endsWith('.hbs')\n const destName = isHbs ? entry.name.slice(0, -4) : entry.name\n const destPath = join(destDir, destName)\n\n if (entry.isDirectory()) {\n ensureDir(destPath)\n await copyDirRecursive(srcPath, destPath, context)\n } else if (isHbs) {\n const content = renderTemplate(srcPath, context)\n writeFile(destDir, destName, content)\n } else {\n const content = readFileSync(srcPath, 'utf-8')\n writeFile(destDir, destName, content)\n }\n }\n}\n\n/** Scaffold a project from the basic template */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, 'basic')\n ensureDir(targetDir)\n await copyDirRecursive(templateDir, targetDir, context)\n}","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}","import { createServer } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { DevOptions } from '../types.js'\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n logger.info('Starting dev server...')\n\n const server = await createServer({\n configFile: options.config,\n server: {\n port: options.port,\n open: options.open\n }\n })\n\n await server.listen()\n server.printUrls()\n logger.success('Dev server is running')\n}","import { build } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { BuildOptions } from '../types.js'\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n logger.info('Building for production...')\n\n await build({\n configFile: options.config,\n build: {\n outDir: options.outDir\n },\n mode: options.mode || 'production'\n })\n\n logger.success('Build complete')\n}","import { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'\nimport type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'\n\nexport async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {\n const type = options.type || (await p.select({\n message: 'What to generate?',\n options: [\n { value: 'component', label: 'Component' },\n { value: 'page', label: 'Page' }\n ]\n })) as 'component' | 'page'\n\n if (p.isCancel(type)) {\n p.cancel('Cancelled')\n return\n }\n\n const name = options.name || (await p.text({\n message: 'Name:',\n placeholder: type === 'component' ? 'Button' : 'AboutPage',\n validate: (v) => !v ? 'Name is required' : undefined\n })) as string\n\n if (p.isCancel(name)) {\n p.cancel('Cancelled')\n return\n }\n\n const templatesDir = getTemplatesDir()\n\n if (type === 'component') {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')\n ensureDir(targetDir)\n\n const context: ComponentTemplateContext = {\n name: toPascalCase(name),\n kebabName: toKebabCase(name)\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'component.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n } else {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')\n ensureDir(targetDir)\n\n const context: PageTemplateContext = {\n name: toPascalCase(name),\n path: `/${toKebabCase(name)}`\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'page.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n}","import * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { detectPackageManager, addPackage } from '../utils/pm.js'\nimport type { AddOptions } from '../types.js'\n\nexport async function addCommand(options: Partial<AddOptions>): Promise<void> {\n const pkg = options.package || (await p.text({\n message: 'Package to add:',\n placeholder: '@vobs/ui',\n validate: (v) => !v ? 'Package name is required' : undefined\n })) as string\n\n if (p.isCancel(pkg)) {\n p.cancel('Cancelled')\n return\n }\n\n const isDev = options.dev ?? (await p.confirm({\n message: 'Save as dev dependency?',\n initialValue: false\n })) as boolean\n\n if (p.isCancel(isDev)) {\n p.cancel('Cancelled')\n return\n }\n\n const pm = detectPackageManager(process.cwd())\n\n logger.step(`Installing ${pkg}...`)\n addPackage(process.cwd(), pm, pkg, isDev)\n\n logger.success(`Installed ${pkg}`)\n console.log(`\\n Import it in your code:\\n`)\n console.log(` import { ... } from '${pkg}'`)\n console.log()\n}"],"mappings":"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","names":["resolve","execSync","existsSync","resolve","existsSync","resolve","resolve","execSync","resolve","p","resolve","p"]}
|
package/dist/commands/init.cjs
CHANGED
|
@@ -1,89 +1,101 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (k !== 'default') {
|
|
20
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
get: function () { return e[k]; }
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
});
|
|
1
|
+
var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
|
|
2
|
+
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
for (var name in all)
|
|
12
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
27
19
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
27
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
28
|
+
mod
|
|
29
|
+
));
|
|
30
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
var
|
|
34
|
-
|
|
32
|
+
// packages/cli/src/commands/init.ts
|
|
33
|
+
var init_exports = {};
|
|
34
|
+
__export(init_exports, {
|
|
35
|
+
initCommand: () => initCommand
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(init_exports);
|
|
38
|
+
var import_node_path3 = require("path");
|
|
39
|
+
var import_node_child_process2 = require("child_process");
|
|
40
|
+
var p = __toESM(require("@clack/prompts"), 1);
|
|
35
41
|
|
|
36
|
-
|
|
37
|
-
var
|
|
42
|
+
// packages/cli/src/utils/logger.ts
|
|
43
|
+
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
38
44
|
function timestamp() {
|
|
39
|
-
return
|
|
45
|
+
return import_picocolors.default.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}]`);
|
|
40
46
|
}
|
|
41
47
|
__name(timestamp, "timestamp");
|
|
42
48
|
function info(msg) {
|
|
43
|
-
console.log(`${timestamp()} ${
|
|
49
|
+
console.log(`${timestamp()} ${import_picocolors.default.cyan("\u2139")} ${msg}`);
|
|
44
50
|
}
|
|
45
51
|
__name(info, "info");
|
|
46
52
|
function success(msg) {
|
|
47
|
-
console.log(`${timestamp()} ${
|
|
53
|
+
console.log(`${timestamp()} ${import_picocolors.default.green("\u2714")} ${msg}`);
|
|
48
54
|
}
|
|
49
55
|
__name(success, "success");
|
|
50
56
|
function warn(msg) {
|
|
51
|
-
console.log(`${timestamp()} ${
|
|
57
|
+
console.log(`${timestamp()} ${import_picocolors.default.yellow("\u26A0")} ${msg}`);
|
|
52
58
|
}
|
|
53
59
|
__name(warn, "warn");
|
|
54
60
|
function error(msg) {
|
|
55
|
-
console.error(`${timestamp()} ${
|
|
61
|
+
console.error(`${timestamp()} ${import_picocolors.default.red("\u2716")} ${msg}`);
|
|
56
62
|
}
|
|
57
63
|
__name(error, "error");
|
|
58
64
|
function step(msg) {
|
|
59
65
|
console.log(`
|
|
60
|
-
${
|
|
66
|
+
${import_picocolors.default.bold(import_picocolors.default.cyan(msg))}`);
|
|
61
67
|
}
|
|
62
68
|
__name(step, "step");
|
|
63
69
|
var logger = { info, success, warn, error, step };
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
|
|
71
|
+
// packages/cli/src/utils/file.ts
|
|
72
|
+
var import_node_fs = require("fs");
|
|
73
|
+
var import_node_path = require("path");
|
|
74
|
+
var import_node_url = require("url");
|
|
75
|
+
var import_handlebars = __toESM(require("handlebars"), 1);
|
|
76
|
+
var __dirname = (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(__VOBS_CJS_FILE_URL));
|
|
77
|
+
var TEMPLATES_ROOT = (0, import_node_path.resolve)(__dirname, "..", "templates");
|
|
66
78
|
function renderTemplate(templatePath, context) {
|
|
67
|
-
const source =
|
|
68
|
-
const template =
|
|
79
|
+
const source = (0, import_node_fs.readFileSync)(templatePath, "utf-8");
|
|
80
|
+
const template = import_handlebars.default.compile(source);
|
|
69
81
|
return template(context);
|
|
70
82
|
}
|
|
71
83
|
__name(renderTemplate, "renderTemplate");
|
|
72
84
|
function writeFile(dir, filename, content) {
|
|
73
|
-
const filePath =
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
const filePath = (0, import_node_path.resolve)(dir, filename);
|
|
86
|
+
(0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(filePath), { recursive: true });
|
|
87
|
+
(0, import_node_fs.writeFileSync)(filePath, content, "utf-8");
|
|
76
88
|
}
|
|
77
89
|
__name(writeFile, "writeFile");
|
|
78
90
|
function ensureDir(dir) {
|
|
79
|
-
if (!
|
|
80
|
-
|
|
91
|
+
if (!(0, import_node_fs.existsSync)(dir)) {
|
|
92
|
+
(0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
81
93
|
}
|
|
82
94
|
}
|
|
83
95
|
__name(ensureDir, "ensureDir");
|
|
84
96
|
async function copyDirRecursive(srcDir, destDir, context) {
|
|
85
|
-
const { readdirSync } = await import(
|
|
86
|
-
const { join } = await import(
|
|
97
|
+
const { readdirSync } = await import("fs");
|
|
98
|
+
const { join } = await import("path");
|
|
87
99
|
const entries = readdirSync(srcDir, { withFileTypes: true });
|
|
88
100
|
for (const entry of entries) {
|
|
89
101
|
const srcPath = join(srcDir, entry.name);
|
|
@@ -97,37 +109,42 @@ async function copyDirRecursive(srcDir, destDir, context) {
|
|
|
97
109
|
const content = renderTemplate(srcPath, context);
|
|
98
110
|
writeFile(destDir, destName, content);
|
|
99
111
|
} else {
|
|
100
|
-
const content =
|
|
112
|
+
const content = (0, import_node_fs.readFileSync)(srcPath, "utf-8");
|
|
101
113
|
writeFile(destDir, destName, content);
|
|
102
114
|
}
|
|
103
115
|
}
|
|
104
116
|
}
|
|
105
117
|
__name(copyDirRecursive, "copyDirRecursive");
|
|
106
118
|
async function scaffoldProject(targetDir, context) {
|
|
107
|
-
const templateDir =
|
|
119
|
+
const templateDir = (0, import_node_path.resolve)(TEMPLATES_ROOT, "basic");
|
|
108
120
|
ensureDir(targetDir);
|
|
109
121
|
await copyDirRecursive(templateDir, targetDir, context);
|
|
110
122
|
}
|
|
111
123
|
__name(scaffoldProject, "scaffoldProject");
|
|
124
|
+
|
|
125
|
+
// packages/cli/src/utils/pm.ts
|
|
126
|
+
var import_node_fs2 = require("fs");
|
|
127
|
+
var import_node_path2 = require("path");
|
|
128
|
+
var import_node_child_process = require("child_process");
|
|
112
129
|
function installDependencies(targetDir, pm) {
|
|
113
130
|
const cmd = pm === "yarn" ? "yarn" : `${pm} install`;
|
|
114
|
-
|
|
131
|
+
(0, import_node_child_process.execSync)(cmd, { cwd: targetDir, stdio: "inherit" });
|
|
115
132
|
}
|
|
116
133
|
__name(installDependencies, "installDependencies");
|
|
117
134
|
|
|
118
135
|
// packages/cli/src/commands/init.ts
|
|
119
136
|
async function initCommand(options) {
|
|
120
|
-
const projectName = options.name || await
|
|
137
|
+
const projectName = options.name || await p.text({
|
|
121
138
|
message: "Project name:",
|
|
122
139
|
placeholder: "my-vobs-app",
|
|
123
140
|
validate: /* @__PURE__ */ __name((v) => !v ? "Project name is required" : void 0, "validate")
|
|
124
141
|
});
|
|
125
|
-
if (
|
|
126
|
-
|
|
142
|
+
if (p.isCancel(projectName)) {
|
|
143
|
+
p.cancel("Cancelled");
|
|
127
144
|
return;
|
|
128
145
|
}
|
|
129
|
-
const targetDir = options.targetDir ||
|
|
130
|
-
const packageManager = options.packageManager || await
|
|
146
|
+
const targetDir = options.targetDir || (0, import_node_path3.resolve)(process.cwd(), projectName);
|
|
147
|
+
const packageManager = options.packageManager || await p.select({
|
|
131
148
|
message: "Package manager:",
|
|
132
149
|
options: [
|
|
133
150
|
{ value: "pnpm", label: "pnpm" },
|
|
@@ -135,24 +152,24 @@ async function initCommand(options) {
|
|
|
135
152
|
{ value: "yarn", label: "yarn" }
|
|
136
153
|
]
|
|
137
154
|
});
|
|
138
|
-
if (
|
|
139
|
-
|
|
155
|
+
if (p.isCancel(packageManager)) {
|
|
156
|
+
p.cancel("Cancelled");
|
|
140
157
|
return;
|
|
141
158
|
}
|
|
142
|
-
const useTypescript = options.typescript ?? await
|
|
159
|
+
const useTypescript = options.typescript ?? await p.confirm({
|
|
143
160
|
message: "Use TypeScript?",
|
|
144
161
|
initialValue: true
|
|
145
162
|
});
|
|
146
|
-
if (
|
|
147
|
-
|
|
163
|
+
if (p.isCancel(useTypescript)) {
|
|
164
|
+
p.cancel("Cancelled");
|
|
148
165
|
return;
|
|
149
166
|
}
|
|
150
|
-
const initGit = options.git ?? await
|
|
167
|
+
const initGit = options.git ?? await p.confirm({
|
|
151
168
|
message: "Initialize a git repository?",
|
|
152
169
|
initialValue: true
|
|
153
170
|
});
|
|
154
|
-
if (
|
|
155
|
-
|
|
171
|
+
if (p.isCancel(initGit)) {
|
|
172
|
+
p.cancel("Cancelled");
|
|
156
173
|
return;
|
|
157
174
|
}
|
|
158
175
|
logger.step(`Creating project ${projectName}...`);
|
|
@@ -169,7 +186,7 @@ async function initCommand(options) {
|
|
|
169
186
|
if (initGit) {
|
|
170
187
|
logger.step("Initializing git repository...");
|
|
171
188
|
try {
|
|
172
|
-
|
|
189
|
+
(0, import_node_child_process2.execSync)("git init", { cwd: targetDir, stdio: "ignore" });
|
|
173
190
|
logger.success("Git repository initialized");
|
|
174
191
|
} catch {
|
|
175
192
|
logger.warn("Git not found, skipping git init");
|
|
@@ -181,7 +198,8 @@ async function initCommand(options) {
|
|
|
181
198
|
`);
|
|
182
199
|
}
|
|
183
200
|
__name(initCommand, "initCommand");
|
|
184
|
-
|
|
185
|
-
exports
|
|
186
|
-
|
|
201
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
202
|
+
0 && (module.exports = {
|
|
203
|
+
initCommand
|
|
204
|
+
});
|
|
187
205
|
//# sourceMappingURL=init.cjs.map
|