yiyuanjs 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +38 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/add.d.ts +3 -0
  6. package/dist/commands/add.d.ts.map +1 -0
  7. package/dist/commands/add.js +78 -0
  8. package/dist/commands/add.js.map +1 -0
  9. package/dist/commands/analyze.d.ts +3 -0
  10. package/dist/commands/analyze.d.ts.map +1 -0
  11. package/dist/commands/analyze.js +66 -0
  12. package/dist/commands/analyze.js.map +1 -0
  13. package/dist/commands/dev.d.ts +3 -0
  14. package/dist/commands/dev.d.ts.map +1 -0
  15. package/dist/commands/dev.js +76 -0
  16. package/dist/commands/dev.js.map +1 -0
  17. package/dist/commands/doctor.d.ts +3 -0
  18. package/dist/commands/doctor.d.ts.map +1 -0
  19. package/dist/commands/doctor.js +41 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/eject.d.ts +3 -0
  22. package/dist/commands/eject.d.ts.map +1 -0
  23. package/dist/commands/eject.js +42 -0
  24. package/dist/commands/eject.js.map +1 -0
  25. package/dist/commands/generate.d.ts +3 -0
  26. package/dist/commands/generate.d.ts.map +1 -0
  27. package/dist/commands/generate.js +205 -0
  28. package/dist/commands/generate.js.map +1 -0
  29. package/dist/commands/guide.d.ts +3 -0
  30. package/dist/commands/guide.d.ts.map +1 -0
  31. package/dist/commands/guide.js +110 -0
  32. package/dist/commands/guide.js.map +1 -0
  33. package/dist/commands/init.d.ts +3 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +74 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/schema.d.ts +3 -0
  38. package/dist/commands/schema.d.ts.map +1 -0
  39. package/dist/commands/schema.js +92 -0
  40. package/dist/commands/schema.js.map +1 -0
  41. package/dist/commands/status.d.ts +3 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +103 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/commands/suggest.d.ts +3 -0
  46. package/dist/commands/suggest.d.ts.map +1 -0
  47. package/dist/commands/suggest.js +30 -0
  48. package/dist/commands/suggest.js.map +1 -0
  49. package/package.json +71 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init.js';
