@vobs/cli 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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
|
@@ -1,141 +1,153 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
});
|
|
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 });
|
|
26
19
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
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);
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
var
|
|
33
|
-
|
|
32
|
+
// packages/cli/src/commands/generate.ts
|
|
33
|
+
var generate_exports = {};
|
|
34
|
+
__export(generate_exports, {
|
|
35
|
+
generateCommand: () => generateCommand
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(generate_exports);
|
|
38
|
+
var import_node_path2 = require("path");
|
|
39
|
+
var p = __toESM(require("@clack/prompts"), 1);
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
var
|
|
41
|
+
// packages/cli/src/utils/logger.ts
|
|
42
|
+
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
37
43
|
function timestamp() {
|
|
38
|
-
return
|
|
44
|
+
return import_picocolors.default.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}]`);
|
|
39
45
|
}
|
|
40
46
|
__name(timestamp, "timestamp");
|
|
41
47
|
function info(msg) {
|
|
42
|
-
console.log(`${timestamp()} ${
|
|
48
|
+
console.log(`${timestamp()} ${import_picocolors.default.cyan("\u2139")} ${msg}`);
|
|
43
49
|
}
|
|
44
50
|
__name(info, "info");
|
|
45
51
|
function success(msg) {
|
|
46
|
-
console.log(`${timestamp()} ${
|
|
52
|
+
console.log(`${timestamp()} ${import_picocolors.default.green("\u2714")} ${msg}`);
|
|
47
53
|
}
|
|
48
54
|
__name(success, "success");
|
|
49
55
|
function warn(msg) {
|
|
50
|
-
console.log(`${timestamp()} ${
|
|
56
|
+
console.log(`${timestamp()} ${import_picocolors.default.yellow("\u26A0")} ${msg}`);
|
|
51
57
|
}
|
|
52
58
|
__name(warn, "warn");
|
|
53
59
|
function error(msg) {
|
|
54
|
-
console.error(`${timestamp()} ${
|
|
60
|
+
console.error(`${timestamp()} ${import_picocolors.default.red("\u2716")} ${msg}`);
|
|
55
61
|
}
|
|
56
62
|
__name(error, "error");
|
|
57
63
|
function step(msg) {
|
|
58
64
|
console.log(`
|
|
59
|
-
${
|
|
65
|
+
${import_picocolors.default.bold(import_picocolors.default.cyan(msg))}`);
|
|
60
66
|
}
|
|
61
67
|
__name(step, "step");
|
|
62
68
|
var logger = { info, success, warn, error, step };
|
|
63
|
-
|
|
64
|
-
|
|
69
|
+
|
|
70
|
+
// packages/cli/src/utils/file.ts
|
|
71
|
+
var import_node_fs = require("fs");
|
|
72
|
+
var import_node_path = require("path");
|
|
73
|
+
var import_node_url = require("url");
|
|
74
|
+
var import_handlebars = __toESM(require("handlebars"), 1);
|
|
75
|
+
var __dirname = (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(__VOBS_CJS_FILE_URL));
|
|
76
|
+
var TEMPLATES_ROOT = (0, import_node_path.resolve)(__dirname, "..", "templates");
|
|
65
77
|
function getTemplatesDir() {
|
|
66
78
|
return TEMPLATES_ROOT;
|
|
67
79
|
}
|
|
68
80
|
__name(getTemplatesDir, "getTemplatesDir");
|
|
69
81
|
function renderTemplate(templatePath, context) {
|
|
70
|
-
const source =
|
|
71
|
-
const template =
|
|
82
|
+
const source = (0, import_node_fs.readFileSync)(templatePath, "utf-8");
|
|
83
|
+
const template = import_handlebars.default.compile(source);
|
|
72
84
|
return template(context);
|
|
73
85
|
}
|
|
74
86
|
__name(renderTemplate, "renderTemplate");
|
|
75
87
|
function writeFile(dir, filename, content) {
|
|
76
|
-
const filePath =
|
|
77
|
-
|
|
78
|
-
|
|
88
|
+
const filePath = (0, import_node_path.resolve)(dir, filename);
|
|
89
|
+
(0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(filePath), { recursive: true });
|
|
90
|
+
(0, import_node_fs.writeFileSync)(filePath, content, "utf-8");
|
|
79
91
|
}
|
|
80
92
|
__name(writeFile, "writeFile");
|
|
81
93
|
function ensureDir(dir) {
|
|
82
|
-
if (!
|
|
83
|
-
|
|
94
|
+
if (!(0, import_node_fs.existsSync)(dir)) {
|
|
95
|
+
(0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
84
96
|
}
|
|
85
97
|
}
|
|
86
98
|
__name(ensureDir, "ensureDir");
|
|
87
99
|
|
|
88
100
|
// packages/cli/src/commands/generate.ts
|
|
89
101
|
async function generateCommand(options) {
|
|
90
|
-
const type = options.type || await
|
|
102
|
+
const type = options.type || await p.select({
|
|
91
103
|
message: "What to generate?",
|
|
92
104
|
options: [
|
|
93
105
|
{ value: "component", label: "Component" },
|
|
94
106
|
{ value: "page", label: "Page" }
|
|
95
107
|
]
|
|
96
108
|
});
|
|
97
|
-
if (
|
|
98
|
-
|
|
109
|
+
if (p.isCancel(type)) {
|
|
110
|
+
p.cancel("Cancelled");
|
|
99
111
|
return;
|
|
100
112
|
}
|
|
101
|
-
const name = options.name || await
|
|
113
|
+
const name = options.name || await p.text({
|
|
102
114
|
message: "Name:",
|
|
103
115
|
placeholder: type === "component" ? "Button" : "AboutPage",
|
|
104
116
|
validate: /* @__PURE__ */ __name((v) => !v ? "Name is required" : void 0, "validate")
|
|
105
117
|
});
|
|
106
|
-
if (
|
|
107
|
-
|
|
118
|
+
if (p.isCancel(name)) {
|
|
119
|
+
p.cancel("Cancelled");
|
|
108
120
|
return;
|
|
109
121
|
}
|
|
110
122
|
const templatesDir = getTemplatesDir();
|
|
111
123
|
if (type === "component") {
|
|
112
|
-
const targetDir = options.targetDir ||
|
|
124
|
+
const targetDir = options.targetDir || (0, import_node_path2.resolve)(process.cwd(), "src/components");
|
|
113
125
|
ensureDir(targetDir);
|
|
114
126
|
const context = {
|
|
115
127
|
name: toPascalCase(name),
|
|
116
128
|
kebabName: toKebabCase(name)
|
|
117
129
|
};
|
|
118
130
|
const content = renderTemplate(
|
|
119
|
-
|
|
131
|
+
(0, import_node_path2.resolve)(templatesDir, "component.hbs"),
|
|
120
132
|
context
|
|
121
133
|
);
|
|
122
134
|
const filename = `${context.name}.tsx`;
|
|
123
135
|
writeFile(targetDir, filename, content);
|
|
124
|
-
logger.success(`Created ${type} at ${
|
|
136
|
+
logger.success(`Created ${type} at ${(0, import_node_path2.resolve)(targetDir, filename)}`);
|
|
125
137
|
} else {
|
|
126
|
-
const targetDir = options.targetDir ||
|
|
138
|
+
const targetDir = options.targetDir || (0, import_node_path2.resolve)(process.cwd(), "src/pages");
|
|
127
139
|
ensureDir(targetDir);
|
|
128
140
|
const context = {
|
|
129
141
|
name: toPascalCase(name),
|
|
130
142
|
path: `/${toKebabCase(name)}`
|
|
131
143
|
};
|
|
132
144
|
const content = renderTemplate(
|
|
133
|
-
|
|
145
|
+
(0, import_node_path2.resolve)(templatesDir, "page.hbs"),
|
|
134
146
|
context
|
|
135
147
|
);
|
|
136
148
|
const filename = `${context.name}.tsx`;
|
|
137
149
|
writeFile(targetDir, filename, content);
|
|
138
|
-
logger.success(`Created ${type} at ${
|
|
150
|
+
logger.success(`Created ${type} at ${(0, import_node_path2.resolve)(targetDir, filename)}`);
|
|
139
151
|
}
|
|
140
152
|
}
|
|
141
153
|
__name(generateCommand, "generateCommand");
|
|
@@ -147,7 +159,8 @@ function toKebabCase(str) {
|
|
|
147
159
|
return str.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/[^a-z0-9-]/g, "-").replace(/--+/g, "-").replace(/^-|-$/g, "");
|
|
148
160
|
}
|
|
149
161
|
__name(toKebabCase, "toKebabCase");
|
|
150
|
-
|
|
151
|
-
exports
|
|
152
|
-
|
|
162
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
163
|
+
0 && (module.exports = {
|
|
164
|
+
generateCommand
|
|
165
|
+
});
|
|
153
166
|
//# sourceMappingURL=generate.cjs.map
|
|
@@ -1 +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}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/generate.ts","../../src/utils/logger.ts","../../src/utils/file.ts"],"sourcesContent":["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 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}"],"mappings":"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","names":["import_node_path","pc","Handlebars"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
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
1
|
var __defProp = Object.defineProperty;
|
|
9
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// packages/cli/src/commands/generate.ts
|
|
5
|
+
import { resolve as resolve2 } from "path";
|
|
6
|
+
import * as p from "@clack/prompts";
|
|
7
|
+
|
|
8
|
+
// packages/cli/src/utils/logger.ts
|
|
9
|
+
import pc from "picocolors";
|
|
10
10
|
function timestamp() {
|
|
11
11
|
return pc.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}]`);
|
|
12
12
|
}
|
|
@@ -33,8 +33,14 @@ function step(msg) {
|
|
|
33
33
|
}
|
|
34
34
|
__name(step, "step");
|
|
35
35
|
var logger = { info, success, warn, error, step };
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
|
|
37
|
+
// packages/cli/src/utils/file.ts
|
|
38
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
|
|
39
|
+
import { resolve, dirname } from "path";
|
|
40
|
+
import { fileURLToPath } from "url";
|
|
41
|
+
import Handlebars from "handlebars";
|
|
42
|
+
var __dirname = dirname(fileURLToPath(import.meta.url));
|
|
43
|
+
var TEMPLATES_ROOT = resolve(__dirname, "..", "templates");
|
|
38
44
|
function getTemplatesDir() {
|
|
39
45
|
return TEMPLATES_ROOT;
|
|
40
46
|
}
|
|
@@ -82,33 +88,33 @@ async function generateCommand(options) {
|
|
|
82
88
|
}
|
|
83
89
|
const templatesDir = getTemplatesDir();
|
|
84
90
|
if (type === "component") {
|
|
85
|
-
const targetDir = options.targetDir ||
|
|
91
|
+
const targetDir = options.targetDir || resolve2(process.cwd(), "src/components");
|
|
86
92
|
ensureDir(targetDir);
|
|
87
93
|
const context = {
|
|
88
94
|
name: toPascalCase(name),
|
|
89
95
|
kebabName: toKebabCase(name)
|
|
90
96
|
};
|
|
91
97
|
const content = renderTemplate(
|
|
92
|
-
|
|
98
|
+
resolve2(templatesDir, "component.hbs"),
|
|
93
99
|
context
|
|
94
100
|
);
|
|
95
101
|
const filename = `${context.name}.tsx`;
|
|
96
102
|
writeFile(targetDir, filename, content);
|
|
97
|
-
logger.success(`Created ${type} at ${
|
|
103
|
+
logger.success(`Created ${type} at ${resolve2(targetDir, filename)}`);
|
|
98
104
|
} else {
|
|
99
|
-
const targetDir = options.targetDir ||
|
|
105
|
+
const targetDir = options.targetDir || resolve2(process.cwd(), "src/pages");
|
|
100
106
|
ensureDir(targetDir);
|
|
101
107
|
const context = {
|
|
102
108
|
name: toPascalCase(name),
|
|
103
109
|
path: `/${toKebabCase(name)}`
|
|
104
110
|
};
|
|
105
111
|
const content = renderTemplate(
|
|
106
|
-
|
|
112
|
+
resolve2(templatesDir, "page.hbs"),
|
|
107
113
|
context
|
|
108
114
|
);
|
|
109
115
|
const filename = `${context.name}.tsx`;
|
|
110
116
|
writeFile(targetDir, filename, content);
|
|
111
|
-
logger.success(`Created ${type} at ${
|
|
117
|
+
logger.success(`Created ${type} at ${resolve2(targetDir, filename)}`);
|
|
112
118
|
}
|
|
113
119
|
}
|
|
114
120
|
__name(generateCommand, "generateCommand");
|
|
@@ -120,7 +126,7 @@ function toKebabCase(str) {
|
|
|
120
126
|
return str.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/[^a-z0-9-]/g, "-").replace(/--+/g, "-").replace(/^-|-$/g, "");
|
|
121
127
|
}
|
|
122
128
|
__name(toKebabCase, "toKebabCase");
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
129
|
+
export {
|
|
130
|
+
generateCommand
|
|
131
|
+
};
|
|
126
132
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +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}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/generate.ts","../../src/utils/logger.ts","../../src/utils/file.ts"],"sourcesContent":["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 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}"],"mappings":"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","names":["resolve","resolve"]}
|