kybernus 2.4.0 → 3.0.1

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 (137) hide show
  1. package/README.md +15 -6
  2. package/add-features/auth/java-spring/AuthController.java +54 -0
  3. package/add-features/auth/java-spring/AuthService.java +85 -0
  4. package/add-features/auth/java-spring/INSTRUCTIONS.md +119 -0
  5. package/add-features/auth/java-spring/dto/LoginRequest.java +22 -0
  6. package/add-features/auth/java-spring/dto/RegisterRequest.java +22 -0
  7. package/add-features/auth/java-spring/security/JwtRequestFilter.java +45 -0
  8. package/add-features/auth/java-spring/security/JwtUtil.java +59 -0
  9. package/add-features/auth/java-spring/security/SecurityConfig.java +39 -0
  10. package/add-features/auth/nestjs/INSTRUCTIONS.md +112 -0
  11. package/add-features/auth/nestjs/auth.controller.ts +27 -0
  12. package/add-features/auth/nestjs/auth.module.ts +20 -0
  13. package/add-features/auth/nestjs/auth.service.ts +81 -0
  14. package/add-features/auth/nestjs/dto/login.dto.ts +4 -0
  15. package/add-features/auth/nestjs/dto/register.dto.ts +4 -0
  16. package/add-features/auth/nestjs/jwt-auth.guard.ts +17 -0
  17. package/add-features/auth/nestjs/jwt.strategy.ts +24 -0
  18. package/add-features/auth/nextjs/INSTRUCTIONS.md +97 -0
  19. package/add-features/auth/nextjs/jwt.ts +21 -0
  20. package/add-features/auth/nextjs/middleware.ts +37 -0
  21. package/add-features/auth/nextjs/routes/login.ts +43 -0
  22. package/add-features/auth/nextjs/routes/register.ts +50 -0
  23. package/add-features/auth/nextjs/session.ts +28 -0
  24. package/add-features/auth/nodejs-express/INSTRUCTIONS.md +109 -0
  25. package/add-features/auth/nodejs-express/auth.controller.ts +59 -0
  26. package/add-features/auth/nodejs-express/auth.middleware.ts +38 -0
  27. package/add-features/auth/nodejs-express/auth.routes.ts +15 -0
  28. package/add-features/auth/nodejs-express/auth.service.ts +73 -0
  29. package/add-features/auth/nodejs-express/jwt.config.ts +17 -0
  30. package/add-features/auth/python-fastapi/INSTRUCTIONS.md +100 -0
  31. package/add-features/auth/python-fastapi/router.py +26 -0
  32. package/add-features/auth/python-fastapi/schemas.py +25 -0
  33. package/add-features/auth/python-fastapi/security.py +37 -0
  34. package/add-features/auth/python-fastapi/service.py +61 -0
  35. package/add-features/deploy/dockerfiles/Dockerfile.java +22 -0
  36. package/add-features/deploy/dockerfiles/Dockerfile.nextjs +32 -0
  37. package/add-features/deploy/dockerfiles/Dockerfile.nodejs +25 -0
  38. package/add-features/deploy/dockerfiles/Dockerfile.python +17 -0
  39. package/add-features/deploy/fly/INSTRUCTIONS.md +39 -0
  40. package/add-features/deploy/fly/java-spring.toml +21 -0
  41. package/add-features/deploy/fly/nextjs.toml +16 -0
  42. package/add-features/deploy/fly/nodejs.toml +21 -0
  43. package/add-features/deploy/fly/python-fastapi.toml +21 -0
  44. package/add-features/deploy/railway/INSTRUCTIONS.md +38 -0
  45. package/add-features/deploy/railway/java-spring.toml +16 -0
  46. package/add-features/deploy/railway/nextjs.toml +14 -0
  47. package/add-features/deploy/railway/nodejs.toml +14 -0
  48. package/add-features/deploy/railway/python-fastapi.toml +13 -0
  49. package/add-features/deploy/render/INSTRUCTIONS.md +35 -0
  50. package/add-features/deploy/render/java-spring.yaml +14 -0
  51. package/add-features/deploy/render/nextjs.yaml +17 -0
  52. package/add-features/deploy/render/nodejs.yaml +15 -0
  53. package/add-features/deploy/render/python-fastapi.yaml +13 -0
  54. package/add-features/deploy/vercel/INSTRUCTIONS.md +40 -0
  55. package/add-features/deploy/vercel/nextjs.json +16 -0
  56. package/add-features/deploy/vercel/nodejs-express.json +21 -0
  57. package/add-features/deploy/vercel/python-fastapi.json +21 -0
  58. package/add-features/husky/INSTRUCTIONS.md +52 -0
  59. package/add-features/husky/commit-msg +4 -0
  60. package/add-features/husky/commitlint.config.js +3 -0
  61. package/add-features/husky/pre-commit +4 -0
  62. package/add-features/redis/.env.snippet +1 -0
  63. package/add-features/redis/INSTRUCTIONS.md +64 -0
  64. package/add-features/redis/docker-compose.snippet.yml +18 -0
  65. package/add-features/redis/java-spring.java +27 -0
  66. package/add-features/redis/nextjs.ts +23 -0
  67. package/add-features/redis/nodejs.ts +14 -0
  68. package/add-features/redis/python.py +22 -0
  69. package/add-features/swagger/INSTRUCTIONS.md +53 -0
  70. package/add-features/swagger/java-spring.java +34 -0
  71. package/add-features/swagger/nestjs.ts +16 -0
  72. package/add-features/swagger/nextjs-route.ts +11 -0
  73. package/add-features/swagger/nextjs-swagger.ts +17 -0
  74. package/add-features/swagger/nodejs-express.ts +30 -0
  75. package/add-features/swagger/python-fastapi.py +21 -0
  76. package/add-features/websocket/INSTRUCTIONS.md +63 -0
  77. package/add-features/websocket/java-spring.java +60 -0
  78. package/add-features/websocket/nestjs.ts +38 -0
  79. package/add-features/websocket/nodejs-express.ts +38 -0
  80. package/add-features/websocket/python-fastapi.py +41 -0
  81. package/dist/cli/commands/add.d.ts +11 -0
  82. package/dist/cli/commands/add.d.ts.map +1 -0
  83. package/dist/cli/commands/add.js +102 -0
  84. package/dist/cli/commands/add.js.map +1 -0
  85. package/dist/cli/commands/auth.d.ts +11 -0
  86. package/dist/cli/commands/auth.d.ts.map +1 -0
  87. package/dist/cli/commands/auth.js +71 -0
  88. package/dist/cli/commands/auth.js.map +1 -0
  89. package/dist/cli/commands/deploy.d.ts +10 -0
  90. package/dist/cli/commands/deploy.d.ts.map +1 -0
  91. package/dist/cli/commands/deploy.js +110 -0
  92. package/dist/cli/commands/deploy.js.map +1 -0
  93. package/dist/cli/commands/doctor.d.ts +3 -0
  94. package/dist/cli/commands/doctor.d.ts.map +1 -0
  95. package/dist/cli/commands/doctor.js +110 -0
  96. package/dist/cli/commands/doctor.js.map +1 -0
  97. package/dist/cli/commands/init.d.ts +1 -0
  98. package/dist/cli/commands/init.d.ts.map +1 -1
  99. package/dist/cli/commands/init.js +1 -0
  100. package/dist/cli/commands/init.js.map +1 -1
  101. package/dist/cli/prompts/wizard.d.ts +1 -0
  102. package/dist/cli/prompts/wizard.d.ts.map +1 -1
  103. package/dist/cli/prompts/wizard.js +23 -15
  104. package/dist/cli/prompts/wizard.js.map +1 -1
  105. package/dist/cli/utils/cli-helpers.d.ts +43 -0
  106. package/dist/cli/utils/cli-helpers.d.ts.map +1 -0
  107. package/dist/cli/utils/cli-helpers.js +107 -0
  108. package/dist/cli/utils/cli-helpers.js.map +1 -0
  109. package/dist/core/deploy/deploy-generator.d.ts +18 -0
  110. package/dist/core/deploy/deploy-generator.d.ts.map +1 -0
  111. package/dist/core/deploy/deploy-generator.js +155 -0
  112. package/dist/core/deploy/deploy-generator.js.map +1 -0
  113. package/dist/core/features/feature-generator.d.ts +26 -0
  114. package/dist/core/features/feature-generator.d.ts.map +1 -0
  115. package/dist/core/features/feature-generator.js +376 -0
  116. package/dist/core/features/feature-generator.js.map +1 -0
  117. package/dist/core/generator/project.d.ts.map +1 -1
  118. package/dist/core/generator/project.js +42 -2
  119. package/dist/core/generator/project.js.map +1 -1
  120. package/dist/core/templates/engine.d.ts.map +1 -1
  121. package/dist/core/templates/engine.js +4 -0
  122. package/dist/core/templates/engine.js.map +1 -1
  123. package/dist/index.js +9 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/models/config.d.ts +1 -0
  126. package/dist/models/config.d.ts.map +1 -1
  127. package/package.json +14 -2
  128. package/templates/nestjs/clean/package.json.hbs +51 -41
  129. package/templates/nestjs/hexagonal/package.json.hbs +51 -41
  130. package/templates/nestjs/mvc/package.json.hbs +49 -39
  131. package/templates/nextjs/mvc/package.json.hbs +46 -36
  132. package/templates/nodejs-express/clean/package.json.hbs +69 -59
  133. package/templates/nodejs-express/hexagonal/package.json.hbs +69 -59
  134. package/templates/nodejs-express/mvc/package.json.hbs +67 -57
  135. /package/templates/nestjs/hexagonal/prisma/{schema.prisma → schema.prisma.hbs} +0 -0
  136. /package/templates/nodejs-express/clean/prisma/{schema.prisma → schema.prisma.hbs} +0 -0
  137. /package/templates/nodejs-express/hexagonal/prisma/{schema.prisma → schema.prisma.hbs} +0 -0
