nodejs-quickstart-structure 2.0.0 → 2.1.0

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 (161) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +44 -40
  3. package/bin/index.js +6 -3
  4. package/lib/generator.js +10 -4
  5. package/lib/modules/app-setup.js +76 -6
  6. package/lib/modules/auth-setup.js +143 -0
  7. package/lib/modules/caching-setup.js +8 -1
  8. package/lib/modules/config-files.js +10 -0
  9. package/lib/modules/database-setup.js +2 -1
  10. package/lib/modules/project-setup.js +1 -0
  11. package/lib/prompts.js +40 -1
  12. package/package.json +5 -4
  13. package/templates/clean-architecture/js/src/domain/models/User.js +3 -1
  14. package/templates/clean-architecture/js/src/index.js.ejs +2 -0
  15. package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +12 -3
  16. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +25 -2
  17. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.spec.js.ejs +27 -0
  18. package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +3 -0
  19. package/templates/clean-architecture/js/src/infrastructure/webserver/server.spec.js.ejs +49 -0
  20. package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.spec.js.ejs +14 -0
  21. package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +41 -4
  22. package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +69 -4
  23. package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -6
  24. package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +38 -21
  25. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +10 -5
  26. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.spec.js.ejs +32 -10
  27. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +1 -1
  28. package/templates/clean-architecture/js/src/interfaces/routes/api.js.ejs +15 -0
  29. package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +4 -0
  30. package/templates/clean-architecture/js/src/usecases/CreateUser.js.ejs +34 -0
  31. package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +3 -2
  32. package/templates/clean-architecture/js/src/usecases/DeleteUser.js.ejs +27 -0
  33. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js.ejs +36 -0
  34. package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +14 -0
  35. package/templates/clean-architecture/js/src/usecases/GetUserById.js.ejs +36 -0
  36. package/templates/clean-architecture/js/src/usecases/GetUserById.spec.js.ejs +48 -0
  37. package/templates/clean-architecture/js/src/usecases/UpdateUser.js.ejs +28 -0
  38. package/templates/clean-architecture/js/src/utils/errorMessages.js +1 -0
  39. package/templates/clean-architecture/js/src/utils/httpCodes.js +2 -0
  40. package/templates/clean-architecture/ts/src/config/env.ts.ejs +12 -3
  41. package/templates/clean-architecture/ts/src/domain/user.ts +3 -1
  42. package/templates/clean-architecture/ts/src/index.ts.ejs +4 -0
  43. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.spec.ts.ejs +55 -9
  44. package/templates/clean-architecture/ts/src/infrastructure/repositories/userRepository.ts.ejs +32 -3
  45. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.spec.ts.ejs +26 -6
  46. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.ts.ejs +57 -15
  47. package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +38 -23
  48. package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +14 -8
  49. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.spec.ts.ejs +33 -10
  50. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.ts.ejs +15 -5
  51. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/user.types.ts.ejs +1 -1
  52. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +9 -1
  53. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts.ejs +16 -0
  54. package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +3 -2
  55. package/templates/clean-architecture/ts/src/usecases/createUser.ts.ejs +35 -0
  56. package/templates/clean-architecture/ts/src/usecases/deleteUser.spec.ts.ejs +1 -0
  57. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts.ejs +24 -0
  58. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts.ejs +21 -0
  59. package/templates/clean-architecture/ts/src/usecases/getUserById.spec.ts.ejs +47 -0
  60. package/templates/clean-architecture/ts/src/usecases/getUserById.ts.ejs +23 -0
  61. package/templates/clean-architecture/ts/src/usecases/updateUser.spec.ts.ejs +1 -0
  62. package/templates/clean-architecture/ts/src/usecases/updateUser.ts.ejs +25 -0
  63. package/templates/clean-architecture/ts/src/utils/errorMessages.ts +1 -0
  64. package/templates/clean-architecture/ts/src/utils/httpCodes.ts +1 -0
  65. package/templates/common/.cursorrules.ejs +9 -0
  66. package/templates/common/.env.example.ejs +17 -10
  67. package/templates/common/.gitlab-ci.yml.ejs +3 -1
  68. package/templates/common/Jenkinsfile.ejs +10 -1
  69. package/templates/common/README.md.ejs +64 -19
  70. package/templates/common/_circleci/config.yml.ejs +96 -0
  71. package/templates/common/_github/workflows/ci.yml.ejs +1 -1
  72. package/templates/common/auth/js/controllers/authController.js.ejs +168 -0
  73. package/templates/common/auth/js/controllers/authController.spec.js.ejs +148 -0
  74. package/templates/common/auth/js/middleware/authMiddleware.js.ejs +58 -0
  75. package/templates/common/auth/js/middleware/authMiddleware.spec.js.ejs +108 -0
  76. package/templates/common/auth/js/routes/authRoutes.js.ejs +16 -0
  77. package/templates/common/auth/js/services/jwtService.js.ejs +54 -0
  78. package/templates/common/auth/js/services/jwtService.spec.js.ejs +84 -0
  79. package/templates/common/auth/ts/controllers/authController.spec.ts.ejs +161 -0
  80. package/templates/common/auth/ts/controllers/authController.ts.ejs +165 -0
  81. package/templates/common/auth/ts/middleware/authMiddleware.spec.ts.ejs +128 -0
  82. package/templates/common/auth/ts/middleware/authMiddleware.ts.ejs +59 -0
  83. package/templates/common/auth/ts/routes/authRoutes.ts.ejs +20 -0
  84. package/templates/common/auth/ts/services/jwtService.spec.ts.ejs +89 -0
  85. package/templates/common/auth/ts/services/jwtService.ts.ejs +60 -0
  86. package/templates/common/bitbucket-pipelines.yml.ejs +60 -0
  87. package/templates/common/caching/clean/js/CreateUser.js.ejs +14 -5
  88. package/templates/common/caching/clean/js/DeleteUser.js.ejs +2 -1
  89. package/templates/common/caching/clean/js/GetUserById.js.ejs +39 -0
  90. package/templates/common/caching/clean/js/UpdateUser.js.ejs +2 -1
  91. package/templates/common/caching/clean/ts/createUser.ts.ejs +14 -6
  92. package/templates/common/caching/clean/ts/deleteUser.ts.ejs +2 -1
  93. package/templates/common/caching/clean/ts/getUserById.ts.ejs +32 -0
  94. package/templates/common/caching/clean/ts/updateUser.ts.ejs +2 -2
  95. package/templates/common/database/js/models/User.js.ejs +14 -1
  96. package/templates/common/database/js/models/User.js.mongoose.ejs +7 -0
  97. package/templates/common/database/js/models/User.spec.js.ejs +12 -0
  98. package/templates/common/database/ts/models/User.spec.ts.ejs +10 -0
  99. package/templates/common/database/ts/models/User.ts.ejs +17 -0
  100. package/templates/common/database/ts/models/User.ts.mongoose.ejs +8 -0
  101. package/templates/common/docker-compose.yml.ejs +14 -0
  102. package/templates/common/ecosystem.config.js.ejs +9 -3
  103. package/templates/common/eslint.config.mjs.ejs +3 -0
  104. package/templates/common/jest.config.js.ejs +11 -9
  105. package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +1 -1
  106. package/templates/common/kafka/js/services/kafkaService.js.ejs +1 -1
  107. package/templates/common/migrations/init.js.ejs +5 -4
  108. package/templates/common/package.json.ejs +10 -2
  109. package/templates/common/prompts/project-context.md.ejs +8 -1
  110. package/templates/common/scripts/run-e2e.js.ejs +26 -10
  111. package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +149 -107
  112. package/templates/common/src/tests/e2e/e2e.users.test.ts.ejs +88 -47
  113. package/templates/common/swagger.yml.ejs +148 -0
  114. package/templates/common/tsconfig.eslint.json +15 -0
  115. package/templates/common/tsconfig.json +2 -1
  116. package/templates/common/views/ejs/index.ejs +264 -30
  117. package/templates/common/views/ejs/login.ejs.ejs +244 -0
  118. package/templates/common/views/ejs/signup.ejs.ejs +282 -0
  119. package/templates/common/views/pug/index.pug +269 -38
  120. package/templates/common/views/pug/login.pug.ejs +195 -0
  121. package/templates/common/views/pug/signup.pug.ejs +241 -0
  122. package/templates/db/mysql/V1__Initial_Setup.sql.ejs +6 -0
  123. package/templates/db/postgres/V1__Initial_Setup.sql.ejs +6 -0
  124. package/templates/mvc/js/src/config/env.js.ejs +12 -3
  125. package/templates/mvc/js/src/controllers/userController.js.ejs +29 -5
  126. package/templates/mvc/js/src/controllers/userController.spec.js.ejs +27 -12
  127. package/templates/mvc/js/src/graphql/context.js.ejs +14 -3
  128. package/templates/mvc/js/src/graphql/context.spec.js.ejs +36 -21
  129. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +10 -5
  130. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.spec.js.ejs +32 -10
  131. package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +1 -1
  132. package/templates/mvc/js/src/index.js.ejs +16 -3
  133. package/templates/mvc/js/src/routes/api.js.ejs +14 -0
  134. package/templates/mvc/js/src/routes/api.spec.js.ejs +3 -0
  135. package/templates/mvc/js/src/utils/errorMessages.js +1 -0
  136. package/templates/mvc/js/src/utils/httpCodes.js +1 -0
  137. package/templates/mvc/ts/src/config/env.ts.ejs +12 -3
  138. package/templates/mvc/ts/src/controllers/userController.spec.ts.ejs +95 -7
  139. package/templates/mvc/ts/src/controllers/userController.ts.ejs +68 -11
  140. package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +36 -23
  141. package/templates/mvc/ts/src/graphql/context.ts.ejs +15 -6
  142. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.spec.ts.ejs +32 -10
  143. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.ts.ejs +15 -5
  144. package/templates/mvc/ts/src/graphql/typeDefs/user.types.ts.ejs +1 -1
  145. package/templates/mvc/ts/src/index.ts.ejs +15 -3
  146. package/templates/mvc/ts/src/routes/api.spec.ts.ejs +6 -0
  147. package/templates/mvc/ts/src/routes/api.ts.ejs +15 -0
  148. package/templates/mvc/ts/src/utils/errorMessages.ts +1 -0
  149. package/templates/mvc/ts/src/utils/httpCodes.ts +1 -0
  150. package/templates/clean-architecture/js/src/interfaces/routes/api.js +0 -12
  151. package/templates/clean-architecture/js/src/usecases/CreateUser.js +0 -14
  152. package/templates/clean-architecture/js/src/usecases/DeleteUser.js +0 -11
  153. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +0 -12
  154. package/templates/clean-architecture/js/src/usecases/UpdateUser.js +0 -11
  155. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts +0 -13
  156. package/templates/clean-architecture/ts/src/usecases/createUser.ts +0 -13
  157. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts +0 -9
  158. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +0 -10
  159. package/templates/clean-architecture/ts/src/usecases/updateUser.ts +0 -9
  160. package/templates/mvc/js/src/routes/api.js +0 -10
  161. package/templates/mvc/ts/src/routes/api.ts +0 -12
