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