@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.
- package/README.md +11 -0
- package/generators/create-service/files/go/go.mod.template +37 -0
- package/generators/create-service/files/go/internal/api/grpc/server.go.template +5 -0
- package/generators/create-service/files/go/internal/api/http/haealth.go.template +7 -0
- package/generators/create-service/files/go/internal/api/http/router.go.template +9 -0
- package/generators/create-service/files/go/internal/application/application.go.template +4 -0
- package/generators/create-service/files/go/internal/di/wire.go.template +11 -0
- package/generators/create-service/files/go/internal/domain/domain.go.template +4 -0
- package/generators/create-service/files/go/internal/infrastructure/infrastructure.go.template +3 -0
- package/generators/create-service/files/go/main.go.template +16 -0
- package/generators/create-service/files/go/pkg/proto/entity.proto.template +0 -0
- package/generators/create-service/files/go/project.json.template +21 -0
- package/generators/create-service/files/go-simple/go.mod.template +37 -0
- package/generators/create-service/files/go-simple/main.go.template +13 -0
- package/generators/create-service/files/go-simple/project.json.template +21 -0
- package/generators/create-service/files/nestjs/Dockerfile.template +24 -0
- package/generators/create-service/files/nestjs/package.json.template +53 -0
- package/generators/create-service/files/nestjs/project.json.template +23 -0
- package/generators/create-service/files/nestjs/src/app.controller.ts.template +29 -0
- package/generators/create-service/files/nestjs/src/app.module.ts.template +13 -0
- package/generators/create-service/files/nestjs/src/app.service.ts.template +4 -0
- package/generators/create-service/files/nestjs/src/health.controller.ts.template +11 -0
- package/generators/create-service/files/nestjs/src/main.ts.template +27 -0
- package/generators/create-service/files/nestjs/src/root.controller.ts.template +11 -0
- package/generators/create-service/files/nestjs/tsconfig.json.template +22 -0
- package/generators/create-service/files/nestjs-clean/Dockerfile.template +32 -0
- package/generators/create-service/files/nestjs-clean/package.json.template +70 -0
- package/generators/create-service/files/nestjs-clean/project.json.template +23 -0
- package/generators/create-service/files/nestjs-clean/src/api/app.controller.ts.template +26 -0
- package/generators/create-service/files/nestjs-clean/src/api/app.module.ts.template +11 -0
- package/generators/create-service/files/nestjs-clean/src/api/health.controller.ts.template +11 -0
- package/generators/create-service/files/nestjs-clean/src/api/root.controller.ts.template +11 -0
- package/generators/create-service/files/nestjs-clean/src/application/.gitkeep +0 -0
- package/generators/create-service/files/nestjs-clean/src/domain/.gitkeep +0 -0
- package/generators/create-service/files/nestjs-clean/src/infrastructure/.gitkeep +0 -0
- package/generators/create-service/files/nestjs-clean/src/main.ts.template +27 -0
- package/generators/create-service/files/nestjs-clean/tsconfig.json.template +22 -0
- package/generators/create-service/files/nextjs/next.config.js.template +8 -0
- package/generators/create-service/files/nextjs/package.json.template +27 -0
- package/generators/create-service/files/nextjs/project.json.template +37 -0
- package/generators/create-service/files/nextjs/src/app/globals.css.template +61 -0
- package/generators/create-service/files/nextjs/src/app/layout.tsx.template +21 -0
- package/generators/create-service/files/nextjs/src/app/page.tsx.template +16 -0
- package/generators/create-service/files/nextjs/tailwind.config.js.template +18 -0
- package/generators/create-service/files/nextjs/tsconfig.json.template +28 -0
- package/generators/create-service/files/node/package.json.template +12 -0
- package/generators/create-service/files/node/project.json.template +24 -0
- package/generators/create-service/files/node/src/main.ts.template +1 -0
- package/generators/create-service/files/node/tsconfig.json.template +9 -0
- package/generators/create-service/files/rust/Cargo.toml.template +7 -0
- package/generators/create-service/files/rust/Dockerfile.template +4 -0
- package/generators/create-service/files/rust/project.json.template +21 -0
- package/generators/create-service/files/rust/src/api/mod.rs.template +0 -0
- package/generators/create-service/files/rust/src/application/mod.rs.template +0 -0
- package/generators/create-service/files/rust/src/domain/mod.rs.template +0 -0
- package/generators/create-service/files/rust/src/infrastructure/mod.rs.template +0 -0
- package/generators/create-service/files/rust/src/lib.rs.template +4 -0
- package/generators/create-service/files/rust/src/main.rs.template +17 -0
- package/generators/create-service/files/rust-simple/Cargo.toml.template +7 -0
- package/generators/create-service/files/rust-simple/project.json.template +19 -0
- package/generators/create-service/files/rust-simple/src/main.rs.template +17 -0
- package/generators/create-service/generator.d.ts +12 -0
- package/generators/create-service/generator.d.ts.map +1 -0
- package/generators/create-service/generator.js +135 -0
- package/generators/create-service/schema.json +62 -0
- package/generators.json +9 -0
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -0
- package/index.js +2 -0
- 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,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,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,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
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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,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
|
+
}
|