4
+ import { analyzeCommand } from './commands/analyze.js';
5
+ import { generateCommand } from './commands/generate.js';
6
+ import { addCommand } from './commands/add.js';
7
+ import { ejectCommand } from './commands/eject.js';
8
+ import { devCommand } from './commands/dev.js';
9
+ import { statusCommand } from './commands/status.js';
10
+ import { doctorCommand } from './commands/doctor.js';
11
+ import { suggestCommand } from './commands/suggest.js';
12
+ import { guideCommand } from './commands/guide.js';
13
+ import { schemaCommand } from './commands/schema.js';
14
+ const program = new Command();
15
+ program
16
+ .name('yiyuan')
17
+ .description('AI-powered full-stack code generation framework')
18
+ .version('0.1.0');
19
+ program.addCommand(initCommand);
20
+ program.addCommand(analyzeCommand);
21
+ program.addCommand(generateCommand);
22
+ program.addCommand(addCommand);
23
+ program.addCommand(ejectCommand);
24
+ program.addCommand(devCommand);
25
+ program.addCommand(statusCommand);
26
+ program.addCommand(doctorCommand);
27
+ program.addCommand(suggestCommand);
28
+ program.addCommand(guideCommand);
29
+ program.addCommand(schemaCommand);
30
+ // Aliases
31
+ program.command('server').description('Start server only').action(() => {
32
+ devCommand.parse(['--server'], { from: 'user' });
33
+ });
34
+ program.command('frontend').description('Start frontend only').action(() => {
35
+ devCommand.parse(['--frontend'], { from: 'user' });
36
+ });
37
+ program.parse();
38
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,iDAAiD,CAAC;KAC9D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,UAAU;AACV,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;IACrE,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;IACzE,UAAU,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const addCommand: Command;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,UAAU,SAkFnB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { Command } from 'commander';
2
+ import inquirer from 'inquirer';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import chalk from 'chalk';
6
+ export const addCommand = new Command('add')
7
+ .description('Add entity, route, or page to existing project')
8
+ .argument('<type>', 'What to add: entity, route, page')
9
+ .option('-n, --name <name>', 'Name')
10
+ .action(async (type, opts) => {
11
+ const configPath = path.resolve(process.cwd(), 'yiyuan.config.json');
12
+ if (!fs.existsSync(configPath)) {
13
+ console.log(chalk.red('\n yiyuan.config.json not found. Run: yiyuan init\n'));
14
+ process.exit(1);
15
+ }
16
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
17
+ if (type === 'entity') {
18
+ const answers = await inquirer.prompt([
19
+ { type: 'input', name: 'name', message: 'Entity name (PascalCase):', default: opts.name ?? 'NewItem' },
20
+ { type: 'input', name: 'fields', message: 'Fields (name:type,name:type):', default: 'name:string' },
21
+ { type: 'confirm', name: 'crud', message: 'Generate CRUD API?', default: true },
22
+ ]);
23
+ const fields = answers.fields.split(',').map((f) => {
24
+ const [name, type] = f.trim().split(':');
25
+ return { name, type: type ?? 'string', required: true };
26
+ });
27
+ const entity = {
28
+ name: answers.name,
29
+ fields,
30
+ relations: [],
31
+ timestamps: true,
32
+ };
33
+ config.entities.push(entity);
34
+ if (answers.crud) {
35
+ config.apis.push({ entity: answers.name, crud: true, auth: false });
36
+ }
37
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
38
+ console.log(chalk.green(`\n Entity "${answers.name}" added to config`));
39
+ console.log(chalk.dim(' Run: yiyuan generate\n'));
40
+ }
41
+ if (type === 'route') {
42
+ const answers = await inquirer.prompt([
43
+ { type: 'input', name: 'namespace', message: 'Route namespace:', default: opts.name ?? 'custom' },
44
+ { type: 'input', name: 'prefix', message: 'URL prefix:', default: '/api/custom' },
45
+ { type: 'list', name: 'method', message: 'HTTP method:', choices: ['GET', 'POST', 'PUT', 'DELETE'], default: 'GET' },
46
+ { type: 'input', name: 'path', message: 'Path:', default: '/' },
47
+ { type: 'input', name: 'handler', message: 'Handler code:', default: 'res.json({ message: "ok" });' },
48
+ ]);
49
+ if (!config.routes)
50
+ config.routes = {};
51
+ if (!config.routes[answers.namespace]) {
52
+ config.routes[answers.namespace] = { prefix: answers.prefix, routes: [] };
53
+ }
54
+ config.routes[answers.namespace].routes.push({
55
+ method: answers.method,
56
+ path: answers.path,
57
+ handler: answers.handler,
58
+ });
59
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
60
+ console.log(chalk.green(`\n Route added to "${answers.namespace}"\n`));
61
+ }
62
+ if (type === 'page') {
63
+ const answers = await inquirer.prompt([
64
+ { type: 'input', name: 'name', message: 'Page name:', default: opts.name ?? 'NewPage' },
65
+ { type: 'input', name: 'route', message: 'Route path:', default: '/new-page' },
66
+ { type: 'confirm', name: 'auth', message: 'Requires auth?', default: false },
67
+ ]);
68
+ config.pages.push({
69
+ name: answers.name,
70
+ route: answers.route,
71
+ auth: answers.auth,
72
+ components: [],
73
+ });
74
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
75
+ console.log(chalk.green(`\n Page "${answers.name}" added\n`));
76
+ }
77
+ });
78
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const analyzeCommand: Command;
3
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,cAAc,SAiEvB,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { AIAnalyzer, validateProject } from 'yiyuanjs-core';
7
+ import dotenv from 'dotenv';
8
+ dotenv.config();
9
+ export const analyzeCommand = new Command('analyze')
10
+ .description('Analyze requirements and generate schema using AI')
11
+ .argument('<file>', 'Path to requirements file (.md, .txt)')
12
+ .option('-o, --output <file>', 'Output schema file', 'yiyuan.schema.json')
13
+ .option('-m, --model <model>', 'AI model to use', 'gpt-4o-mini')
14
+ .action(async (file, opts) => {
15
+ const apiKey = process.env.OPENAI_API_KEY;
16
+ if (!apiKey) {
17
+ console.log(chalk.red('\n Error: OPENAI_API_KEY not set'));
18
+ console.log(chalk.dim(' Set it in .env or environment variable\n'));
19
+ process.exit(1);
20
+ }
21
+ const filePath = path.resolve(process.cwd(), file);
22
+ if (!fs.existsSync(filePath)) {
23
+ console.log(chalk.red(`\n File not found: ${filePath}\n`));
24
+ process.exit(1);
25
+ }
26
+ const requirement = fs.readFileSync(filePath, 'utf-8');
27
+ const configPath = path.resolve(process.cwd(), 'yiyuan.config.json');
28
+ let techStack;
29
+ if (fs.existsSync(configPath)) {
30
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
31
+ techStack = config.techStack;
32
+ }
33
+ const spinner = ora('Analyzing requirements with AI...').start();
34
+ try {
35
+ const analyzer = new AIAnalyzer({
36
+ provider: 'openai',
37
+ apiKey,
38
+ model: opts.model,
39
+ });
40
+ const result = await analyzer.analyze(requirement, techStack);
41
+ const validation = validateProject({
42
+ ...result.schema,
43
+ techStack: techStack ?? {
44
+ frontend: 'react',
45
+ backend: 'express',
46
+ database: 'prisma',
47
+ },
48
+ });
49
+ if (!validation.success) {
50
+ spinner.warn('Schema validation warnings:');
51
+ validation.errors?.forEach((e) => console.log(chalk.yellow(` ${e}`)));
52
+ }
53
+ const output = validation.data ?? result.schema;
54
+ const outputPath = path.resolve(process.cwd(), opts.output);
55
+ fs.writeFileSync(outputPath, JSON.stringify(output, null, 2), 'utf-8');
56
+ spinner.succeed(chalk.green(`Schema generated: ${opts.output}`));
57
+ console.log(chalk.dim(` Entities: ${(output.entities ?? []).length}`));
58
+ console.log(chalk.dim(` Pages: ${(output.pages ?? []).length}`));
59
+ console.log(chalk.dim(` APIs: ${(output.apis ?? []).length}\n`));
60
+ }
61
+ catch (err) {
62
+ spinner.fail(chalk.red(`AI analysis failed: ${err.message}\n`));
63
+ process.exit(1);
64
+ }
65
+ });
66
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const devCommand: Command;
3
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CpC,eAAO,MAAM,UAAU,SA2CnB,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { spawn } from 'node:child_process';
6
+ import { scanProject } from 'yiyuanjs-core';
7
+ function run(cmd, args, cwd) {
8
+ const p = spawn(cmd, args, { cwd, stdio: 'inherit', shell: true });
9
+ p.on('close', (code) => {
10
+ if (code !== 0)
11
+ console.log(chalk.red(`Process exited with code ${code}`));
12
+ });
13
+ return p;
14
+ }
15
+ function getServerCommand(root) {
16
+ const scan = scanProject(root);
17
+ const backend = scan.techStack.backend;
18
+ if (['fastapi', 'flask', 'django'].includes(backend ?? '')) {
19
+ const cmd = backend === 'fastapi' ? 'uvicorn' : backend === 'flask' ? 'flask' : 'python';
20
+ const args = backend === 'fastapi' ? ['main:app', '--reload', '--port', '3000']
21
+ : backend === 'flask' ? ['run', '--debug', '--port', '3000']
22
+ : ['manage.py', 'runserver', '3000'];
23
+ return { cmd, args };
24
+ }
25
+ if (['gin', 'fiber'].includes(backend ?? '')) {
26
+ return { cmd: 'go', args: ['run', 'main.go'] };
27
+ }
28
+ // JS/TS backends
29
+ return { cmd: 'npm', args: ['run', 'dev'] };
30
+ }
31
+ function getFrontendCommand(root) {
32
+ const scan = scanProject(root);
33
+ const frontend = scan.techStack.frontend;
34
+ if (frontend === 'alpine-pico') {
35
+ return { cmd: 'npx', args: ['serve', '.', '-p', '5173', '-s'] };
36
+ }
37
+ return { cmd: 'npm', args: ['run', 'dev'] };
38
+ }
39
+ export const devCommand = new Command('dev')
40
+ .description('Start development environment')
41
+ .option('--server', 'Start server only')
42
+ .option('--frontend', 'Start frontend only')
43
+ .action(async (opts) => {
44
+ const root = process.cwd();
45
+ const hasServer = fs.existsSync(path.join(root, 'server'));
46
+ const hasFrontend = fs.existsSync(path.join(root, 'frontend'));
47
+ if (!hasServer && !hasFrontend) {
48
+ console.log(chalk.red('\n No project found. Run: yiyuan generate\n'));
49
+ process.exit(1);
50
+ }
51
+ const procs = [];
52
+ if (hasServer && (!opts.frontend || opts.server)) {
53
+ const cmd = getServerCommand(root);
54
+ if (cmd) {
55
+ console.log(chalk.cyan(` Starting server... (${cmd.cmd} ${cmd.args.join(' ')})`));
56
+ procs.push(run(cmd.cmd, cmd.args, path.join(root, 'server')));
57
+ }
58
+ }
59
+ if (hasFrontend && (!opts.server || opts.frontend)) {
60
+ const cmd = getFrontendCommand(root);
61
+ if (cmd) {
62
+ console.log(chalk.cyan(` Starting frontend... (${cmd.cmd} ${cmd.args.join(' ')})`));
63
+ procs.push(run(cmd.cmd, cmd.args, path.join(root, 'frontend')));
64
+ }
65
+ }
66
+ if (procs.length === 0) {
67
+ console.log(chalk.yellow('\n Nothing to start\n'));
68
+ return;
69
+ }
70
+ console.log(chalk.dim('\n Press Ctrl+C to stop\n'));
71
+ process.on('SIGINT', () => {
72
+ procs.forEach(p => p.kill());
73
+ process.exit(0);
74
+ });
75
+ });
76
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const doctorCommand: Command;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAsCtB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { scanProject } from 'yiyuanjs-core';
4
+ export const doctorCommand = new Command('doctor')
5
+ .description('Diagnose project issues and suggest fixes')
6
+ .option('--fix', 'Auto-fix issues where possible')
7
+ .action(async (opts) => {
8
+ const root = process.cwd();
9
+ const scan = scanProject(root);
10
+ console.log(chalk.cyan('\n yiyuanjs - Doctor\n'));
11
+ if (scan.issues.length === 0) {
12
+ console.log(chalk.green(' �?No issues found. Project looks healthy!\n'));
13
+ return;
14
+ }
15
+ let errors = 0;
16
+ let warnings = 0;
17
+ for (const issue of scan.issues) {
18
+ if (issue.level === 'error') {
19
+ errors++;
20
+ console.log(chalk.red(` �?ERROR: ${issue.message}`));
21
+ }
22
+ else if (issue.level === 'warn') {
23
+ warnings++;
24
+ console.log(chalk.yellow(` ! WARN: ${issue.message}`));
25
+ }
26
+ else {
27
+ console.log(chalk.blue(` i INFO: ${issue.message}`));
28
+ }
29
+ if (issue.file)
30
+ console.log(chalk.dim(` File: ${issue.file}`));
31
+ if (issue.fix)
32
+ console.log(chalk.cyan(` Fix: ${issue.fix}`));
33
+ console.log();
34
+ }
35
+ console.log(chalk.dim(' ─────────────────────────────────'));
36
+ console.log(` ${chalk.red(`${errors} errors`)} ${chalk.yellow(`${warnings} warnings`)}`);
37
+ if (errors > 0) {
38
+ console.log(chalk.dim('\n Run `yiyuan doctor --fix` to auto-fix where possible\n'));
39
+ }
40
+ });
41
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,OAAO,EAAE,gCAAgC,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAClC,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,WAAW,CAAC,EAAE,CAAC,CAAC;IAE3F,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACvF,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const ejectCommand: Command;
3
+ //# sourceMappingURL=eject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SAwCrB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import chalk from 'chalk';
5
+ const TEMPLATE_DIR = 'templates';
6
+ export const ejectCommand = new Command('eject')
7
+ .description('Eject templates for customization')
8
+ .option('--only <part>', 'Eject only: frontend, backend, database')
9
+ .action(async (opts) => {
10
+ const outputDir = path.resolve(process.cwd(), TEMPLATE_DIR);
11
+ fs.mkdirSync(outputDir, { recursive: true });
12
+ const coreDist = path.resolve(__dirname, '../../core/dist/generator');
13
+ const srcDir = path.resolve(__dirname, '../../core/src/generator');
14
+ const generators = [
15
+ { name: 'prisma', file: 'prisma.ts', category: 'database' },
16
+ { name: 'drizzle', file: 'drizzle.ts', category: 'database' },
17
+ { name: 'typeorm', file: 'typeorm.ts', category: 'database' },
18
+ { name: 'express', file: 'express.ts', category: 'backend' },
19
+ { name: 'nestjs', file: 'nestjs.ts', category: 'backend' },
20
+ { name: 'hono', file: 'hono.ts', category: 'backend' },
21
+ { name: 'react', file: 'react.ts', category: 'frontend' },
22
+ { name: 'vue', file: 'vue.ts', category: 'frontend' },
23
+ { name: 'next', file: 'next.ts', category: 'frontend' },
24
+ { name: 'nuxt', file: 'nuxt.ts', category: 'frontend' },
25
+ { name: 'auth', file: 'auth.ts', category: 'auth' },
26
+ ];
27
+ let count = 0;
28
+ for (const gen of generators) {
29
+ if (opts.only && gen.category !== opts.only)
30
+ continue;
31
+ const srcPath = path.join(srcDir, gen.file);
32
+ const destPath = path.join(outputDir, gen.file);
33
+ if (fs.existsSync(srcPath)) {
34
+ fs.copyFileSync(srcPath, destPath);
35
+ count++;
36
+ }
37
+ }
38
+ console.log(chalk.green(`\n Ejected ${count} template files to ${TEMPLATE_DIR}/`));
39
+ console.log(chalk.dim(' Edit these files to customize code generation'));
40
+ console.log(chalk.dim(' Then run: yiyuan generate --templates ./' + TEMPLATE_DIR + '\n'));
41
+ });
42
+ //# sourceMappingURL=eject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eject.js","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateCommand: Command;
3
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,eAAe,SA6HxB,CAAC"}