@@ -0,0 +1,282 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Sign Up - <%= projectName %></title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
8
+ <style>
9
+ :root {
10
+ --primary: #22c55e;
11
+ --primary-glow: rgba(34, 197, 94, 0.4);
12
+ --bg-dark: #0f172a;
13
+ --card-bg: rgba(255, 255, 255, 0.03);
14
+ --card-border: rgba(255, 255, 255, 0.08);
15
+ --text-main: #f8fafc;
16
+ --text-muted: #94a3b8;
17
+ }
18
+
19
+ * {
20
+ margin: 0;
21
+ padding: 0;
22
+ box-sizing: border-box;
23
+ font-family: 'Poppins', sans-serif;
24
+ }
25
+
26
+ body {
27
+ background-color: var(--bg-dark);
28
+ color: var(--text-main);
29
+ min-height: 100vh;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ overflow-x: hidden;
34
+ position: relative;
35
+ }
36
+
37
+ /* Animated Background Blobs */
38
+ .background-blobs {
39
+ position: absolute;
40
+ width: 100%;
41
+ height: 100%;
42
+ z-index: -1;
43
+ filter: blur(80px);
44
+ }
45
+
46
+ .blob {
47
+ position: absolute;
48
+ width: 500px;
49
+ height: 500px;
50
+ border-radius: 50%;
51
+ opacity: 0.3;
52
+ animation: float 25s infinite alternate;
53
+ }
54
+
55
+ .blob-1 {
56
+ background: radial-gradient(circle, #22c55e 0%, transparent 70%);
57
+ top: -200px;
58
+ right: -100px;
59
+ }
60
+
61
+ .blob-2 {
62
+ background: radial-gradient(circle, #3b82f6 0%, transparent 70%);
63
+ bottom: -200px;
64
+ left: -100px;
65
+ animation-delay: -7s;
66
+ }
67
+
68
+ @keyframes float {
69
+ 0% { transform: translate(0, 0) scale(1); }
70
+ 100% { transform: translate(-150px, 100px) scale(1.3); }
71
+ }
72
+
73
+ .auth-card {
74
+ background: var(--card-bg);
75
+ backdrop-filter: blur(15px);
76
+ -webkit-backdrop-filter: blur(15px);
77
+ border: 1px solid var(--card-border);
78
+ border-radius: 28px;
79
+ padding: 48px;
80
+ width: 100%;
81
+ max-width: 480px;
82
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.6);
83
+ z-index: 1;
84
+ margin: 40px 20px;
85
+ animation: fadeIn 0.8s ease-out;
86
+ }
87
+
88
+ @keyframes fadeIn {
89
+ from { opacity: 0; transform: translateY(15px); }
90
+ to { opacity: 1; transform: translateY(0); }
91
+ }
92
+
93
+ .auth-card h2 {
94
+ font-size: 32px;
95
+ font-weight: 600;
96
+ margin-bottom: 8px;
97
+ text-align: center;
98
+ background: linear-gradient(to right, #fff, #94a3b8);
99
+ -webkit-background-clip: text;
100
+ -webkit-text-fill-color: transparent;
101
+ }
102
+
103
+ .subtitle {
104
+ text-align: center;
105
+ color: var(--text-muted);
106
+ font-size: 14px;
107
+ margin-bottom: 40px;
108
+ }
109
+
110
+ .form-grid {
111
+ display: grid;
112
+ gap: 20px;
113
+ }
114
+
115
+ .form-group label {
116
+ display: block;
117
+ margin-bottom: 8px;
118
+ font-size: 13px;
119
+ font-weight: 500;
120
+ color: var(--text-muted);
121
+ }
122
+
123
+ .form-group input {
124
+ width: 100%;
125
+ background: rgba(255, 255, 255, 0.04);
126
+ border: 1px solid var(--card-border);
127
+ border-radius: 14px;
128
+ padding: 13px 18px;
129
+ color: #fff;
130
+ font-size: 15px;
131
+ transition: all 0.3s;
132
+ outline: none;
133
+ }
134
+
135
+ .form-group input:focus {
136
+ background: rgba(255, 255, 255, 0.07);
137
+ border-color: var(--primary);
138
+ box-shadow: 0 0 0 4px var(--primary-glow);
139
+ }
140
+
141
+ .btn-primary {
142
+ width: 100%;
143
+ background: var(--primary);
144
+ color: white;
145
+ border: none;
146
+ border-radius: 14px;
147
+ padding: 15px;
148
+ font-size: 16px;
149
+ font-weight: 600;
150
+ cursor: pointer;
151
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
152
+ margin-top: 15px;
153
+ box-shadow: 0 10px 15px -3px rgba(34, 197, 94, 0.3);
154
+ }
155
+
156
+ .btn-primary:hover {
157
+ transform: scale(1.02);
158
+ filter: brightness(1.1);
159
+ box-shadow: 0 15px 25px -5px rgba(34, 197, 94, 0.4);
160
+ }
161
+
162
+ .btn-primary:active {
163
+ transform: scale(0.98);
164
+ }
165
+
166
+ .footer {
167
+ margin-top: 40px;
168
+ text-align: center;
169
+ font-size: 14px;
170
+ color: var(--text-muted);
171
+ }
172
+
173
+ .footer a {
174
+ color: var(--primary);
175
+ text-decoration: none;
176
+ font-weight: 600;
177
+ transition: 0.3s;
178
+ }
179
+
180
+ .footer a:hover {
181
+ opacity: 0.8;
182
+ text-decoration: underline;
183
+ }
184
+
185
+ .back-home {
186
+ display: block;
187
+ margin-top: 20px;
188
+ font-size: 12px;
189
+ opacity: 0.5;
190
+ transition: 0.3s;
191
+ }
192
+
193
+ .back-home:hover {
194
+ opacity: 1;
195
+ }
196
+
197
+ /* Responsive adjustments */
198
+ @media (max-width: 480px) {
199
+ .auth-card {
200
+ padding: 35px 20px;
201
+ }
202
+ }
203
+ </style>
204
+ </head>
205
+ <body>
206
+ <div class="background-blobs">
207
+ <div class="blob blob-1"></div>
208
+ <div class="blob blob-2"></div>
209
+ </div>
210
+
211
+ <div class="auth-card">
212
+ <h2>Join Us</h2>
213
+ <p class="subtitle">Create your account in seconds</p>
214
+
215
+ <form action="/api/users" method="POST" class="form-grid">
216
+ <div class="form-group">
217
+ <label for="name">Full Name</label>
218
+ <input type="text" id="name" name="name" placeholder="John Doe" required>
219
+ </div>
220
+
221
+ <div class="form-group">
222
+ <label for="email">Email Address</label>
223
+ <input type="email" id="email" name="email" placeholder="john@example.com" required>
224
+ </div>
225
+
226
+ <div class="form-group">
227
+ <label for="password">Choose Password</label>
228
+ <input type="password" id="password" name="password" placeholder="••••••••" required>
229
+ </div>
230
+
231
+ <button type="submit" class="btn-primary">Create Account</button>
232
+ </form>
233
+
234
+ <div class="footer">
235
+ <p>Already have an account? <a href="/login">Sign in</a></p>
236
+ <a href="/" class="back-home">← Back to home</a>
237
+ </div>
238
+ </div>
239
+
240
+ <% if (communication === 'GraphQL') { %>
241
+ <script>
242
+ document.querySelector('form').addEventListener('submit', async (e) => {
243
+ e.preventDefault();
244
+ const formData = new FormData(e.target);
245
+ const data = Object.fromEntries(formData.entries());
246
+
247
+ const query = `
248
+ mutation CreateUser($name: String!, $email: String!, $password: String!) {
249
+ createUser(name: $name, email: $email, password: $password) {
250
+ id
251
+ name
252
+ email
253
+ }
254
+ }
255
+ `;
256
+
257
+ try {
258
+ const response = await fetch('/graphql', {
259
+ method: 'POST',
260
+ headers: { 'Content-Type': 'application/json' },
261
+ body: JSON.stringify({
262
+ query,
263
+ variables: data
264
+ })
265
+ });
266
+
267
+ const result = await response.json();
268
+ if (result.errors) {
269
+ alert('Error: ' + result.errors[0].message);
270
+ } else {
271
+ alert('Account created successfully! Please login.');
272
+ window.location.href = '/login';
273
+ }
274
+ } catch (err) {
275
+ console.error(err);
276
+ alert('An error occurred during signup.');
277
+ }
278
+ });
279
+ </script>
280
+ <% } %>
281
+ </body>
282
+ </html>
@@ -1,40 +1,271 @@
1
1
  doctype html
2
2
  html(lang="en")
3
- head
4
- meta(charset="UTF-8")
5
- meta(name="viewport", content="width=device-width, initial-scale=1.0")
6
- title= projectName
7
- link(rel="stylesheet", href="/css/style.css")
8
- body
9
- .container
10
- header.header
11
- .logo 🚀
12
- h1 Welcome to #{projectName}
13
- p.subtitle A production-ready Node.js microservice starter.
14
-
15
- .card-grid
16
- .card
17
- h3 Architecture
18
- p #{architecture}
19
- .card
20
- h3 Database
21
- p #{database}
22
- .card
23
- h3 Communication
24
- p #{communication}
25
-
26
- if communication === 'Kafka'
27
- .status-card
28
- .status-icon 🔄
29
- .status-content
30
- h3 Kafka Connected
31
- p Connection to broker established successfully.
32
- else
33
- .status-card
34
- .status-icon
35
- .status-content
36
- h3 API Active
37
- p REST API is running and ready to accept requests.
38
-
39
- footer
40
- p Generated with ❤️ by Node.js Quickstart Generator
3
+ head
4
+ meta(charset="UTF-8")
5
+ meta(name="viewport" content="width=device-width, initial-scale=1.0")
6
+ title= projectName
7
+ link(href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet")
8
+ style.
9
+ :root {
10
+ --primary: #6366f1;
11
+ --primary-glow: rgba(99, 102, 241, 0.4);
12
+ --bg-dark: #0f172a;
13
+ --card-bg: rgba(255, 255, 255, 0.03);
14
+ --card-border: rgba(255, 255, 255, 0.08);
15
+ --text-main: #f8fafc;
16
+ --text-muted: #94a3b8;
17
+ --success: #22c55e;
18
+ }
19
+
20
+ * {
21
+ margin: 0;
22
+ padding: 0;
23
+ box-sizing: border-box;
24
+ font-family: 'Poppins', sans-serif;
25
+ }
26
+
27
+ body {
28
+ background-color: var(--bg-dark);
29
+ color: var(--text-main);
30
+ min-height: 100vh;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ overflow-x: hidden;
35
+ position: relative;
36
+ padding: 40px 20px;
37
+ }
38
+
39
+ .background-blobs {
40
+ position: absolute;
41
+ width: 100%;
42
+ height: 100%;
43
+ z-index: -1;
44
+ filter: blur(100px);
45
+ }
46
+
47
+ .blob {
48
+ position: absolute;
49
+ width: 500px;
50
+ height: 500px;
51
+ border-radius: 50%;
52
+ opacity: 0.3;
53
+ animation: float 25s infinite alternate;
54
+ }
55
+
56
+ .blob-1 {
57
+ background: radial-gradient(circle, #6366f1 0%, transparent 70%);
58
+ top: -200px;
59
+ left: -100px;
60
+ }
61
+
62
+ .blob-2 {
63
+ background: radial-gradient(circle, #3b82f6 0%, transparent 70%);
64
+ bottom: -200px;
65
+ right: -100px;
66
+ animation-delay: -5s;
67
+ }
68
+
69
+ @keyframes float {
70
+ 0% { transform: translate(0, 0) scale(1); }
71
+ 100% { transform: translate(150px, 80px) scale(1.3); }
72
+ }
73
+
74
+ .container {
75
+ width: 100%;
76
+ max-width: 1000px;
77
+ z-index: 1;
78
+ animation: fadeIn 0.8s ease-out;
79
+ }
80
+
81
+ @keyframes fadeIn {
82
+ from { opacity: 0; transform: translateY(20px); }
83
+ to { opacity: 1; transform: translateY(0); }
84
+ }
85
+
86
+ .hero-card {
87
+ background: var(--card-bg);
88
+ backdrop-filter: blur(16px);
89
+ -webkit-backdrop-filter: blur(16px);
90
+ border: 1px solid var(--card-border);
91
+ border-radius: 32px;
92
+ padding: 60px 40px;
93
+ text-align: center;
94
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.6);
95
+ margin-bottom: 40px;
96
+ }
97
+
98
+ .logo {
99
+ font-size: 64px;
100
+ margin-bottom: 24px;
101
+ display: inline-block;
102
+ animation: bounce 3s infinite ease-in-out;
103
+ }
104
+
105
+ @keyframes bounce {
106
+ 0%, 100% { transform: translateY(0); }
107
+ 50% { transform: translateY(-10px); }
108
+ }
109
+
110
+ h1 {
111
+ font-size: 48px;
112
+ font-weight: 600;
113
+ margin-bottom: 12px;
114
+ background: linear-gradient(to right, #fff, #94a3b8);
115
+ -webkit-background-clip: text;
116
+ -webkit-text-fill-color: transparent;
117
+ }
118
+
119
+ .subtitle {
120
+ font-size: 18px;
121
+ color: var(--text-muted);
122
+ margin-bottom: 40px;
123
+ max-width: 600px;
124
+ margin-left: auto;
125
+ margin-right: auto;
126
+ }
127
+
128
+ .btn-group {
129
+ display: flex;
130
+ gap: 16px;
131
+ justify-content: center;
132
+ flex-wrap: wrap;
133
+ }
134
+
135
+ .btn {
136
+ padding: 14px 28px;
137
+ border-radius: 14px;
138
+ font-size: 16px;
139
+ font-weight: 600;
140
+ text-decoration: none;
141
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 8px;
145
+ }
146
+
147
+ .btn-primary {
148
+ background: var(--primary);
149
+ color: white;
150
+ box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.3);
151
+ }
152
+
153
+ .btn-primary:hover {
154
+ transform: scale(1.05);
155
+ background: #4f46e5;
156
+ box-shadow: 0 15px 25px -5px rgba(99, 102, 241, 0.4);
157
+ }
158
+
159
+ .btn-secondary {
160
+ background: rgba(255, 255, 255, 0.05);
161
+ color: white;
162
+ border: 1px solid var(--card-border);
163
+ }
164
+
165
+ .btn-secondary:hover {
166
+ background: rgba(255, 255, 255, 0.1);
167
+ transform: scale(1.05);
168
+ }
169
+
170
+ .feature-grid {
171
+ display: grid;
172
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
173
+ gap: 24px;
174
+ }
175
+
176
+ .feature-card {
177
+ background: var(--card-bg);
178
+ backdrop-filter: blur(8px);
179
+ border: 1px solid var(--card-border);
180
+ border-radius: 20px;
181
+ padding: 24px;
182
+ transition: all 0.3s ease;
183
+ }
184
+
185
+ .feature-card:hover {
186
+ transform: translateY(-5px);
187
+ background: rgba(255, 255, 255, 0.06);
188
+ border-color: var(--primary);
189
+ }
190
+
191
+ .feature-card h3 {
192
+ font-size: 14px;
193
+ text-transform: uppercase;
194
+ letter-spacing: 1px;
195
+ color: var(--text-muted);
196
+ margin-bottom: 8px;
197
+ }
198
+
199
+ .feature-card p {
200
+ font-size: 20px;
201
+ font-weight: 600;
202
+ color: #fff;
203
+ }
204
+
205
+ .status-badge {
206
+ display: inline-flex;
207
+ align-items: center;
208
+ gap: 8px;
209
+ background: rgba(34, 197, 94, 0.1);
210
+ border: 1px solid rgba(34, 197, 94, 0.2);
211
+ color: var(--success);
212
+ padding: 8px 16px;
213
+ border-radius: 99px;
214
+ font-size: 14px;
215
+ font-weight: 500;
216
+ margin-top: 32px;
217
+ }
218
+
219
+ footer {
220
+ margin-top: 60px;
221
+ text-align: center;
222
+ font-size: 14px;
223
+ color: var(--text-muted);
224
+ }
225
+
226
+ @media (max-width: 640px) {
227
+ h1 { font-size: 32px; }
228
+ .hero-card { padding: 40px 20px; }
229
+ }
230
+ body
231
+ div.background-blobs
232
+ div.blob.blob-1
233
+ div.blob.blob-2
234
+ div.container
235
+ div.hero-card
236
+ div.logo 🚀
237
+ h1 Welcome to #{projectName}
238
+ p.subtitle Your enterprise-grade Node.js microservice is live and ready for production.
239
+
240
+ div.btn-group
241
+ if auth && auth.includes('JWT')
242
+ a.btn.btn-primary(href="/login") Sign In
243
+ a.btn.btn-secondary(href="/signup") Create Account
244
+
245
+ a.btn.btn-secondary(href=(communication === 'GraphQL' ? '/graphql' : '/api-docs'))
246
+ span Explore Docs
247
+ svg(width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round")
248
+ path(d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6")
249
+ polyline(points="15 3 21 3 21 9")
250
+ line(x1="10" y1="14" x2="21" y2="3")
251
+
252
+ if communication === 'Kafka'
253
+ div.status-badge
254
+ | 🔄 Kafka Connected
255
+ else
256
+ div.status-badge
257
+ | ✅ API Service Active
258
+
259
+ div.feature-grid
260
+ div.feature-card
261
+ h3 Architecture
262
+ p= architecture
263
+ div.feature-card
264
+ h3 Core Stack
265
+ p #{database} & #{communication}
266
+ div.feature-card
267
+ h3 Environment
268
+ p Node.js & Docker Ready
269
+
270
+ footer
271
+ p Generated with ❤️ by Node.js Quickstart Generator