@dhayalesh/create-service 0.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 (70) hide show
  1. package/README.md +11 -0
  2. package/generators/create-service/files/go/go.mod.template +37 -0
  3. package/generators/create-service/files/go/internal/api/grpc/server.go.template +5 -0
  4. package/generators/create-service/files/go/internal/api/http/haealth.go.template +7 -0
  5. package/generators/create-service/files/go/internal/api/http/router.go.template +9 -0
  6. package/generators/create-service/files/go/internal/application/application.go.template +4 -0
  7. package/generators/create-service/files/go/internal/di/wire.go.template +11 -0
  8. package/generators/create-service/files/go/internal/domain/domain.go.template +4 -0
  9. package/generators/create-service/files/go/internal/infrastructure/infrastructure.go.template +3 -0
  10. package/generators/create-service/files/go/main.go.template +16 -0
  11. package/generators/create-service/files/go/pkg/proto/entity.proto.template +0 -0
  12. package/generators/create-service/files/go/project.json.template +21 -0
  13. package/generators/create-service/files/go-simple/go.mod.template +37 -0
  14. package/generators/create-service/files/go-simple/main.go.template +13 -0
  15. package/generators/create-service/files/go-simple/project.json.template +21 -0
  16. package/generators/create-service/files/nestjs/Dockerfile.template +24 -0
  17. package/generators/create-service/files/nestjs/package.json.template +53 -0
  18. package/generators/create-service/files/nestjs/project.json.template +23 -0
  19. package/generators/create-service/files/nestjs/src/app.controller.ts.template +29 -0
  20. package/generators/create-service/files/nestjs/src/app.module.ts.template +13 -0
  21. package/generators/create-service/files/nestjs/src/app.service.ts.template +4 -0
  22. package/generators/create-service/files/nestjs/src/health.controller.ts.template +11 -0
  23. package/generators/create-service/files/nestjs/src/main.ts.template +27 -0
  24. package/generators/create-service/files/nestjs/src/root.controller.ts.template +11 -0
  25. package/generators/create-service/files/nestjs/tsconfig.json.template +22 -0
  26. package/generators/create-service/files/nestjs-clean/Dockerfile.template +32 -0
  27. package/generators/create-service/files/nestjs-clean/package.json.template +70 -0
  28. package/generators/create-service/files/nestjs-clean/project.json.template +23 -0
  29. package/generators/create-service/files/nestjs-clean/src/api/app.controller.ts.template +26 -0
  30. package/generators/create-service/files/nestjs-clean/src/api/app.module.ts.template +11 -0
  31. package/generators/create-service/files/nestjs-clean/src/api/health.controller.ts.template +11 -0
  32. package/generators/create-service/files/nestjs-clean/src/api/root.controller.ts.template +11 -0
  33. package/generators/create-service/files/nestjs-clean/src/application/.gitkeep +0 -0
  34. package/generators/create-service/files/nestjs-clean/src/domain/.gitkeep +0 -0
  35. package/generators/create-service/files/nestjs-clean/src/infrastructure/.gitkeep +0 -0
  36. package/generators/create-service/files/nestjs-clean/src/main.ts.template +27 -0
  37. package/generators/create-service/files/nestjs-clean/tsconfig.json.template +22 -0
  38. package/generators/create-service/files/nextjs/next.config.js.template +8 -0
  39. package/generators/create-service/files/nextjs/package.json.template +27 -0
  40. package/generators/create-service/files/nextjs/project.json.template +37 -0
  41. package/generators/create-service/files/nextjs/src/app/globals.css.template +61 -0
  42. package/generators/create-service/files/nextjs/src/app/layout.tsx.template +21 -0
  43. package/generators/create-service/files/nextjs/src/app/page.tsx.template +16 -0
  44. package/generators/create-service/files/nextjs/tailwind.config.js.template +18 -0
  45. package/generators/create-service/files/nextjs/tsconfig.json.template +28 -0
  46. package/generators/create-service/files/node/package.json.template +12 -0
  47. package/generators/create-service/files/node/project.json.template +24 -0
  48. package/generators/create-service/files/node/src/main.ts.template +1 -0
  49. package/generators/create-service/files/node/tsconfig.json.template +9 -0
  50. package/generators/create-service/files/rust/Cargo.toml.template +7 -0
  51. package/generators/create-service/files/rust/Dockerfile.template +4 -0
  52. package/generators/create-service/files/rust/project.json.template +21 -0
  53. package/generators/create-service/files/rust/src/api/mod.rs.template +0 -0
  54. package/generators/create-service/files/rust/src/application/mod.rs.template +0 -0
  55. package/generators/create-service/files/rust/src/domain/mod.rs.template +0 -0
  56. package/generators/create-service/files/rust/src/infrastructure/mod.rs.template +0 -0
  57. package/generators/create-service/files/rust/src/lib.rs.template +4 -0
  58. package/generators/create-service/files/rust/src/main.rs.template +17 -0
  59. package/generators/create-service/files/rust-simple/Cargo.toml.template +7 -0
  60. package/generators/create-service/files/rust-simple/project.json.template +19 -0
  61. package/generators/create-service/files/rust-simple/src/main.rs.template +17 -0
  62. package/generators/create-service/generator.d.ts +12 -0
  63. package/generators/create-service/generator.d.ts.map +1 -0
  64. package/generators/create-service/generator.js +135 -0
  65. package/generators/create-service/schema.json +62 -0
  66. package/generators.json +9 -0
  67. package/index.d.ts +2 -0
  68. package/index.d.ts.map +1 -0
  69. package/index.js +2 -0
  70. package/package.json +66 -0