@@ -0,0 +1,110 @@
1
+ import { Command } from 'commander';
2
+ import * as clack from '@clack/prompts';
3
+ import color from 'picocolors';
4
+ import { execSync } from 'child_process';
5
+ import fs from 'fs-extra';
6
+ import path from 'path';
7
+ export const doctorCommand = new Command('doctor')
8
+ .description('Check the health of your environment and project')
9
+ .action(async () => {
10
+ clack.intro(color.bgCyan(color.black(' Kybernus Doctor ')));
11
+ const s = clack.spinner();
12
+ s.start('Diagnosing environment...');
13
+ const checkCommand = (cmd) => {
14
+ try {
15
+ return execSync(cmd, { stdio: 'pipe', encoding: 'utf-8' }).trim();
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ };
21
+ const envChecks = [
22
+ { name: 'Node.js', cmd: 'node -v' },
23
+ { name: 'npm', cmd: 'npm -v' },
24
+ { name: 'yarn', cmd: 'yarn -v' },
25
+ { name: 'pnpm', cmd: 'pnpm -v' },
26
+ { name: 'Python', cmd: 'python3 --version || python --version' },
27
+ { name: 'Java', cmd: 'java -version 2>&1 | head -n 1' },
28
+ { name: 'Maven', cmd: 'mvn -v | head -n 1' },
29
+ { name: 'Docker', cmd: 'docker -v' }
30
+ ];
31
+ const results = envChecks.map(check => {
32
+ const result = checkCommand(check.cmd);
33
+ return {
34
+ name: check.name,
35
+ installed: !!result,
36
+ version: result ? (result.includes('\n') ? result.split('\n')[0] : result) : 'Not found'
37
+ };
38
+ });
39
+ s.stop('Environment diagnosis complete.');
40
+ clack.log.step('Global Environment');
41
+ results.forEach(res => {
42
+ if (res.installed) {
43
+ clack.log.success(`${color.green('✔')} ${res.name}: ${color.dim(res.version)}`);
44
+ }
45
+ else {
46
+ clack.log.message(`${color.gray('○')} ${res.name}: ${color.dim('Not installed (Optional depending on stack)')}`);
47
+ }
48
+ });
49
+ // Project Checks
50
+ const cwd = process.cwd();
51
+ clack.log.step('Project Context');
52
+ const hasPackageJson = fs.existsSync(path.join(cwd, 'package.json'));
53
+ const hasPomXml = fs.existsSync(path.join(cwd, 'pom.xml'));
54
+ const hasRequirementsTxt = fs.existsSync(path.join(cwd, 'requirements.txt'));
55
+ let projectType = [];
56
+ let isProject = false;
57
+ if (hasPackageJson) {
58
+ isProject = true;
59
+ projectType.push('Node.js');
60
+ const hasNodeModules = fs.existsSync(path.join(cwd, 'node_modules'));
61
+ if (hasNodeModules) {
62
+ clack.log.success(`${color.green('✔')} Dependencies: node_modules found`);
63
+ }
64
+ else {
65
+ clack.log.warn(`${color.yellow('▲')} Dependencies: node_modules missing. Run 'npm install', 'yarn', or 'pnpm install'`);
66
+ }
67
+ }
68
+ if (hasPomXml) {
69
+ isProject = true;
70
+ projectType.push('Java/Maven');
71
+ clack.log.success(`${color.green('✔')} Dependencies: pom.xml found`);
72
+ }
73
+ if (hasRequirementsTxt) {
74
+ isProject = true;
75
+ projectType.push('Python');
76
+ // Try to detect venv
77
+ const hasVenv = fs.existsSync(path.join(cwd, 'venv')) || fs.existsSync(path.join(cwd, '.venv'));
78
+ if (hasVenv) {
79
+ clack.log.success(`${color.green('✔')} Dependencies: Virtual environment found`);
80
+ }
81
+ else {
82
+ clack.log.warn(`${color.yellow('▲')} Dependencies: Virtual environment (venv/.venv) not found or not in root`);
83
+ }
84
+ }
85
+ if (isProject) {
86
+ clack.log.info(`Project Type: ${color.cyan(projectType.join(', '))}`);
87
+ }
88
+ else {
89
+ clack.log.message(`${color.gray('○')} No standard project files (package.json, pom.xml, requirements.txt) found in current directory.`);
90
+ }
91
+ // Env checks
92
+ const hasEnvExample = fs.existsSync(path.join(cwd, '.env.example'));
93
+ const hasEnv = fs.existsSync(path.join(cwd, '.env'));
94
+ if (hasEnvExample) {
95
+ if (hasEnv) {
96
+ clack.log.success(`${color.green('✔')} Environment Files: .env and .env.example found`);
97
+ }
98
+ else {
99
+ clack.log.warn(`${color.yellow('▲')} Environment Files: .env.example found, but .env is missing. You should copy it.`);
100
+ }
101
+ }
102
+ else if (hasEnv) {
103
+ clack.log.success(`${color.green('✔')} Environment Files: .env found`);
104
+ }
105
+ else {
106
+ clack.log.message(`${color.gray('○')} Environment Files: No .env files found`);
107
+ }
108
+ clack.outro(color.green('Doctor check finished!'));
109
+ });
110
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  interface InitOptions {
2
2
  name?: string;
3
3
  stack?: string;
4
+ template?: string;
4
5
  architecture?: string;
5
6
  buildTool?: string;
6
7
  ai?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA4BrD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA6BrD"}
@@ -23,6 +23,7 @@ export async function initCommand(options) {
23
23
  name: config.projectName,
24
24
  stack: config.stack,
25
25
  architecture: config.architecture,
26
+ customTemplate: config.customTemplate,
26
27
  tier: 'opensource',
27
28
  command: 'init'
28
29
  });
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAWjE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IAClD,6DAA6D;IAC7D,iEAAiE;IACjE,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAExC,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACzC,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhD,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,MAAM,SAAS,CAAC,KAAK,CAAC,mBAAmB,EAAE;QACvC,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAYjE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IAClD,6DAA6D;IAC7D,iEAAiE;IACjE,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAExC,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACzC,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhD,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,MAAM,SAAS,CAAC,KAAK,CAAC,mBAAmB,EAAE;QACvC,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;AAClE,CAAC"}
@@ -5,6 +5,7 @@ export interface ConfigOptions {
5
5
  architecture?: string;
6
6
  buildTool?: string;
7
7
  packageName?: string;
8
+ template?: string;
8
9
  ai?: boolean;
9
10
  geminiKey?: string;
10
11
  nonInteractive?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/wizard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAkC,MAAM,wBAAwB,CAAC;AAGvF,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8LnF"}
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/wizard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAkC,MAAM,wBAAwB,CAAC;AAGvF,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsMnF"}
@@ -13,8 +13,9 @@ export async function runWizard(options = {}) {
13
13
  };
14
14
  return {
15
15
  projectName: options.name,
16
- stack: options.stack,
17
- architecture: options.architecture || 'mvc',
16
+ stack: options.stack || 'custom',
17
+ customTemplate: options.template,
18
+ architecture: options.template ? undefined : (options.architecture || 'mvc'),
18
19
  buildTool: options.buildTool || 'npm',
19
20
  packageName: options.packageName,
20
21
  useAI: options.ai || false,
@@ -37,18 +38,22 @@ export async function runWizard(options = {}) {
37
38
  }
38
39
  },
39
40
  }),
