@vira-ui/cli 0.3.0-alpha
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/index.js +328 -0
- package/package.json +46 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Vira CLI - Генератор проектов и компонентов
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* npx vira create project
|
|
8
|
+
* npx vira generate service user
|
|
9
|
+
* npx vira generate component Button
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
const commander_1 = require("commander");
|
|
49
|
+
const fs = __importStar(require("fs-extra"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
52
|
+
const program = new commander_1.Command();
|
|
53
|
+
program
|
|
54
|
+
.name("vira")
|
|
55
|
+
.description("ViraJS CLI - Create projects and generate code")
|
|
56
|
+
.version("0.3.0-alpha");
|
|
57
|
+
/**
|
|
58
|
+
* Создание проекта
|
|
59
|
+
*/
|
|
60
|
+
program
|
|
61
|
+
.command("create")
|
|
62
|
+
.description("Create a new Vira project")
|
|
63
|
+
.argument("<name>", "Project name")
|
|
64
|
+
.option("-t, --template <template>", "Template type", "default")
|
|
65
|
+
.action(async (name, options) => {
|
|
66
|
+
console.log(chalk_1.default.blue(`Creating Vira project: ${name}`));
|
|
67
|
+
const projectPath = path.resolve(process.cwd(), name);
|
|
68
|
+
// Проверяем, существует ли директория
|
|
69
|
+
if (await fs.pathExists(projectPath)) {
|
|
70
|
+
console.error(chalk_1.default.red(`Directory ${name} already exists!`));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
// Создаём структуру проекта
|
|
74
|
+
await createProjectStructure(projectPath, options.template);
|
|
75
|
+
console.log(chalk_1.default.green(`✓ Project ${name} created successfully!`));
|
|
76
|
+
console.log(chalk_1.default.yellow(`\nNext steps:`));
|
|
77
|
+
console.log(` cd ${name}`);
|
|
78
|
+
console.log(` npm install`);
|
|
79
|
+
console.log(` npm run dev`);
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* Генерация компонента
|
|
83
|
+
*/
|
|
84
|
+
program
|
|
85
|
+
.command("generate")
|
|
86
|
+
.alias("g")
|
|
87
|
+
.description("Generate code")
|
|
88
|
+
.argument("<type>", "Type: component, service, page, model, route")
|
|
89
|
+
.argument("<name>", "Name")
|
|
90
|
+
.option("-d, --dir <directory>", "Output directory", "src")
|
|
91
|
+
.action(async (type, name, options) => {
|
|
92
|
+
console.log(chalk_1.default.blue(`Generating ${type}: ${name}`));
|
|
93
|
+
switch (type) {
|
|
94
|
+
case "component":
|
|
95
|
+
case "comp":
|
|
96
|
+
await generateComponent(name, options.dir);
|
|
97
|
+
break;
|
|
98
|
+
case "service":
|
|
99
|
+
await generateService(name, options.dir);
|
|
100
|
+
break;
|
|
101
|
+
case "page":
|
|
102
|
+
await generatePage(name, options.dir);
|
|
103
|
+
break;
|
|
104
|
+
case "model":
|
|
105
|
+
await generateModel(name, options.dir);
|
|
106
|
+
break;
|
|
107
|
+
case "route":
|
|
108
|
+
await generateRoute(name, options.dir);
|
|
109
|
+
break;
|
|
110
|
+
default:
|
|
111
|
+
console.error(chalk_1.default.red(`Unknown type: ${type}`));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
console.log(chalk_1.default.green(`✓ ${type} ${name} generated successfully!`));
|
|
115
|
+
});
|
|
116
|
+
program.parse(process.argv);
|
|
117
|
+
/**
|
|
118
|
+
* Создание структуры проекта
|
|
119
|
+
*/
|
|
120
|
+
async function createProjectStructure(projectPath, template) {
|
|
121
|
+
// Базовые директории
|
|
122
|
+
await fs.ensureDir(path.join(projectPath, "src", "components"));
|
|
123
|
+
await fs.ensureDir(path.join(projectPath, "src", "services"));
|
|
124
|
+
await fs.ensureDir(path.join(projectPath, "src", "pages"));
|
|
125
|
+
await fs.ensureDir(path.join(projectPath, "src", "models"));
|
|
126
|
+
await fs.ensureDir(path.join(projectPath, "src", "utils"));
|
|
127
|
+
// package.json
|
|
128
|
+
const packageJson = {
|
|
129
|
+
name: path.basename(projectPath),
|
|
130
|
+
version: "0.1.0",
|
|
131
|
+
private: true,
|
|
132
|
+
scripts: {
|
|
133
|
+
dev: "vite",
|
|
134
|
+
build: "vite build",
|
|
135
|
+
preview: "vite preview",
|
|
136
|
+
},
|
|
137
|
+
dependencies: {
|
|
138
|
+
"@vira-ui/core": "^0.3.0-alpha",
|
|
139
|
+
"@vira-ui/ui": "^0.3.0-alpha",
|
|
140
|
+
},
|
|
141
|
+
devDependencies: {
|
|
142
|
+
"@vira-ui/babel-plugin": "^0.3.0-alpha",
|
|
143
|
+
"@types/node": "^20.10.0",
|
|
144
|
+
"typescript": "^5.3.0",
|
|
145
|
+
"vite": "^5.0.0",
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
await fs.writeJSON(path.join(projectPath, "package.json"), packageJson, { spaces: 2 });
|
|
149
|
+
// tsconfig.json
|
|
150
|
+
const tsconfig = {
|
|
151
|
+
compilerOptions: {
|
|
152
|
+
target: "ES2020",
|
|
153
|
+
module: "ESNext",
|
|
154
|
+
lib: ["ES2020", "DOM", "DOM.Iterable"],
|
|
155
|
+
jsx: "react-jsx",
|
|
156
|
+
jsxImportSource: "@vira-ui/core",
|
|
157
|
+
moduleResolution: "bundler",
|
|
158
|
+
resolveJsonModule: true,
|
|
159
|
+
allowJs: true,
|
|
160
|
+
strict: true,
|
|
161
|
+
noEmit: true,
|
|
162
|
+
esModuleInterop: true,
|
|
163
|
+
skipLibCheck: true,
|
|
164
|
+
forceConsistentCasingInFileNames: true,
|
|
165
|
+
},
|
|
166
|
+
include: ["src"],
|
|
167
|
+
};
|
|
168
|
+
await fs.writeJSON(path.join(projectPath, "tsconfig.json"), tsconfig, { spaces: 2 });
|
|
169
|
+
// vite.config.ts
|
|
170
|
+
const viteConfig = `import { defineConfig } from 'vite';
|
|
171
|
+
import react from '@vitejs/plugin-react';
|
|
172
|
+
import vira from '@vira-ui/babel-plugin';
|
|
173
|
+
|
|
174
|
+
export default defineConfig({
|
|
175
|
+
plugins: [
|
|
176
|
+
react({
|
|
177
|
+
babel: {
|
|
178
|
+
plugins: [vira],
|
|
179
|
+
},
|
|
180
|
+
}),
|
|
181
|
+
],
|
|
182
|
+
});
|
|
183
|
+
`;
|
|
184
|
+
await fs.writeFile(path.join(projectPath, "vite.config.ts"), viteConfig);
|
|
185
|
+
// index.html
|
|
186
|
+
const indexHtml = `<!DOCTYPE html>
|
|
187
|
+
<html lang="en">
|
|
188
|
+
<head>
|
|
189
|
+
<meta charset="UTF-8" />
|
|
190
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
191
|
+
<title>Vira App</title>
|
|
192
|
+
</head>
|
|
193
|
+
<body>
|
|
194
|
+
<div id="root"></div>
|
|
195
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
196
|
+
</body>
|
|
197
|
+
</html>
|
|
198
|
+
`;
|
|
199
|
+
await fs.writeFile(path.join(projectPath, "index.html"), indexHtml);
|
|
200
|
+
// src/main.tsx
|
|
201
|
+
const mainTsx = `import { render } from '@vira-ui/core';
|
|
202
|
+
import { App } from './App';
|
|
203
|
+
|
|
204
|
+
const root = document.getElementById('root');
|
|
205
|
+
if (root) {
|
|
206
|
+
render(<App />, root);
|
|
207
|
+
}
|
|
208
|
+
`;
|
|
209
|
+
await fs.writeFile(path.join(projectPath, "src", "main.tsx"), mainTsx);
|
|
210
|
+
// src/App.tsx
|
|
211
|
+
const appTsx = `import { createElement } from '@vira-ui/core';
|
|
212
|
+
|
|
213
|
+
export function App() {
|
|
214
|
+
return createElement('div', { className: 'app' },
|
|
215
|
+
createElement('h1', null, 'Welcome to Vira!')
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
`;
|
|
219
|
+
await fs.writeFile(path.join(projectPath, "src", "App.tsx"), appTsx);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Генерация компонента
|
|
223
|
+
*/
|
|
224
|
+
async function generateComponent(name, dir) {
|
|
225
|
+
const componentPath = path.join(process.cwd(), dir, "components", `${name}.tsx`);
|
|
226
|
+
await fs.ensureDir(path.dirname(componentPath));
|
|
227
|
+
const componentCode = `import { createElement } from '@vira-ui/core';
|
|
228
|
+
import type { ViraComponentProps } from '@vira-ui/core';
|
|
229
|
+
|
|
230
|
+
export interface ${name}Props extends ViraComponentProps {
|
|
231
|
+
// Add your props here
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function ${name}(props: ${name}Props) {
|
|
235
|
+
return createElement('div', { className: '${name.toLowerCase()}' },
|
|
236
|
+
// Add your content here
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
`;
|
|
240
|
+
await fs.writeFile(componentPath, componentCode);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Генерация сервиса
|
|
244
|
+
*/
|
|
245
|
+
async function generateService(name, dir) {
|
|
246
|
+
const servicePath = path.join(process.cwd(), dir, "services", `${name}Service.ts`);
|
|
247
|
+
await fs.ensureDir(path.dirname(servicePath));
|
|
248
|
+
const serviceCode = `import { createViraService, signal } from '@vira-ui/core';
|
|
249
|
+
|
|
250
|
+
export const ${name}Service = createViraService('${name.toLowerCase()}', () => {
|
|
251
|
+
const data = signal([]);
|
|
252
|
+
const loading = signal(false);
|
|
253
|
+
const error = signal<string | null>(null);
|
|
254
|
+
|
|
255
|
+
const fetch = async () => {
|
|
256
|
+
loading.set(true);
|
|
257
|
+
try {
|
|
258
|
+
// Add your logic here
|
|
259
|
+
// const result = await api.get('/${name.toLowerCase()}');
|
|
260
|
+
// data.set(result);
|
|
261
|
+
} catch (e) {
|
|
262
|
+
error.set(e instanceof Error ? e.message : 'Unknown error');
|
|
263
|
+
} finally {
|
|
264
|
+
loading.set(false);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
data,
|
|
270
|
+
loading,
|
|
271
|
+
error,
|
|
272
|
+
fetch,
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
`;
|
|
276
|
+
await fs.writeFile(servicePath, serviceCode);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Генерация страницы
|
|
280
|
+
*/
|
|
281
|
+
async function generatePage(name, dir) {
|
|
282
|
+
const pagePath = path.join(process.cwd(), dir, "pages", `${name}Page.tsx`);
|
|
283
|
+
await fs.ensureDir(path.dirname(pagePath));
|
|
284
|
+
const pageCode = `import { createElement } from '@vira-ui/core';
|
|
285
|
+
|
|
286
|
+
export function ${name}Page() {
|
|
287
|
+
return createElement('div', { className: '${name.toLowerCase()}-page' },
|
|
288
|
+
createElement('h1', null, '${name}'),
|
|
289
|
+
// Add your content here
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
`;
|
|
293
|
+
await fs.writeFile(pagePath, pageCode);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Генерация модели
|
|
297
|
+
*/
|
|
298
|
+
async function generateModel(name, dir) {
|
|
299
|
+
const modelPath = path.join(process.cwd(), dir, "models", `${name}.ts`);
|
|
300
|
+
await fs.ensureDir(path.dirname(modelPath));
|
|
301
|
+
const modelCode = `import { defineModel } from '@vira-ui/core';
|
|
302
|
+
|
|
303
|
+
export const ${name}Model = defineModel({
|
|
304
|
+
// Add your fields here
|
|
305
|
+
id: {
|
|
306
|
+
type: 'string',
|
|
307
|
+
required: true,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
`;
|
|
311
|
+
await fs.writeFile(modelPath, modelCode);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Генерация роута
|
|
315
|
+
*/
|
|
316
|
+
async function generateRoute(name, dir) {
|
|
317
|
+
const routePath = path.join(process.cwd(), dir, "routes", `${name}.ts`);
|
|
318
|
+
await fs.ensureDir(path.dirname(routePath));
|
|
319
|
+
const routeCode = `import { reactiveRoute } from '@vira-ui/core';
|
|
320
|
+
import { ${name}Page } from '../pages/${name}Page';
|
|
321
|
+
|
|
322
|
+
export const ${name}Route = reactiveRoute({
|
|
323
|
+
path: '/${name.toLowerCase()}',
|
|
324
|
+
component: ${name}Page,
|
|
325
|
+
});
|
|
326
|
+
`;
|
|
327
|
+
await fs.writeFile(routePath, routeCode);
|
|
328
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vira-ui/cli",
|
|
3
|
+
"version": "0.3.0-alpha",
|
|
4
|
+
"description": "CLI tool for ViraJS project generation",
|
|
5
|
+
"author": "Vira Team",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/vira-ui/vira-ui"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"vira",
|
|
13
|
+
"cli",
|
|
14
|
+
"generator",
|
|
15
|
+
"scaffold",
|
|
16
|
+
"framework",
|
|
17
|
+
"react",
|
|
18
|
+
"ui"
|
|
19
|
+
],
|
|
20
|
+
"bin": {
|
|
21
|
+
"vira": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"main": "dist/index.js",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"dev": "tsc --watch",
|
|
30
|
+
"prepublishOnly": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"commander": "^11.1.0",
|
|
34
|
+
"fs-extra": "^11.2.0",
|
|
35
|
+
"chalk": "^4.1.2",
|
|
36
|
+
"inquirer": "^8.2.6",
|
|
37
|
+
"glob": "^10.3.10"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/fs-extra": "^11.0.4",
|
|
41
|
+
"@types/inquirer": "^8.2.10",
|
|
42
|
+
"@types/node": "^20.10.0",
|
|
43
|
+
"typescript": "^5.3.0"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|