boilercraft 1.0.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/bin/boilercraft.js +110 -0
  4. package/cli/app.js +596 -0
  5. package/cli/ui.js +356 -0
  6. package/docs/STACK_ENGINE.md +93 -0
  7. package/docs/assets/cli-create.svg +52 -0
  8. package/docs/assets/cli-menu.svg +47 -0
  9. package/docs/stacks/dotnet-core.md +69 -0
  10. package/docs/stacks/laravel-vue.md +46 -0
  11. package/docs/stacks/nextjs.md +58 -0
  12. package/docs/stacks/node-express.md +58 -0
  13. package/docs/stacks/raw-php.md +130 -0
  14. package/main.js +82 -0
  15. package/package.json +86 -0
  16. package/public/index.html +721 -0
  17. package/public/logo.png +17 -0
  18. package/public/logo.svg +17 -0
  19. package/server.js +84 -0
  20. package/services/componentGenerator.js +195 -0
  21. package/services/engine/scaffoldEngine.js +517 -0
  22. package/services/engine/toolInstaller.js +232 -0
  23. package/services/engine/versionCatalog.js +115 -0
  24. package/services/generate.js +46 -0
  25. package/services/projectGenerator.js +686 -0
  26. package/services/readmeGenerator.js +221 -0
  27. package/services/themeGenerator.js +150 -0
  28. package/services/versionResolver.js +176 -0
  29. package/stacks/dotnet-core/overlays/api/Controllers/ProductsController.cs +33 -0
  30. package/stacks/dotnet-core/overlays/api/Program.cs +33 -0
  31. package/stacks/dotnet-core/overlays/api/wwwroot/index.html +38 -0
  32. package/stacks/dotnet-core/overlays/api-auth/Controllers/AuthController.cs +87 -0
  33. package/stacks/dotnet-core/overlays/common/Data/ApplicationDbContext.cs +25 -0
  34. package/stacks/dotnet-core/overlays/common/Models/Product.cs +19 -0
  35. package/stacks/dotnet-core/overlays/mvc/Controllers/ProductsController.cs +84 -0
  36. package/stacks/dotnet-core/overlays/mvc/Views/Home/Index.cshtml +23 -0
  37. package/stacks/dotnet-core/overlays/mvc/Views/Products/Create.cshtml +16 -0
  38. package/stacks/dotnet-core/overlays/mvc/Views/Products/Delete.cshtml +16 -0
  39. package/stacks/dotnet-core/overlays/mvc/Views/Products/Edit.cshtml +17 -0
  40. package/stacks/dotnet-core/overlays/mvc/Views/Products/Index.cshtml +46 -0
  41. package/stacks/dotnet-core/overlays/mvc/Views/Products/_Form.cshtml +19 -0
  42. package/stacks/dotnet-core/overlays/mvc-auth/Controllers/AccountController.cs +98 -0
  43. package/stacks/dotnet-core/overlays/mvc-auth/Models/AppUser.cs +48 -0
  44. package/stacks/dotnet-core/overlays/mvc-auth/Views/Account/Login.cshtml +35 -0
  45. package/stacks/dotnet-core/overlays/mvc-auth/Views/Account/Register.cshtml +41 -0
  46. package/stacks/dotnet-core/overlays/mvc-auth/Views/Shared/_AuthNav.cshtml +22 -0
  47. package/stacks/dotnet-core/snippets/packages-auth.xml +4 -0
  48. package/stacks/dotnet-core/snippets/packages-common.xml +5 -0
  49. package/stacks/dotnet-core/snippets/packages-ef.xml +4 -0
  50. package/stacks/dotnet-core/snippets/packages-mssql.xml +4 -0
  51. package/stacks/dotnet-core/snippets/packages-mysql.xml +4 -0
  52. package/stacks/dotnet-core/snippets/packages-swagger.xml +4 -0
  53. package/stacks/dotnet-core/stack.json +426 -0
  54. package/stacks/laravel/overlays/auth/app/Http/Controllers/Api/AuthController.php +67 -0
  55. package/stacks/laravel/overlays/common/app/Http/Controllers/BoilerCraftController.php +14 -0
  56. package/stacks/laravel/overlays/common/resources/views/boilercraft.blade.php +36 -0
  57. package/stacks/laravel/overlays/inertia-common/resources/views/app.blade.php +15 -0
  58. package/stacks/laravel/overlays/inertia-react/resources/js/Pages/Welcome.jsx +18 -0
  59. package/stacks/laravel/overlays/inertia-react/resources/js/app.jsx +13 -0
  60. package/stacks/laravel/overlays/inertia-vue/resources/js/Pages/Welcome.vue +23 -0
  61. package/stacks/laravel/overlays/inertia-vue/resources/js/app.js +13 -0
  62. package/stacks/laravel/snippets/api-routes.php +9 -0
  63. package/stacks/laravel/snippets/web-routes-inertia.php +7 -0
  64. package/stacks/laravel/snippets/web-routes.php +4 -0
  65. package/stacks/laravel/stack.json +477 -0
  66. package/stacks/nextjs/overlays/auth/src/lib/auth.js +36 -0
  67. package/stacks/nextjs/overlays/auth-app/src/app/api/auth/login/route.js +11 -0
  68. package/stacks/nextjs/overlays/auth-app/src/app/api/auth/register/route.js +14 -0
  69. package/stacks/nextjs/overlays/auth-pages/src/pages/api/auth/login.js +14 -0
  70. package/stacks/nextjs/overlays/auth-pages/src/pages/api/auth/register.js +17 -0
  71. package/stacks/nextjs/overlays/common/.env.example +3 -0
  72. package/stacks/nextjs/overlays/common/.env.local +3 -0
  73. package/stacks/nextjs/overlays/db/mongodb/src/lib/db.js +12 -0
  74. package/stacks/nextjs/overlays/db/mssql/src/lib/db.js +17 -0
  75. package/stacks/nextjs/overlays/db/mysql/src/lib/db.js +13 -0
  76. package/stacks/nextjs/overlays/router-app/src/app/api/health/route.js +10 -0
  77. package/stacks/nextjs/overlays/router-app/src/app/layout.js +16 -0
  78. package/stacks/nextjs/overlays/router-app/src/app/page.js +19 -0
  79. package/stacks/nextjs/overlays/router-pages/src/pages/_app.js +7 -0
  80. package/stacks/nextjs/overlays/router-pages/src/pages/_document.js +13 -0
  81. package/stacks/nextjs/overlays/router-pages/src/pages/api/health.js +8 -0
  82. package/stacks/nextjs/overlays/router-pages/src/pages/index.js +27 -0
  83. package/stacks/nextjs/stack.json +257 -0
  84. package/stacks/node-express/overlays/auth/src/controllers/authController.js +53 -0
  85. package/stacks/node-express/overlays/auth/src/middlewares/auth.js +36 -0
  86. package/stacks/node-express/overlays/auth/src/routes/authRoutes.js +16 -0
  87. package/stacks/node-express/overlays/common/.env.example +5 -0
  88. package/stacks/node-express/overlays/common/public/index.html +31 -0
  89. package/stacks/node-express/overlays/common/src/server.js +32 -0
  90. package/stacks/node-express/overlays/db/mongodb/src/db.js +13 -0
  91. package/stacks/node-express/overlays/db/mssql/src/db.js +22 -0
  92. package/stacks/node-express/overlays/db/mysql/src/db.js +22 -0
  93. package/stacks/node-express/stack.json +165 -0
  94. package/templates/dotnet-bootstrap-mssql/Controllers/AuthController.cs +74 -0
  95. package/templates/dotnet-bootstrap-mssql/Controllers/ProductsController.cs +33 -0
  96. package/templates/dotnet-bootstrap-mssql/Data/ApplicationDbContext.cs +24 -0
  97. package/templates/dotnet-bootstrap-mssql/Models/Product.cs +10 -0
  98. package/templates/dotnet-core/Controllers/AuthController.cs +74 -0
  99. package/templates/laravel-full/app/Http/Controllers/AuthController.php +79 -0
  100. package/templates/laravel-full/app/Http/Controllers/HomeController.php +22 -0
  101. package/templates/laravel-full/app/Models/User.php +49 -0
  102. package/templates/laravel-full/artisan +22 -0
  103. package/templates/laravel-full/bootstrap/app.php +21 -0
  104. package/templates/laravel-full/config/database.php +54 -0
  105. package/templates/laravel-full/database/migrations/2024_01_01_000001_create_users_table.php +27 -0
  106. package/templates/laravel-full/public/index.php +17 -0
  107. package/templates/laravel-full/resources/css/app.css +3 -0
  108. package/templates/laravel-full/resources/js/Pages/Home.vue +76 -0
  109. package/templates/laravel-full/resources/js/app.js +21 -0
  110. package/templates/laravel-full/resources/js/bootstrap.js +3 -0
  111. package/templates/laravel-full/resources/views/app.blade.php +15 -0
  112. package/templates/laravel-full/routes/api.php +8 -0
  113. package/templates/laravel-full/routes/console.php +7 -0
  114. package/templates/laravel-full/routes/web.php +24 -0
  115. package/templates/laravel-full/tailwind.config.js +12 -0
  116. package/templates/laravel-full/vite.config.js +20 -0
  117. package/templates/laravel-vue/app/Http/Controllers/Auth/AuthenticatedSessionController.php +43 -0
  118. package/templates/laravel-vue-mysql/app/Http/Controllers/HomeController.php +25 -0
  119. package/templates/laravel-vue-mysql/resources/js/Pages/Home.vue +70 -0
  120. package/templates/nextjs/src/app/api/auth/login/route.js +28 -0
  121. package/templates/nextjs-mongodb/src/app/api/health/route.js +17 -0
  122. package/templates/nextjs-mongodb/src/lib/mongodb.js +18 -0
  123. package/templates/nextjs-mssql/src/app/api/health/route.js +24 -0
  124. package/templates/nextjs-mssql/src/lib/mssql.js +38 -0
  125. package/templates/node-express/src/controllers/authController.js +53 -0
  126. package/templates/node-express/src/middlewares/auth.js +36 -0
  127. package/templates/node-express/src/routes/authRoutes.js +16 -0
  128. package/templates/node-mongodb/src/controllers/userController.js +30 -0
  129. package/templates/node-mongodb/src/middlewares/errorHandler.js +8 -0
  130. package/templates/node-mongodb/src/models/User.js +23 -0
  131. package/templates/node-mongodb/src/routes/api.js +9 -0
  132. package/templates/raw-php-mysql/app/Controllers/AuthController.php +73 -0
  133. package/templates/raw-php-mysql/app/Controllers/HomeController.php +65 -0
  134. package/templates/raw-php-mysql/app/Models/User.php +60 -0
  135. package/templates/raw-php-mysql/app/Views/404.php +15 -0
  136. package/templates/raw-php-mysql/app/Views/auth/login.php +66 -0
  137. package/templates/raw-php-mysql/app/Views/auth/register.php +71 -0
  138. package/templates/raw-php-mysql/app/Views/dashboard.php +50 -0
  139. package/templates/raw-php-mysql/app/Views/home.php +83 -0
  140. package/templates/raw-php-mysql/config/Auth.php +62 -0
  141. package/templates/raw-php-mysql/config/Database.php +100 -0
  142. package/templates/raw-php-mysql/config/Env.php +30 -0
  143. package/templates/raw-php-mysql/config/Middleware.php +53 -0
  144. package/templates/raw-php-mysql/config/QueryBuilder.php +109 -0
  145. package/templates/raw-php-mysql/config/Router.php +33 -0
  146. package/templates/raw-php-mysql/public/index.php +57 -0