40
- stack: () => clack.select({
41
- message: 'Choose your stack:',
42
- initialValue: options.stack,
43
- options: [
44
- { value: 'nextjs', label: 'Next.js (React + TypeScript)' },
45
- { value: 'java-spring', label: 'Java Spring Boot' },
46
- { value: 'nodejs-express', label: 'Node.js + Express' },
47
- { value: 'python-fastapi', label: 'Python FastAPI' },
48
- { value: 'nestjs', label: 'NestJS' },
49
- { value: 'n8n', label: 'Automation Engine (n8n)' },
50
- ],
51
- }),
41
+ stack: async () => {
42
+ if (options.template)
43
+ return 'custom';
44
+ return clack.select({
45
+ message: 'Choose your stack:',
46
+ initialValue: options.stack,
47
+ options: [
48
+ { value: 'nextjs', label: 'Next.js (React + TypeScript)' },
49
+ { value: 'java-spring', label: 'Java Spring Boot' },
50
+ { value: 'nodejs-express', label: 'Node.js + Express' },
51
+ { value: 'python-fastapi', label: 'Python FastAPI' },
52
+ { value: 'nestjs', label: 'NestJS' },
53
+ { value: 'n8n', label: 'Automation Engine (n8n)' },
54
+ ],
55
+ });
56
+ },
52
57
  buildTool: ({ results }) => {
53
58
  if (results.stack !== 'java-spring')
54
59
  return;
@@ -76,7 +81,9 @@ export async function runWizard(options = {}) {
76
81
  },
77
82
  });