@@ -0,0 +1,27 @@
1
+ import { NestFactory } from '@nestjs/core';
2
+ import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
3
+ import { AppModule } from './api/app.module';
4
+
5
+ async function bootstrap() {
6
+ const app = await NestFactory.create(AppModule);
7
+
8
+ // Set global prefix with versioning, excluding operational endpoints
9
+ app.setGlobalPrefix('v1/api', {
10
+ exclude: ['health', '/'],
11
+ });
12
+
13
+ // Swagger Configuration
14
+ const config = new DocumentBuilder()
15
+ .setTitle('<%= name %>')
16
+ .setDescription('The <%= name %> API description')
17
+ .setVersion('1.0')
18
+ .build();
19
+ const document = SwaggerModule.createDocument(app, config);
20
+
21
+ SwaggerModule.setup('api/docs', app, document);
22
+
23
+ await app.listen(<%= port %>, '0.0.0.0');
24
+ console.log(`Application is running on: http://localhost:<%= port %>`);
25
+ console.log(`Swagger documentation: http://localhost:<%= port %>/api/docs`);
26
+ }
27
+ bootstrap();
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "declaration": true,
5
+ "removeComments": true,
6
+ "emitDecoratorMetadata": true,
7
+ "experimentalDecorators": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "target": "es2021",
10
+ "sourceMap": true,
11
+ "outDir": "../../dist/packages/<%= name %>",
12
+ "baseUrl": "./",
13
+ "incremental": true,
14
+ "skipLibCheck": true,
15
+ "strictNullChecks": false,
16
+ "noImplicitAny": false,
17
+ "strictBindCallApply": false,
18
+ "forceConsistentCasingInFileNames": false,
19
+ "noFallthroughCasesInSwitch": false
20
+ },
21
+ "include": ["src/**/*"]
22
+ }
@@ -0,0 +1,8 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ experimental: {
4
+ appDir: true,
5
+ },
6
+ }
7
+
8
+ module.exports = nextConfig
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "<%= name %>",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev -p <%= port %>",
7
+ "build": "next build",
8
+ "start": "next start -p <%= port %>",
9
+ "lint": "next lint"
10
+ },
11
+ "dependencies": {
12
+ "next": "^14.0.0",
13
+ "react": "^18.0.0",
14
+ "react-dom": "^18.0.0",
15
+ "tailwindcss": "^3.3.0",
16
+ "autoprefixer": "^10.4.16",
17
+ "postcss": "^8.4.31"
18
+ },
19
+ "devDependencies": {
20
+ "typescript": "^5.0.0",
21
+ "@types/node": "^20.0.0",
22
+ "@types/react": "^18.0.0",
23
+ "@types/react-dom": "^18.0.0",
24
+ "eslint": "^8.0.0",
25
+ "eslint-config-next": "^14.0.0"
26
+ }
27
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "<%= name %>",
3
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
+ "projectType": "application",
5
+ "sourceRoot": "<%= projectRoot %>/src",
6
+ "targets": {
7
+ "build": {
8
+ "executor": "nx:run-commands",
9
+ "options": {
10
+ "cwd": "<%= projectRoot %>",
11
+ "command": "next build"
12
+ },
13
+ "outputs": ["{workspaceRoot}/<%= projectRoot %>/.next"]
14
+ },
15
+ "dev": {
16
+ "executor": "nx:run-commands",
17
+ "options": {
18
+ "cwd": "<%= projectRoot %>",
19
+ "command": "next dev -p <%= port %>"
20
+ }
21
+ },
22
+ "start": {
23
+ "executor": "nx:run-commands",
24
+ "options": {
25
+ "cwd": "<%= projectRoot %>",
26
+ "command": "next start -p <%= port %>"
27
+ }
28
+ },
29
+ "lint": {
30
+ "executor": "nx:run-commands",
31
+ "options": {
32
+ "cwd": "<%= projectRoot %>",
33
+ "command": "next lint"
34
+ }
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,61 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ * {
6
+ margin: 0;
7
+ padding: 0;
8
+ box-sizing: border-box;
9
+ font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
10
+ }
11
+
12
+ body {
13
+ height: 100vh;
14
+ background: linear-gradient(135deg, #dbd9ff, #6366f1);
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ color: #ffffff;
19
+ }
20
+
21
+ .container {
22
+ text-align: center;
23
+ max-width: 600px;
24
+ padding: 40px;
25
+ background: rgba(255, 255, 255, 0.1);
26
+ border-radius: 16px;
27
+ backdrop-filter: blur(10px);
28
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
29
+ }
30
+
31
+ h1 {
32
+ font-size: 2.5rem;
33
+ margin-bottom: 15px;
34
+ }
35
+
36
+ p {
37
+ font-size: 1.1rem;
38
+ margin-bottom: 30px;
39
+ opacity: 0.9;
40
+ }
41
+
42
+ .btn {
43
+ display: inline-block;
44
+ padding: 14px 32px;
45
+ background: #ffffff;
46
+ font-weight: bold;
47
+ border-radius: 30px;
48
+ text-decoration: none;
49
+ transition: all 0.3s ease;
50
+ }
51
+
52
+ .btn:hover {
53
+ transform: translateY(-2px);
54
+ background: #e0e7ff;
55
+ }
56
+
57
+ footer {
58
+ margin-top: 25px;
59
+ font-size: 0.85rem;
60
+ opacity: 0.7;
61
+ }
@@ -0,0 +1,21 @@
1
+ import './globals.css'
2
+ import { Inter } from 'next/font/google'
3
+
4
+ const inter = Inter({ subsets: ['latin'] })
5
+
6
+ export const metadata = {
7
+ title: '<%= name %>',
8
+ description: 'Generated by KTern',
9
+ }
10
+
11
+ export default function RootLayout({
12
+ children,
13
+ }: {
14
+ children: React.ReactNode
15
+ }) {
16
+ return (
17
+ <html lang="en">
18
+ <body className={inter.className}>{children}</body>
19
+ </html>
20
+ )
21
+ }
@@ -0,0 +1,16 @@
1
+ export default function Home() {
2
+ return (
3
+ <div className="container">
4
+ <h1>Welcome to Your App</h1>
5
+ <p>
6
+ Build, explore, and grow with a simple and powerful platform.
7
+ </p>
8
+
9
+ <a href="#" className="btn">Get Started</a>
10
+
11
+ <footer>
12
+ KTern
13
+ </footer>
14
+ </div>
15
+ )
16
+ }
@@ -0,0 +1,18 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
5
+ './src/components/**/*.{js,ts,jsx,tsx,mdx}',
6
+ './src/app/**/*.{js,ts,jsx,tsx,mdx}',
7
+ ],
8
+ theme: {
9
+ extend: {
10
+ backgroundImage: {
11
+ 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
12
+ 'gradient-conic':
13
+ 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
14
+ },
15
+ },
16
+ },
17
+ plugins: [],
18
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "lib": ["dom", "dom.iterable", "es6"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [
17
+ {
18
+ "name": "next"
19
+ }
20
+ ],
21
+ "baseUrl": ".",
22
+ "paths": {
23
+ "@/*": ["./src/*"]
24
+ }
25
+ },
26
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
27
+ "exclude": ["node_modules"]
28
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "<%= name %>",
3
+ "version": "0.0.1",
4
+ "private": true,
5
+ "dependencies": {
6
+ "tslib": "^2.3.0"
7
+ },
8
+ "devDependencies": {
9
+ "@types/node": "^18.11.9",
10
+ "typescript": "~5.5.2"
11
+ }
12
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "<%= name %>",
3
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
+ "sourceRoot": "<%= projectRoot %>/src",
5
+ "projectType": "application",
6
+ "targets": {
7
+ "build": {
8
+ "executor": "@nx/js:tsc",
9
+ "outputs": ["{options.outputPath}"],
10
+ "options": {
11
+ "outputPath": "dist/<%= name %>",
12
+ "main": "<%= projectRoot %>/src/main.ts",
13
+ "tsConfig": "<%= projectRoot %>/tsconfig.json",
14
+ "assets": []
15
+ }
16
+ },
17
+ "serve": {
18
+ "executor": "@nx/js:node",
19
+ "options": {
20
+ "buildTarget": "<%= name %>:build"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1 @@
1
+ console.log('Hello from <%= name %>!');
@@ -0,0 +1,9 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "target": "es2020",
5
+ "sourceMap": true,
6
+ "outDir": "dist"
7
+ },
8
+ "include": ["src/**/*"]
9
+ }
@@ -0,0 +1,7 @@
1
+ [package]
2
+ name = "<%= name %>"
3
+ version = "0.1.0"
4
+ edition = "2024"
5
+
6
+ [dependencies]
7
+ actix-web = "4.12.0"
@@ -0,0 +1,4 @@
1
+ FROM rust:1.75 as builder
2
+ WORKDIR /usr/src/app
3
+ COPY . .
4
+ RUN cargo install --path .
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "<%= name %>",
3
+ "targets": {
4
+ "build": {
5
+ "executor": "nx:run-commands",
6
+ "options": {
7
+ "cwd": "<%= projectRoot %>",
8
+ "command": "cargo build",
9
+ "bin": "<%= name %>"
10
+ }
11
+ },
12
+ "serve": {
13
+ "executor": "nx:run-commands",
14
+ "options": {
15
+ "cwd": "<%= projectRoot %>",
16
+ "command": "cargo run",
17
+ "bin": "<%= name %>"
18
+ }
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,4 @@
1
+ mod infrastructure;
2
+ mod api;
3
+ mod domain;
4
+ mod application;
@@ -0,0 +1,17 @@
1
+ use actix_web::{get, App, HttpResponse, HttpServer, Responder};
2
+
3
+ #[get("/health")]
4
+ async fn health_check() -> impl Responder {
5
+ HttpResponse::Ok().body("OK")
6
+ }
7
+
8
+ #[actix_web::main]
9
+ async fn main() -> std::io::Result<()> {
10
+ HttpServer::new(|| {
11
+ App::new()
12
+ .service(health_check)
13
+ })
14
+ .bind(("127.0.0.1", 8080))?
15
+ .run()
16
+ .await
17
+ }
@@ -0,0 +1,7 @@
1
+ [package]
2
+ name = "<%= name %>"
3
+ version = "0.1.0"
4
+ edition = "2024"
5
+
6
+ [dependencies]
7
+ actix-web = "4.12.0"
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "<%= name %>",
3
+ "targets": {
4
+ "build": {
5
+ "executor": "nx:run-commands",
6
+ "options": {
7
+ "command": "cargo build",
8
+ "bin": "<%= name %>"
9
+ }
10
+ },
11
+ "serve": {
12
+ "executor": "nx:run-commands",
13
+ "options": {
14
+ "command": "cargo run",
15
+ "bin": "<%= name %>"
16
+ }
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,17 @@
1
+ use actix_web::{get, App, HttpResponse, HttpServer, Responder};
2
+
3
+ #[get("/health")]
4
+ async fn health_check() -> impl Responder {
5
+ HttpResponse::Ok().body("OK")
6
+ }
7
+
8
+ #[actix_web::main]
9
+ async fn main() -> std::io::Result<()> {
10
+ HttpServer::new(|| {
11
+ App::new()
12
+ .service(health_check)
13
+ })
14
+ .bind(("127.0.0.1", 8080))?
15
+ .run()
16
+ .await
17
+ }
@@ -0,0 +1,12 @@
1
+ import type { Tree } from '@nx/devkit';
2
+ interface CreateServiceOptions {
3
+ name: string;
4
+ language: string;
5
+ folderStructure: string;
6
+ port?: number;
7
+ location?: string;
8
+ }
9
+ export default function (tree: Tree, options: CreateServiceOptions): Promise<GeneratorCallback>;
10
+ import type { GeneratorCallback } from '@nx/devkit';
11
+ export {};
12
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../packages/create-service/src/generators/create-service/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,yBAA+B,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,8BA+GvE;AAED,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const tslib_1 = require("tslib");
5
+ const devkit_1 = require("@nx/devkit");
6
+ const path = tslib_1.__importStar(require("path"));
7
+ async function default_1(tree, options) {
8
+ // 🔥 Normalize name ONCE
9
+ const normalized = (0, devkit_1.names)(options.name);
10
+ const serviceName = normalized.fileName; // kebab-case guaranteed
11
+ // Default to 'apps' if not specified for backward compatibility, or strictly enforce.
12
+ // Given user request, we assume it's prompted.
13
+ const location = options.location || 'apps/api';
14
+ const projectRoot = `${location}/${serviceName}`;
15
+ if (tree.exists(projectRoot)) {
16
+ throw new Error(`❌ Service "${serviceName}" already exists at ${projectRoot}.
17
+ Choose a different name or delete the existing service.`);
18
+ }
19
+ if (options.language === 'rust') {
20
+ if (options.folderStructure === 'clean core') {
21
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files/rust'), projectRoot, {
22
+ ...options,
23
+ name: serviceName,
24
+ projectRoot: projectRoot,
25
+ tmpl: "",
26
+ });
27
+ }
28
+ else {
29
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files/rust-simple'), projectRoot, {
30
+ ...options,
31
+ name: serviceName,
32
+ projectRoot: projectRoot,
33
+ tmpl: "",
34
+ });
35
+ }
36
+ }
37
+ else if (options.language === 'nestjs') {
38
+ const templatePath = options.folderStructure === 'clean core'
39
+ ? 'files/nestjs-clean'
40
+ : 'files/nestjs';
41
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, templatePath), projectRoot, {
42
+ ...options,
43
+ name: serviceName,
44
+ port: options.port || 3000,
45
+ projectRoot: projectRoot,
46
+ tmpl: "",
47
+ });
48
+ }
49
+ else if (options.language === 'nextjs') {
50
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files/nextjs'), projectRoot, {
51
+ ...options,
52
+ name: serviceName,
53
+ port: options.port || 3000,
54
+ projectRoot: projectRoot,
55
+ tmpl: "",
56
+ });
57
+ }
58
+ else if (options.language === 'go') {
59
+ if (options.folderStructure === 'clean core') {
60
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files/go'), projectRoot, {
61
+ ...options,
62
+ name: serviceName,
63
+ projectRoot: projectRoot,
64
+ tmpl: "",
65
+ });
66
+ }
67
+ else {
68
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files/go-simple'), projectRoot, { ...options, name: serviceName, projectRoot: projectRoot, tmpl: "" });
69
+ }
70
+ }
71
+ else {
72
+ // Node (JS/TS)
73
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files/node'), projectRoot, {
74
+ ...options,
75
+ name: serviceName,
76
+ projectRoot: projectRoot,
77
+ tmpl: "",
78
+ });
79
+ // Handle JS/TS entry files
80
+ if (options.language === 'js') {
81
+ tree.delete(path.join(projectRoot, 'src/main.ts'));
82
+ // Create main.js for JavaScript projects
83
+ const mainJsContent = `console.log('Hello from ${serviceName} service!')'`;
84
+ tree.write(path.join(projectRoot, 'src/main.js'), mainJsContent);
85
+ }
86
+ else {
87
+ tree.delete(path.join(projectRoot, 'src/main.js'));
88
+ }
89
+ }
90
+ // Update workspace file - DISABLED due to JSON parsing issues
91
+ // const workspaceFile = 'ktern.code-workspace';
92
+ // if (tree.exists(workspaceFile)) {
93
+ // const workspaceContent = tree.read(workspaceFile, 'utf-8');
94
+ // if (workspaceContent) {
95
+ // const workspace = JSON.parse(workspaceContent);
96
+ // workspace.folders.push({
97
+ // name: `ktern ${serviceName}`,
98
+ // path: projectRoot
99
+ // });
100
+ // tree.write(workspaceFile, JSON.stringify(workspace, null, 2));
101
+ // }
102
+ // }
103
+ await (0, devkit_1.formatFiles)(tree);
104
+ return printNextSteps(serviceName, options.language, projectRoot);
105
+ }
106
+ function printNextSteps(serviceName, language, projectRoot) {
107
+ return () => {
108
+ console.log(`
109
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
110
+ ✅ Service "${serviceName}" created successfully
111
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
112
+
113
+ Next steps:
114
+ cd ${projectRoot}
115
+ `);
116
+ if (language === 'rust') {
117
+ console.log(`
118
+ cargo build
119
+ cargo run
120
+ `);
121
+ }
122
+ if (language === 'go') {
123
+ console.log(`
124
+ go mod tidy
125
+ go run main.go
126
+ `);
127
+ }
128
+ if (['node', 'ts', 'js', 'nestjs', 'nextjs'].includes(language)) {
129
+ console.log(`
130
+ pnpm install
131
+ pnpm nx ${language === 'nextjs' ? 'dev' : 'serve'} ${serviceName}
132
+ `);
133
+ }
134
+ };
135
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "create-service",
4
+ "title": "Create Service",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "Service name",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What is the service name?"
15
+ },
16
+ "language": {
17
+ "type": "string",
18
+ "description": "Language",
19
+ "enum": [
20
+ "ts",
21
+ "js",
22
+ "rust",
23
+ "nestjs",
24
+ "nextjs",
25
+ "go"
26
+ ],
27
+ "x-prompt": "Which language do you want to use?"
28
+ },
29
+ "folderStructure": {
30
+ "type": "string",
31
+ "description": "Folder Structure",
32
+ "enum": [
33
+ "normal",
34
+ "clean core"
35
+ ],
36
+ "x-prompt": "Which folder structure do you want to use?"
37
+ },
38
+ "location": {
39
+ "type": "string",
40
+ "description": "Service location",
41
+ "enum": [
42
+ "packages/apps/web",
43
+ "packages/apps/api",
44
+ "domains",
45
+ "infrastructure",
46
+ "platform"
47
+ ],
48
+ "x-prompt": "Where should this service be located?"
49
+ },
50
+ "port": {
51
+ "type": "number",
52
+ "description": "Port to run the service on",
53
+ "default": 3000,
54
+ "x-prompt": "What port should the service run on?"
55
+ }
56
+ },
57
+ "required": [
58
+ "name",
59
+ "language",
60
+ "folderStructure"
61
+ ]
62
+ }