@@ -0,0 +1,426 @@
1
+ {
2
+ "id": "dotnet-core",
3
+ "name": ".NET (ASP.NET Core Web API)",
4
+ "aliases": [
5
+ "dotnet",
6
+ "dotnet-bootstrap-mssql"
7
+ ],
8
+ "defaultPort": 5000,
9
+ "databases": [
10
+ "mssql",
11
+ "mysql"
12
+ ],
13
+ "stylings": [
14
+ "tailwind",
15
+ "bootstrap",
16
+ "vanilla"
17
+ ],
18
+ "options": [
19
+ {
20
+ "id": "template",
21
+ "label": "Project type",
22
+ "default": "mvc",
23
+ "choices": [
24
+ {
25
+ "value": "mvc",
26
+ "label": "MVC (Model · View · Controller)",
27
+ "hint": "server-rendered pages · Razor views"
28
+ },
29
+ {
30
+ "value": "api",
31
+ "label": "Web API",
32
+ "hint": "JSON endpoints · Swagger · for SPA / mobile"
33
+ }
34
+ ]
35
+ }
36
+ ],
37
+ "nextSteps": [
38
+ "dotnet run --urls http://localhost:{{PORT}}"
39
+ ],
40
+ "versions": {
41
+ "source": "dotnet",
42
+ "minMajor": 8,
43
+ "testedUpTo": 10,
44
+ "lts": [
45
+ 8,
46
+ 10
47
+ ],
48
+ "offline": [
49
+ 10,
50
+ 9,
51
+ 8
52
+ ]
53
+ },
54
+ "requires": [
55
+ {
56
+ "cmd": "dotnet",
57
+ "args": [
58
+ "--list-sdks"
59
+ ],
60
+ "name": ".NET SDK",
61
+ "install": "https://dotnet.microsoft.com/download",
62
+ "minMajor": {
63
+ "pattern": "^(\\d+)\\."
64
+ }
65
+ }
66
+ ],
67
+ "vars": [
68
+ {
69
+ "name": "SWASHBUCKLE_VERSION",
70
+ "when": {
71
+ "version": "<10"
72
+ },
73
+ "value": "9.*"
74
+ },
75
+ {
76
+ "name": "SWASHBUCKLE_VERSION",
77
+ "when": {
78
+ "version": ">=10"
79
+ },
80
+ "value": "10.*"
81
+ },
82
+ {
83
+ "name": "DB_USE",
84
+ "when": {
85
+ "database": "mssql"
86
+ },
87
+ "value": "options.UseSqlServer(connectionString)"
88
+ },
89
+ {
90
+ "name": "DB_USE",
91
+ "when": {
92
+ "database": "mysql"
93
+ },
94
+ "value": "options.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 36)))"
95
+ },
96
+ {
97
+ "name": "CONNECTION_STRING",
98
+ "when": {
99
+ "database": "mssql"
100
+ },
101
+ "value": "Server=localhost,1433;Database={{DB_NAME}};User Id=sa;Password=change-me;TrustServerCertificate=True;"
102
+ },
103
+ {
104
+ "name": "CONNECTION_STRING",
105
+ "when": {
106
+ "database": "mysql"
107
+ },
108
+ "value": "Server=localhost;Port=3306;Database={{DB_NAME}};Uid=root;Pwd=;"
109
+ },
110
+ {
111
+ "name": "AUTH_USINGS",
112
+ "when": {
113
+ "auth": true,
114
+ "template": "api"
115
+ },
116
+ "value": "using System.Text;\nusing Microsoft.AspNetCore.Authentication.JwtBearer;\nusing Microsoft.IdentityModel.Tokens;"
117
+ },
118
+ {
119
+ "name": "AUTH_SERVICES",
120
+ "when": {
121
+ "auth": true,
122
+ "template": "api"
123
+ },
124
+ "value": "var jwtKey = builder.Configuration[\"Jwt:Key\"] ?? throw new InvalidOperationException(\"Jwt:Key is not configured\");\nbuilder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\n .AddJwtBearer(options =>\n {\n options.TokenValidationParameters = new TokenValidationParameters\n {\n ValidateIssuer = false,\n ValidateAudience = false,\n ValidateIssuerSigningKey = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey))\n };\n });"
125
+ },
126
+ {
127
+ "name": "AUTH_MIDDLEWARE",
128
+ "when": {
129
+ "auth": true,
130
+ "template": "api"
131
+ },
132
+ "value": "app.UseAuthentication();"
133
+ },
134
+ {
135
+ "name": "DBCONTEXT_EXTRA",
136
+ "when": {
137
+ "auth": true,
138
+ "template": "mvc"
139
+ },
140
+ "value": "public DbSet<AppUser> Users { get; set; }"
141
+ },
142
+ {
143
+ "name": "PRODUCTS_AUTHORIZE",
144
+ "when": {
145
+ "auth": true,
146
+ "template": "mvc"
147
+ },
148
+ "value": "[Microsoft.AspNetCore.Authorization.Authorize]"
149
+ },
150
+ {
151
+ "name": "MVC_USINGS",
152
+ "when": {
153
+ "template": "mvc"
154
+ },
155
+ "value": "using Microsoft.EntityFrameworkCore;\nusing {{NAMESPACE}}.Data;\n"
156
+ },
157
+ {
158
+ "name": "MVC_AUTH_USINGS",
159
+ "when": {
160
+ "auth": true,
161
+ "template": "mvc"
162
+ },
163
+ "value": "using Microsoft.AspNetCore.Authentication.Cookies;\n"
164
+ },
165
+ {
166
+ "name": "MVC_AUTH_SERVICES",
167
+ "when": {
168
+ "auth": true,
169
+ "template": "mvc"
170
+ },
171
+ "value": "\nbuilder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)\n .AddCookie(options =>\n {\n options.LoginPath = \"/Account/Login\";\n options.LogoutPath = \"/Account/Logout\";\n });"
172
+ }
173
+ ],
174
+ "steps": [
175
+ {
176
+ "label": "Running official dotnet new webapi (net{{VERSION}}.0)",
177
+ "cwd": "parent",
178
+ "run": [
179
+ "dotnet",
180
+ "new",
181
+ "webapi",
182
+ "-n",
183
+ "{{PROJECT_NAME}}",
184
+ "-o",
185
+ "{{PROJECT_NAME}}",
186
+ "--framework",
187
+ "net{{VERSION}}.0"
188
+ ],
189
+ "when": {
190
+ "template": "api"
191
+ }
192
+ },
193
+ {
194
+ "label": "Running official dotnet new mvc (net{{VERSION}}.0)",
195
+ "when": {
196
+ "template": "mvc"
197
+ },
198
+ "cwd": "parent",
199
+ "run": [
200
+ "dotnet",
201
+ "new",
202
+ "mvc",
203
+ "-n",
204
+ "{{PROJECT_NAME}}",
205
+ "-o",
206
+ "{{PROJECT_NAME}}",
207
+ "--framework",
208
+ "net{{VERSION}}.0"
209
+ ]
210
+ },
211
+ {
212
+ "label": "Creating Visual Studio solution",
213
+ "run": [
214
+ "dotnet",
215
+ "new",
216
+ "sln",
217
+ "-n",
218
+ "{{PROJECT_NAME}}"
219
+ ]
220
+ },
221
+ {
222
+ "run": [
223
+ "dotnet",
224
+ "sln",
225
+ "add",
226
+ "{{PROJECT_NAME}}.csproj"
227
+ ]
228
+ },
229
+ {
230
+ "label": "Adding NuGet packages for .NET {{VERSION}}",
231
+ "insertBefore": "{{PROJECT_NAME}}.csproj",
232
+ "marker": "</Project>",
233
+ "from": "snippets/packages-ef.xml"
234
+ },
235
+ {
236
+ "insertBefore": "{{PROJECT_NAME}}.csproj",
237
+ "marker": "</Project>",
238
+ "from": "snippets/packages-swagger.xml",
239
+ "when": {
240
+ "template": "api"
241
+ }
242
+ },
243
+ {
244
+ "when": {
245
+ "database": "mssql"
246
+ },
247
+ "insertBefore": "{{PROJECT_NAME}}.csproj",
248
+ "marker": "</Project>",
249
+ "from": "snippets/packages-mssql.xml"
250
+ },
251
+ {
252
+ "when": {
253
+ "database": "mysql"
254
+ },
255
+ "insertBefore": "{{PROJECT_NAME}}.csproj",
256
+ "marker": "</Project>",
257
+ "from": "snippets/packages-mysql.xml"
258
+ },
259
+ {
260
+ "when": {
261
+ "auth": true,
262
+ "template": "api"
263
+ },
264
+ "insertBefore": "{{PROJECT_NAME}}.csproj",
265
+ "marker": "</Project>",
266
+ "from": "snippets/packages-auth.xml"
267
+ },
268
+ {
269
+ "label": "Applying BoilerCraft overlay",
270
+ "copy": "overlays/common"
271
+ },
272
+ {
273
+ "when": {
274
+ "template": "api"
275
+ },
276
+ "copy": "overlays/api"
277
+ },
278
+ {
279
+ "when": {
280
+ "auth": true,
281
+ "template": "api"
282
+ },
283
+ "copy": "overlays/api-auth"
284
+ },
285
+ {
286
+ "write": "wwwroot/theme.css",
287
+ "content": "{{THEME_CSS}}",
288
+ "when": {
289
+ "template": "api"
290
+ }
291
+ },
292
+ {
293
+ "write": "wwwroot/theme.js",
294
+ "content": "{{THEME_JS}}",
295
+ "when": {
296
+ "template": "api"
297
+ }
298
+ },
299
+ {
300
+ "json": "appsettings.json",
301
+ "merge": {
302
+ "ConnectionStrings": {
303
+ "DefaultConnection": "{{CONNECTION_STRING}}"
304
+ }
305
+ }
306
+ },
307
+ {
308
+ "when": {
309
+ "auth": true,
310
+ "template": "api"
311
+ },
312
+ "json": "appsettings.Development.json",
313
+ "merge": {
314
+ "Jwt": {
315
+ "Key": "{{RANDOM_SECRET}}"
316
+ }
317
+ }
318
+ },
319
+ {
320
+ "label": "Wiring MVC: database, views and navigation",
321
+ "when": {
322
+ "template": "mvc"
323
+ },
324
+ "copy": "overlays/mvc"
325
+ },
326
+ {
327
+ "when": {
328
+ "auth": true,
329
+ "template": "mvc"
330
+ },
331
+ "copy": "overlays/mvc-auth"
332
+ },
333
+ {
334
+ "when": {
335
+ "template": "mvc"
336
+ },
337
+ "write": "wwwroot/css/boilercraft-theme.css",
338
+ "content": "{{THEME_CSS}}"
339
+ },
340
+ {
341
+ "when": {
342
+ "template": "mvc"
343
+ },
344
+ "write": "wwwroot/js/boilercraft-theme.js",
345
+ "content": "{{THEME_JS}}"
346
+ },
347
+ {
348
+ "when": {
349
+ "template": "mvc"
350
+ },
351
+ "prepend": "Program.cs",
352
+ "content": "{{MVC_USINGS}}{{MVC_AUTH_USINGS}}\n"
353
+ },
354
+ {
355
+ "when": {
356
+ "template": "mvc"
357
+ },
358
+ "replace": "Program.cs",
359
+ "skipIfContains": "ApplicationDbContext",
360
+ "find": "builder.Services.AddControllersWithViews();",
361
+ "with": "$&\n\n// Database: {{DATABASE}} (Entity Framework Core)\nvar connectionString = builder.Configuration.GetConnectionString(\"DefaultConnection\")\n ?? throw new InvalidOperationException(\"ConnectionStrings:DefaultConnection is not configured\");\nbuilder.Services.AddDbContext<ApplicationDbContext>(options => {{DB_USE}});{{MVC_AUTH_SERVICES}}"
362
+ },
363
+ {
364
+ "when": {
365
+ "template": "mvc"
366
+ },
367
+ "replace": "Program.cs",
368
+ "skipIfContains": "EnsureCreated",
369
+ "find": "var app = builder.Build();",
370
+ "with": "$&\n\n// Development convenience: create the database/tables if they do not exist yet.\n// For production, switch to EF Core migrations (dotnet ef migrations add Initial).\nif (app.Environment.IsDevelopment())\n{\n using var scope = app.Services.CreateScope();\n try\n {\n scope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.EnsureCreated();\n }\n catch (Exception ex)\n {\n app.Logger.LogWarning(\"Could not reach the database ({Message}). Check ConnectionStrings:DefaultConnection.\", ex.Message);\n }\n}"
371
+ },
372
+ {
373
+ "when": {
374
+ "auth": true,
375
+ "template": "mvc"
376
+ },
377
+ "replace": "Program.cs",
378
+ "skipIfContains": "app.UseAuthentication();",
379
+ "find": "app.UseAuthorization();",
380
+ "with": "app.UseAuthentication();\n$&"
381
+ },
382
+ {
383
+ "when": {
384
+ "template": "mvc"
385
+ },
386
+ "replace": "Views/Shared/_Layout.cshtml",
387
+ "find": "<html lang=\"en\">",
388
+ "with": "<html lang=\"en\" data-theme=\"{{COLOR_MODE}}\">"
389
+ },
390
+ {
391
+ "when": {
392
+ "template": "mvc"
393
+ },
394
+ "insertBefore": "Views/Shared/_Layout.cshtml",
395
+ "marker": "</head>",
396
+ "content": " <link rel=\"stylesheet\" href=\"~/css/boilercraft-theme.css\" asp-append-version=\"true\" />\n"
397
+ },
398
+ {
399
+ "when": {
400
+ "template": "mvc"
401
+ },
402
+ "replace": "Views/Shared/_Layout.cshtml",
403
+ "skipIfContains": "asp-controller=\"Products\"",
404
+ "findRegex": "asp-action=\"Privacy\">Privacy</a>\\s*</li>",
405
+ "with": "$&\n <li class=\"nav-item\">\n <a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Products\" asp-action=\"Index\">Products</a>\n </li>"
406
+ },
407
+ {
408
+ "when": {
409
+ "auth": true,
410
+ "template": "mvc"
411
+ },
412
+ "replace": "Views/Shared/_Layout.cshtml",
413
+ "skipIfContains": "_AuthNav",
414
+ "find": "</ul>",
415
+ "with": "$&\n <partial name=\"_AuthNav\" />"
416
+ },
417
+ {
418
+ "label": "Restoring packages",
419
+ "optional": true,
420
+ "run": [
421
+ "dotnet",
422
+ "restore"
423
+ ]
424
+ }
425
+ ]
426
+ }
@@ -0,0 +1,67 @@
1
+ <?php
2
+
3
+ namespace App\Http\Controllers\Api;
4
+
5
+ use App\Http\Controllers\Controller;
6
+ use App\Models\User;
7
+ use Illuminate\Http\Request;
8
+ use Illuminate\Support\Facades\Hash;
9
+ use Illuminate\Validation\ValidationException;
10
+
11
+ class AuthController extends Controller
12
+ {
13
+ public function register(Request $request)
14
+ {
15
+ $validated = $request->validate([
16
+ 'name' => ['required', 'string', 'max:255'],
17
+ 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
18
+ 'password' => ['required', 'string', 'min:8', 'confirmed'],
19
+ ]);
20
+
21
+ $user = User::create([
22
+ 'name' => $validated['name'],
23
+ 'email' => $validated['email'],
24
+ 'password' => Hash::make($validated['password']),
25
+ ]);
26
+
27
+ return response()->json([
28
+ 'success' => true,
29
+ 'token' => $user->createToken('api')->plainTextToken,
30
+ 'user' => $user,
31
+ ], 201);
32
+ }
33
+
34
+ public function login(Request $request)
35
+ {
36
+ $credentials = $request->validate([
37
+ 'email' => ['required', 'email'],
38
+ 'password' => ['required'],
39
+ ]);
40
+
41
+ $user = User::where('email', $credentials['email'])->first();
42
+
43
+ if (! $user || ! Hash::check($credentials['password'], $user->password)) {
44
+ throw ValidationException::withMessages([
45
+ 'email' => ['The provided credentials do not match our records.'],
46
+ ]);
47
+ }
48
+
49
+ return response()->json([
50
+ 'success' => true,
51
+ 'token' => $user->createToken('api')->plainTextToken,
52
+ 'user' => $user,
53
+ ]);
54
+ }
55
+
56
+ public function me(Request $request)
57
+ {
58
+ return response()->json(['success' => true, 'user' => $request->user()]);
59
+ }
60
+
61
+ public function logout(Request $request)
62
+ {
63
+ $request->user()->currentAccessToken()->delete();
64
+
65
+ return response()->json(['success' => true, 'message' => 'Logged out successfully.']);
66
+ }
67
+ }
@@ -0,0 +1,14 @@
1
+ <?php
2
+
3
+ namespace App\Http\Controllers;
4
+
5
+ class BoilerCraftController extends Controller
6
+ {
7
+ public function index()
8
+ {
9
+ return view('boilercraft', [
10
+ 'laravelVersion' => app()->version(),
11
+ 'database' => config('database.default'),
12
+ ]);
13
+ }
14
+ }
@@ -0,0 +1,36 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ str_replace('_', '-', app()->getLocale()) }}" data-theme="{{COLOR_MODE}}">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>{{ config('app.name') }}</title>
7
+ <link rel="stylesheet" href="{{ asset('css/boilercraft-theme.css') }}">
8
+ @verbatim
9
+ {{STYLESHEET_LINK}}
10
+ @endverbatim
11
+ </head>
12
+ <body class="p-6">
13
+ <div style="max-width: 900px; margin: 2rem auto; text-align: center;">
14
+ @verbatim
15
+ {{LOGO_HTML}}
16
+ @endverbatim
17
+ <h1>{{APP_TITLE}}</h1>
18
+ <p style="color: var(--color-text-muted);">{{APP_DESC}}</p>
19
+
20
+ <div style="text-align: left; padding: 2rem; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-base); margin-top: 2rem;">
21
+ <h3>Active Architecture:</h3>
22
+ <ul>
23
+ <li><strong>Framework:</strong> Laravel {{ $laravelVersion }}</li>
24
+ <li><strong>Database connection:</strong> {{ $database }}</li>
25
+ <li><strong>Styling:</strong> {{STYLING}}</li>
26
+ </ul>
27
+ <hr style="border: none; border-top: 1px solid var(--color-border); margin: 1.5rem 0;" />
28
+ <h4>Components:</h4>
29
+ @verbatim
30
+ {{UI_COMPONENTS}}
31
+ @endverbatim
32
+ </div>
33
+ </div>
34
+ <script src="{{ asset('js/boilercraft-theme.js') }}"></script>
35
+ </body>
36
+ </html>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ str_replace('_', '-', app()->getLocale()) }}" data-theme="{{COLOR_MODE}}">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title inertia>{{ config('app.name') }}</title>
7
+ <link rel="stylesheet" href="{{ asset('css/boilercraft-theme.css') }}">
8
+ {{VITE_TAGS}}
9
+ @inertiaHead
10
+ </head>
11
+ <body>
12
+ @inertia
13
+ <script src="{{ asset('js/boilercraft-theme.js') }}"></script>
14
+ </body>
15
+ </html>
@@ -0,0 +1,18 @@
1
+ export default function Welcome({ laravelVersion, database }) {
2
+ return (
3
+ <div style={{ maxWidth: '900px', margin: '3rem auto', padding: '1rem', textAlign: 'center' }}>
4
+ <h1 style={{ fontSize: '2.5rem', fontWeight: 800 }}>{{APP_TITLE}}</h1>
5
+ <p style={{ color: 'var(--color-text-muted)' }}>{{APP_DESC}}</p>
6
+
7
+ <div style={{ marginTop: '2rem', padding: '1.5rem', background: 'var(--color-surface)', borderRadius: '1rem', textAlign: 'left', border: '1px solid var(--color-border)' }}>
8
+ <h3>Configured Architecture:</h3>
9
+ <ul>
10
+ <li><strong>Framework:</strong> Laravel {laravelVersion} + React (Inertia)</li>
11
+ <li><strong>Database connection:</strong> {database}</li>
12
+ <li><strong>Styling:</strong> {{STYLING}}</li>
13
+ <li><strong>Theme:</strong> {{THEME}}</li>
14
+ </ul>
15
+ </div>
16
+ </div>
17
+ );
18
+ }
@@ -0,0 +1,13 @@
1
+ import './bootstrap';
2
+ import { createInertiaApp } from '@inertiajs/react';
3
+ import { createRoot } from 'react-dom/client';
4
+
5
+ createInertiaApp({
6
+ resolve: (name) => {
7
+ const pages = import.meta.glob('./Pages/**/*.jsx', { eager: true });
8
+ return pages[`./Pages/${name}.jsx`];
9
+ },
10
+ setup({ el, App, props }) {
11
+ createRoot(el).render(<App {...props} />);
12
+ },
13
+ });
@@ -0,0 +1,23 @@
1
+ <script setup>
2
+ defineProps({
3
+ laravelVersion: String,
4
+ database: String,
5
+ });
6
+ </script>
7
+
8
+ <template>
9
+ <div style="max-width: 900px; margin: 3rem auto; padding: 1rem; text-align: center;">
10
+ <h1 style="font-size: 2.5rem; font-weight: 800;">{{APP_TITLE}}</h1>
11
+ <p style="color: var(--color-text-muted);">{{APP_DESC}}</p>
12
+
13
+ <div style="margin-top: 2rem; padding: 1.5rem; background: var(--color-surface); border-radius: 1rem; text-align: left; border: 1px solid var(--color-border);">
14
+ <h3>Configured Architecture:</h3>
15
+ <ul>
16
+ <li><strong>Framework:</strong> Laravel {{ laravelVersion }} + Vue 3 (Inertia)</li>
17
+ <li><strong>Database connection:</strong> {{ database }}</li>
18
+ <li><strong>Styling:</strong> {{STYLING}}</li>
19
+ <li><strong>Theme:</strong> {{THEME}}</li>
20
+ </ul>
21
+ </div>
22
+ </div>
23
+ </template>
@@ -0,0 +1,13 @@
1
+ import './bootstrap';
2
+ import { createApp, h } from 'vue';
3
+ import { createInertiaApp } from '@inertiajs/vue3';
4
+
5
+ createInertiaApp({
6
+ resolve: (name) => {
7
+ const pages = import.meta.glob('./Pages/**/*.vue', { eager: true });
8
+ return pages[`./Pages/${name}.vue`];
9
+ },
10
+ setup({ el, App, props, plugin }) {
11
+ createApp({ render: () => h(App, props) }).use(plugin).mount(el);
12
+ },
13
+ });
@@ -0,0 +1,9 @@
1
+
2
+
3
+ // BoilerCraft token authentication (Laravel Sanctum).
4
+ Route::post('/auth/register', [\App\Http\Controllers\Api\AuthController::class, 'register']);
5
+ Route::post('/auth/login', [\App\Http\Controllers\Api\AuthController::class, 'login']);
6
+ Route::middleware('auth:sanctum')->group(function () {
7
+ Route::get('/auth/me', [\App\Http\Controllers\Api\AuthController::class, 'me']);
8
+ Route::post('/auth/logout', [\App\Http\Controllers\Api\AuthController::class, 'logout']);
9
+ });
@@ -0,0 +1,7 @@
1
+
2
+
3
+ // BoilerCraft landing page (Inertia), registered last so it replaces the default welcome route.
4
+ Route::get('/', fn () => \Inertia\Inertia::render('Welcome', [
5
+ 'laravelVersion' => app()->version(),
6
+ 'database' => config('database.default'),
7
+ ]))->name('home');
@@ -0,0 +1,4 @@
1
+
2
+
3
+ // BoilerCraft landing page (registered last, so it replaces the default welcome route).
4
+ Route::get('/', [\App\Http\Controllers\BoilerCraftController::class, 'index'])->name('home');