78
83
  },
79
- architecture: ({ results }) => {
84
+ architecture: async ({ results }) => {
85
+ if (options.template)
86
+ return 'custom';
80
87
  // Next.js has different architecture options (default vs mvc)
81
88
  if (results.stack === 'nextjs') {
82
89
  return clack.select({
@@ -161,6 +168,7 @@ export async function runWizard(options = {}) {
161
168
  return {
162
169
  projectName: answers.projectName,
163
170
  stack: answers.stack,
171
+ customTemplate: options.template,
164
172
  architecture: answers.architecture,
165
173
  buildTool: answers.buildTool,
166
174
  packageName: answers.packageName,
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/cli/prompts/wizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/cli/prompts/wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * cli-helpers.ts
3
+ *
4
+ * Shared utilities for Kybernus CLI commands.
5
+ * Follows Single Responsibility and DRY principles.
6
+ *
7
+ * - All CLI-level repeated logic lives here (reading the rc file,
8
+ * displaying feature results, handling cancellations, architecture prompts).
9
+ * - No business logic here — only presentation and input handling.
10
+ */
11
+ import * as clack from '@clack/prompts';
12
+ import { SupportedStack, GenerateFeatureResult } from '../../core/features/feature-generator.js';
13
+ export interface ProjectConfig {
14
+ projectName: string;
15
+ stack: SupportedStack;
16
+ architecture: string;
17
+ }
18
+ /**
19
+ * Reads `.kybernusrc.json` from `cwd` and returns the parsed project config.
20
+ * Exits the process with a user-friendly error if the file is missing or invalid.
21
+ */
22
+ export declare function readProjectConfig(cwd: string, { requireExistence }?: {
23
+ requireExistence?: boolean | undefined;
24
+ }): Promise<ProjectConfig | null>;
25
+ /**
26
+ * Exits the process gracefully if the user pressed Ctrl+C (clack cancel symbol).
27
+ */
28
+ export declare function exitIfCancelled(value: unknown): void;
29
+ /**
30
+ * Prompts the user to select their project's architecture pattern.
31
+ * Used when `.kybernusrc.json` is not available (standalone project).
32
+ */
33
+ export declare function promptArchitecture(): Promise<string>;
34
+ /**
35
+ * Displays the outcome of a `generateFeature()` call.
36
+ * Single place to change the generated output's UI.
37
+ */
38
+ export declare function displayFeatureResult(result: GenerateFeatureResult): void;
39
+ /**
40
+ * Uniform error handler for feature generation failures.
41
+ */
42
+ export declare function handleGenerateError(err: unknown, spinner: ReturnType<typeof clack.spinner>): never;
43
+ //# sourceMappingURL=cli-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-helpers.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cli-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AAIxC,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAMjG,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,gBAAuB,EAAE;;CAAK,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAuBpH;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAKpD;AAMD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAY1D;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAcxE;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAIlG"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * cli-helpers.ts
3
+ *
4
+ * Shared utilities for Kybernus CLI commands.
5
+ * Follows Single Responsibility and DRY principles.
6
+ *
7
+ * - All CLI-level repeated logic lives here (reading the rc file,
8
+ * displaying feature results, handling cancellations, architecture prompts).
9
+ * - No business logic here — only presentation and input handling.
10
+ */
11
+ import * as clack from '@clack/prompts';
12
+ import color from 'picocolors';
13
+ import fs from 'fs-extra';
14
+ import path from 'path';
15
+ // ─────────────────────────────────────────────────────────────────
16
+ // RC File Reader
17
+ // ─────────────────────────────────────────────────────────────────
18
+ /**
19
+ * Reads `.kybernusrc.json` from `cwd` and returns the parsed project config.
20
+ * Exits the process with a user-friendly error if the file is missing or invalid.
21
+ */
22
+ export async function readProjectConfig(cwd, { requireExistence = true } = {}) {
23
+ const rcPath = path.join(cwd, '.kybernusrc.json');
24
+ if (!fs.existsSync(rcPath)) {
25
+ if (requireExistence) {
26
+ clack.log.error('❌ .kybernusrc.json not found.');
27
+ clack.log.warn('Run this command from the root of a Kybernus-generated project.');
28
+ process.exit(1);
29
+ }
30
+ return null;
31
+ }
32
+ try {
33
+ const raw = JSON.parse(await fs.readFile(rcPath, 'utf8'));
34
+ return {
35
+ projectName: raw.projectName,
36
+ stack: raw.stack,
37
+ architecture: raw.architecture || 'mvc',
38
+ };
39
+ }
40
+ catch {
41
+ clack.log.error('❌ Failed to parse .kybernusrc.json. Check if it is valid JSON.');
42
+ process.exit(1);
43
+ }
44
+ }
45
+ // ─────────────────────────────────────────────────────────────────
46
+ // Cancellation Guard
47
+ // ─────────────────────────────────────────────────────────────────
48
+ /**
49
+ * Exits the process gracefully if the user pressed Ctrl+C (clack cancel symbol).
50
+ */
51
+ export function exitIfCancelled(value) {
52
+ if (clack.isCancel(value)) {
53
+ clack.cancel('Cancelled.');
54
+ process.exit(0);
55
+ }
56
+ }
57
+ // ─────────────────────────────────────────────────────────────────
58
+ // Architecture Prompt
59
+ // ─────────────────────────────────────────────────────────────────
60
+ /**
61
+ * Prompts the user to select their project's architecture pattern.
62
+ * Used when `.kybernusrc.json` is not available (standalone project).
63
+ */
64
+ export async function promptArchitecture() {
65
+ const selected = await clack.select({
66
+ message: 'What is the architecture pattern of this project?',
67
+ options: [
68
+ { value: 'mvc', label: 'MVC (Classic Controller-Service)' },
69
+ { value: 'clean', label: 'Clean Architecture (Presentation / Application / Infrastructure)' },
70
+ { value: 'hexagonal', label: 'Hexagonal Architecture (Ports and Adapters)' },
71
+ ],
72
+ });
73
+ exitIfCancelled(selected);
74
+ return selected;
75
+ }
76
+ // ─────────────────────────────────────────────────────────────────
77
+ // Feature Result Display
78
+ // ─────────────────────────────────────────────────────────────────
79
+ /**
80
+ * Displays the outcome of a `generateFeature()` call.
81
+ * Single place to change the generated output's UI.
82
+ */
83
+ export function displayFeatureResult(result) {
84
+ clack.log.step('Files created:');
85
+ for (const file of result.copiedFiles) {
86
+ clack.log.info(` ${color.dim('→')} ${file}`);
87
+ }
88
+ if (result.installedDependencies.length > 0) {
89
+ clack.log.step('Dependencies auto-installed:');
90
+ clack.log.info(` ${color.dim('📦')} ${color.blue(result.installedDependencies.join(', '))}`);
91
+ }
92
+ if (result.instructionsPath) {
93
+ clack.log.step(`📖 Integration guide: ${color.yellow(result.instructionsPath)}`);
94
+ }
95
+ }
96
+ // ─────────────────────────────────────────────────────────────────
97
+ // Error Handler
98
+ // ─────────────────────────────────────────────────────────────────
99
+ /**
100
+ * Uniform error handler for feature generation failures.
101
+ */
102
+ export function handleGenerateError(err, spinner) {
103
+ spinner.stop();
104
+ clack.log.error(`❌ ${err instanceof Error ? err.message : String(err)}`);
105
+ process.exit(1);
106
+ }
107
+ //# sourceMappingURL=cli-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-helpers.js","sourceRoot":"","sources":["../../../src/cli/utils/cli-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * deploy-generator.ts
3
+ *
4
+ * Core engine for the `kybernus deploy` command.
5
+ * Mirrors the SOLID design of `feature-generator.ts`.
6
+ *
7
+ * SRP: One function per concern (validate → resolve files → copy).
8
+ * OCP: Adding a new provider or stack only requires a new entry in DEPLOY_MAP.
9
+ */
10
+ export type SupportedProvider = 'vercel' | 'railway' | 'fly' | 'render';
11
+ export type SupportedStack = 'nodejs-express' | 'nestjs' | 'python-fastapi' | 'nextjs' | 'java-spring';
12
+ export interface GenerateDeployResult {
13
+ copiedFiles: string[];
14
+ instructionsPath: string | null;
15
+ }
16
+ export declare function isProviderSupported(provider: SupportedProvider, stack: SupportedStack): boolean;
17
+ export declare function generateDeploy(provider: SupportedProvider, stack: SupportedStack, projectRoot: string, includeDockerfile?: boolean): Promise<GenerateDeployResult>;
18
+ //# sourceMappingURL=deploy-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-generator.d.ts","sourceRoot":"","sources":["../../../src/core/deploy/deploy-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AACxE,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEvG,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAqID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAG/F;AAED,wBAAsB,cAAc,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,MAAM,EACnB,iBAAiB,GAAE,OAAc,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAoC/B"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * deploy-generator.ts
3
+ *
4
+ * Core engine for the `kybernus deploy` command.
5
+ * Mirrors the SOLID design of `feature-generator.ts`.
6
+ *
7
+ * SRP: One function per concern (validate → resolve files → copy).
8
+ * OCP: Adding a new provider or stack only requires a new entry in DEPLOY_MAP.
9
+ */
10
+ import fs from 'fs-extra';
11
+ import path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ const ADD_FEATURES_DIR = path.resolve(__dirname, '../../../add-features');
16
+ // ─────────────────────────────────────────────────────────────────
17
+ // Deploy Map
18
+ // ─────────────────────────────────────────────────────────────────
19
+ const DEPLOY_MAP = {
20
+ vercel: {
21
+ // Vercel does not support Java Spring (no JVM runtime)
22
+ unsupported: ['java-spring', 'nestjs'],
23
+ files: {
24
+ 'nodejs-express': [
25
+ { src: 'deploy/vercel/nodejs-express.json', dest: 'vercel.json' },
26
+ { src: 'deploy/vercel/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
27
+ ],
28
+ 'nextjs': [
29
+ { src: 'deploy/vercel/nextjs.json', dest: 'vercel.json' },
30
+ { src: 'deploy/vercel/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
31
+ ],
32
+ 'python-fastapi': [
33
+ { src: 'deploy/vercel/python-fastapi.json', dest: 'vercel.json' },
34
+ { src: 'deploy/vercel/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
35
+ ],
36
+ },
37
+ },
38
+ railway: {
39
+ files: {
40
+ 'nodejs-express': [
41
+ { src: 'deploy/railway/nodejs.toml', dest: 'railway.toml' },
42
+ { src: 'deploy/dockerfiles/Dockerfile.nodejs', dest: 'Dockerfile' },
43
+ { src: 'deploy/railway/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
44
+ ],
45
+ 'nestjs': [
46
+ { src: 'deploy/railway/nodejs.toml', dest: 'railway.toml' },
47
+ { src: 'deploy/dockerfiles/Dockerfile.nodejs', dest: 'Dockerfile' },
48
+ { src: 'deploy/railway/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
49
+ ],
50
+ 'nextjs': [
51
+ { src: 'deploy/railway/nextjs.toml', dest: 'railway.toml' },
52
+ { src: 'deploy/dockerfiles/Dockerfile.nextjs', dest: 'Dockerfile' },
53
+ { src: 'deploy/railway/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
54
+ ],
55
+ 'python-fastapi': [
56
+ { src: 'deploy/railway/python-fastapi.toml', dest: 'railway.toml' },
57
+ { src: 'deploy/dockerfiles/Dockerfile.python', dest: 'Dockerfile' },
58
+ { src: 'deploy/railway/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
59
+ ],
60
+ 'java-spring': [
61
+ { src: 'deploy/railway/java-spring.toml', dest: 'railway.toml' },
62
+ { src: 'deploy/dockerfiles/Dockerfile.java', dest: 'Dockerfile' },
63
+ { src: 'deploy/railway/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
64
+ ],
65
+ },
66
+ },
67
+ fly: {
68
+ files: {
69
+ 'nodejs-express': [
70
+ { src: 'deploy/fly/nodejs.toml', dest: 'fly.toml' },
71
+ { src: 'deploy/dockerfiles/Dockerfile.nodejs', dest: 'Dockerfile' },
72
+ { src: 'deploy/fly/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
73
+ ],
74
+ 'nestjs': [
75
+ { src: 'deploy/fly/nodejs.toml', dest: 'fly.toml' },
76
+ { src: 'deploy/dockerfiles/Dockerfile.nodejs', dest: 'Dockerfile' },
77
+ { src: 'deploy/fly/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
78
+ ],
79
+ 'nextjs': [
80
+ { src: 'deploy/fly/nextjs.toml', dest: 'fly.toml' },
81
+ { src: 'deploy/dockerfiles/Dockerfile.nextjs', dest: 'Dockerfile' },
82
+ { src: 'deploy/fly/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
83
+ ],
84
+ 'python-fastapi': [
85
+ { src: 'deploy/fly/python-fastapi.toml', dest: 'fly.toml' },
86
+ { src: 'deploy/dockerfiles/Dockerfile.python', dest: 'Dockerfile' },
87
+ { src: 'deploy/fly/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
88
+ ],
89
+ 'java-spring': [
90
+ { src: 'deploy/fly/java-spring.toml', dest: 'fly.toml' },
91
+ { src: 'deploy/dockerfiles/Dockerfile.java', dest: 'Dockerfile' },
92
+ { src: 'deploy/fly/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
93
+ ],
94
+ },
95
+ },
96
+ render: {
97
+ files: {
98
+ 'nodejs-express': [
99
+ { src: 'deploy/render/nodejs.yaml', dest: 'render.yaml' },
100
+ { src: 'deploy/render/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
101
+ ],
102
+ 'nestjs': [
103
+ { src: 'deploy/render/nodejs.yaml', dest: 'render.yaml' },
104
+ { src: 'deploy/render/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
105
+ ],
106
+ 'nextjs': [
107
+ { src: 'deploy/render/nextjs.yaml', dest: 'render.yaml' },
108
+ { src: 'deploy/render/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
109
+ ],
110
+ 'python-fastapi': [
111
+ { src: 'deploy/render/python-fastapi.yaml', dest: 'render.yaml' },
112
+ { src: 'deploy/render/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
113
+ ],
114
+ 'java-spring': [
115
+ { src: 'deploy/render/java-spring.yaml', dest: 'render.yaml' },
116
+ { src: 'deploy/dockerfiles/Dockerfile.java', dest: 'Dockerfile' },
117
+ { src: 'deploy/render/INSTRUCTIONS.md', dest: 'DEPLOY.md' },
118
+ ],
119
+ },
120
+ },
121
+ };
122
+ // ─────────────────────────────────────────────────────────────────
123
+ // Public API
124
+ // ─────────────────────────────────────────────────────────────────
125
+ export function isProviderSupported(provider, stack) {
126
+ const config = DEPLOY_MAP[provider];
127
+ return !!config && !config.unsupported?.includes(stack) && !!config.files[stack];
128
+ }
129
+ export async function generateDeploy(provider, stack, projectRoot, includeDockerfile = true) {
130
+ const config = DEPLOY_MAP[provider];
131
+ if (!config) {
132
+ throw new Error(`Unknown provider: "${provider}". Supported: ${Object.keys(DEPLOY_MAP).join(', ')}`);
133
+ }
134
+ if (config.unsupported?.includes(stack) || !config.files[stack]) {
135
+ throw new Error(`Provider "${provider}" does not support stack "${stack}".`);
136
+ }
137
+ const filesToCopy = config.files[stack].filter((f) => includeDockerfile || f.dest !== 'Dockerfile');
138
+ const copiedFiles = [];
139
+ let instructionsPath = null;
140
+ for (const file of filesToCopy) {
141
+ const srcPath = path.join(ADD_FEATURES_DIR, file.src);
142
+ if (!await fs.pathExists(srcPath)) {
143
+ throw new Error(`Deploy template not found: ${srcPath}`);
144
+ }
145
+ const destPath = path.join(projectRoot, file.dest);
146
+ await fs.ensureDir(path.dirname(destPath));
147
+ await fs.copy(srcPath, destPath);
148
+ copiedFiles.push(file.dest);
149
+ if (file.dest.endsWith('.md')) {
150
+ instructionsPath = file.dest;
151
+ }
152
+ }
153
+ return { copiedFiles, instructionsPath };
154
+ }
155
+ //# sourceMappingURL=deploy-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-generator.js","sourceRoot":"","sources":["../../../src/core/deploy/deploy-generator.ts"],"names":[],"mappings":"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"}