@chimerai/cli 0.2.88 → 0.2.89
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/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +78 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +104 -47
- package/dist/templates/index.d.ts +2 -2
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +5 -3
- package/dist/templates/layout.d.ts +6 -0
- package/dist/templates/layout.d.ts.map +1 -1
- package/dist/templates/layout.js +25 -0
- package/dist/templates/middleware.d.ts +7 -0
- package/dist/templates/middleware.d.ts.map +1 -1
- package/dist/templates/middleware.js +63 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAw5ED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBAyHtE"}
|
package/dist/commands/add.js
CHANGED
|
@@ -185,6 +185,18 @@ model ApiKey {
|
|
|
185
185
|
@@index([keyHash])
|
|
186
186
|
}
|
|
187
187
|
`,
|
|
188
|
+
filePatches: [
|
|
189
|
+
{
|
|
190
|
+
marker: '// @chimerai component=AppPageNoAuth version=1.0',
|
|
191
|
+
target: 'app/page.tsx',
|
|
192
|
+
generator: () => templates.generateAppPage(),
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
marker: '// @chimerai component=MiddlewareNoAuth version=1.0',
|
|
196
|
+
target: 'middleware.ts',
|
|
197
|
+
generator: () => templates.generateMiddleware(),
|
|
198
|
+
},
|
|
199
|
+
],
|
|
188
200
|
envVars: [
|
|
189
201
|
{
|
|
190
202
|
key: 'DATABASE_URL',
|
|
@@ -285,6 +297,7 @@ Next steps:
|
|
|
285
297
|
name: 'chat-ui',
|
|
286
298
|
displayName: 'Chat UI',
|
|
287
299
|
description: 'Full-featured chat interface with streaming, conversation management, and multi-provider support',
|
|
300
|
+
requiredFeatures: ['auth'],
|
|
288
301
|
requiredUtils: [
|
|
289
302
|
{ generator: () => templates.generateUseAppNameHook(), target: 'lib/use-app-name.ts' },
|
|
290
303
|
],
|
|
@@ -774,6 +787,7 @@ Next steps:
|
|
|
774
787
|
name: 'billing',
|
|
775
788
|
displayName: 'Billing System',
|
|
776
789
|
description: 'Stripe integration for subscriptions',
|
|
790
|
+
requiredFeatures: ['auth'],
|
|
777
791
|
files: [
|
|
778
792
|
{
|
|
779
793
|
generator: () => templates.generateBillingPage(),
|
|
@@ -884,6 +898,7 @@ Next steps:
|
|
|
884
898
|
name: 'audit-log',
|
|
885
899
|
displayName: 'Audit Log',
|
|
886
900
|
description: 'Compliance audit logging — track all admin and user actions',
|
|
901
|
+
requiredFeatures: ['auth', 'admin-dashboard'],
|
|
887
902
|
files: [
|
|
888
903
|
{
|
|
889
904
|
generator: () => templates.generateAdminLogsPage(),
|
|
@@ -904,6 +919,7 @@ Next steps:
|
|
|
904
919
|
name: 'admin-dashboard',
|
|
905
920
|
displayName: 'Admin Dashboard',
|
|
906
921
|
description: 'Complete admin panel with user/role management, settings, audit logs, and RBAC',
|
|
922
|
+
requiredFeatures: ['auth'],
|
|
907
923
|
files: [
|
|
908
924
|
// Admin layout with session + admin role guard
|
|
909
925
|
{
|
|
@@ -1159,7 +1175,52 @@ function transformSchemaForSqlite(schema) {
|
|
|
1159
1175
|
* Generic component addition function (PHASE 4 refactoring)
|
|
1160
1176
|
* Uses inline template generators — no fs.copy(), no dependency on templates/ folder
|
|
1161
1177
|
*/
|
|
1178
|
+
/**
|
|
1179
|
+
* Checks if a given feature marker exists anywhere in the project's package.json
|
|
1180
|
+
* or in a generated file (by scanning for the @chimerai marker convention).
|
|
1181
|
+
* We use presence of installed packages as a proxy:
|
|
1182
|
+
* - 'auth' → next-auth in dependencies
|
|
1183
|
+
* - 'rbac' → @chimerai/rbac or lib/rbac.ts present
|
|
1184
|
+
* - 'admin-dashboard'→ @chimerai/admin-ui or app/admin present
|
|
1185
|
+
* - 'billing' → stripe in dependencies
|
|
1186
|
+
*/
|
|
1187
|
+
async function hasFeature(feature, targetDir) {
|
|
1188
|
+
const pkgPath = path_1.default.join(targetDir, 'package.json');
|
|
1189
|
+
try {
|
|
1190
|
+
const pkg = await fs_extra_1.default.readJson(pkgPath);
|
|
1191
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
1192
|
+
if (feature === 'auth')
|
|
1193
|
+
return 'next-auth' in deps;
|
|
1194
|
+
if (feature === 'billing')
|
|
1195
|
+
return 'stripe' in deps;
|
|
1196
|
+
if (feature === 'rbac') {
|
|
1197
|
+
return ('@chimerai/rbac' in deps ||
|
|
1198
|
+
(await fs_extra_1.default.pathExists(path_1.default.join(targetDir, 'lib/rbac.ts'))));
|
|
1199
|
+
}
|
|
1200
|
+
if (feature === 'admin-dashboard') {
|
|
1201
|
+
return ('@chimerai/admin-ui' in deps ||
|
|
1202
|
+
(await fs_extra_1.default.pathExists(path_1.default.join(targetDir, 'app/admin'))));
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
catch {
|
|
1206
|
+
// ignore — treat as missing
|
|
1207
|
+
}
|
|
1208
|
+
return false;
|
|
1209
|
+
}
|
|
1162
1210
|
async function addComponent(config, targetDir) {
|
|
1211
|
+
// ── Pre-flight: check required features ────────────────────────────────
|
|
1212
|
+
if (config.requiredFeatures && config.requiredFeatures.length > 0) {
|
|
1213
|
+
const missing = [];
|
|
1214
|
+
for (const req of config.requiredFeatures) {
|
|
1215
|
+
if (!(await hasFeature(req, targetDir)))
|
|
1216
|
+
missing.push(req);
|
|
1217
|
+
}
|
|
1218
|
+
if (missing.length > 0) {
|
|
1219
|
+
console.error(chalk_1.default.red(`\n✗ Cannot add "${config.name}" — missing required feature(s): ${missing.map((f) => `"${f}"`).join(', ')}`));
|
|
1220
|
+
console.error(chalk_1.default.yellow(` Run first: ${missing.map((f) => `chimerai add ${f}`).join(' then ')}`));
|
|
1221
|
+
process.exit(1);
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1163
1224
|
const spinner = (0, ora_1.default)(`Adding ${config.displayName}...`).start();
|
|
1164
1225
|
try {
|
|
1165
1226
|
// 1. Generate and write all required files
|
|
@@ -1200,6 +1261,23 @@ async function addComponent(config, targetDir) {
|
|
|
1200
1261
|
}
|
|
1201
1262
|
// 1.6 (removed) — We no longer patch the user's root layout.
|
|
1202
1263
|
// Instead, the postAddMessage tells the user how to add SessionProvider.
|
|
1264
|
+
// 1.6b Apply filePatches — upgrade existing no-auth files to auth-aware versions
|
|
1265
|
+
if (config.filePatches) {
|
|
1266
|
+
for (const patch of config.filePatches) {
|
|
1267
|
+
const targetPath = path_1.default.join(targetDir, patch.target);
|
|
1268
|
+
if (!(await fs_extra_1.default.pathExists(targetPath)))
|
|
1269
|
+
continue;
|
|
1270
|
+
const existing = await fs_extra_1.default.readFile(targetPath, 'utf-8');
|
|
1271
|
+
if (existing.includes(patch.marker)) {
|
|
1272
|
+
// File has the no-auth marker \u2014 replace it with auth-aware version
|
|
1273
|
+
const bakPath = targetPath + '.bak';
|
|
1274
|
+
await fs_extra_1.default.writeFile(bakPath, existing); // backup
|
|
1275
|
+
await fs_extra_1.default.writeFile(targetPath, patch.generator());
|
|
1276
|
+
spinner.text = `Adding ${config.displayName}... (upgraded ${patch.target})`;
|
|
1277
|
+
}
|
|
1278
|
+
// If marker absent, file is already the auth-aware version \u2014 skip
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1203
1281
|
// 1.7 Auto-write environment variables to .env
|
|
1204
1282
|
if (config.envVars && config.envVars.length > 0) {
|
|
1205
1283
|
const envPath = path_1.default.join(targetDir, '.env');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,iBAyI9E"}
|
package/dist/commands/create.js
CHANGED
|
@@ -54,14 +54,34 @@ const license_js_1 = require("../license.js");
|
|
|
54
54
|
/** Canonical feature definitions for `chimerai create` */
|
|
55
55
|
const AVAILABLE_FEATURES = [
|
|
56
56
|
{ name: '🔐 Authentication (NextAuth)', value: 'auth', licenseKey: 'auth', checked: true },
|
|
57
|
-
{
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
{
|
|
58
|
+
name: '👥 RBAC System (Users, Roles, Permissions)',
|
|
59
|
+
value: 'rbac',
|
|
60
|
+
licenseKey: 'rbac',
|
|
61
|
+
checked: true,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: '🔌 Model Providers Management',
|
|
65
|
+
value: 'model-providers',
|
|
66
|
+
licenseKey: 'model-providers',
|
|
67
|
+
checked: true,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: '📝 Prompt Template Management',
|
|
71
|
+
value: 'prompt-management',
|
|
72
|
+
licenseKey: 'prompt-management',
|
|
73
|
+
checked: true,
|
|
74
|
+
},
|
|
60
75
|
{ name: '💬 AI Chat Interface', value: 'ai-chat', licenseKey: 'ai-chat', checked: false },
|
|
61
76
|
{ name: '🔍 RAG / Vector Store (FAISS)', value: 'rag', licenseKey: 'rag', checked: false },
|
|
62
77
|
{ name: '💳 Billing System (Stripe)', value: 'billing', licenseKey: 'billing', checked: false },
|
|
63
78
|
{ name: '📊 API Usage Analytics', value: 'analytics', licenseKey: 'analytics', checked: true },
|
|
64
|
-
{
|
|
79
|
+
{
|
|
80
|
+
name: '🎨 Admin Dashboard',
|
|
81
|
+
value: 'admin-dashboard',
|
|
82
|
+
licenseKey: 'admin-dashboard',
|
|
83
|
+
checked: true,
|
|
84
|
+
},
|
|
65
85
|
];
|
|
66
86
|
function getRequiredTierLabel(licenseKey) {
|
|
67
87
|
if (license_js_1.FREE_COMPONENTS.has(licenseKey))
|
|
@@ -133,6 +153,22 @@ async function createCommand(projectName, options) {
|
|
|
133
153
|
if (selectedFeatures.length === 0) {
|
|
134
154
|
(0, utils_js_1.handleCliError)('No features selected');
|
|
135
155
|
}
|
|
156
|
+
// Validate feature combinations and warn about missing dependencies
|
|
157
|
+
const featureWarnings = validateFeatureCombination(selectedFeatures);
|
|
158
|
+
if (featureWarnings.length > 0) {
|
|
159
|
+
console.warn(chalk_1.default.yellow('\n⚠️ Feature combination warnings:'));
|
|
160
|
+
featureWarnings.forEach((w) => console.warn(chalk_1.default.yellow(` • ${w}`)));
|
|
161
|
+
const answers = await inquirer_1.default.prompt([
|
|
162
|
+
{
|
|
163
|
+
type: 'confirm',
|
|
164
|
+
name: 'confirmed',
|
|
165
|
+
message: 'Continue anyway?',
|
|
166
|
+
default: true,
|
|
167
|
+
},
|
|
168
|
+
]);
|
|
169
|
+
if (!answers.confirmed)
|
|
170
|
+
process.exit(0);
|
|
171
|
+
}
|
|
136
172
|
console.log(chalk_1.default.bold.green('\n✨ Creating project with features:'));
|
|
137
173
|
selectedFeatures.forEach((f) => {
|
|
138
174
|
const feature = AVAILABLE_FEATURES.find((feat) => feat.value === f);
|
|
@@ -156,9 +192,11 @@ async function createCommand(projectName, options) {
|
|
|
156
192
|
console.log(chalk_1.default.white(` cd ${projectName}`));
|
|
157
193
|
console.log(chalk_1.default.white(' npm run dev'));
|
|
158
194
|
console.log(chalk_1.default.gray('\n Server will run on http://localhost:3001\n'));
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
195
|
+
if (selectedFeatures.includes('auth')) {
|
|
196
|
+
console.log(chalk_1.default.yellow('Login with:'));
|
|
197
|
+
console.log(chalk_1.default.white(' Email: admin@example.com'));
|
|
198
|
+
console.log(chalk_1.default.white(' Password: admin123\n'));
|
|
199
|
+
}
|
|
162
200
|
}
|
|
163
201
|
catch (error) {
|
|
164
202
|
console.log(chalk_1.default.red('\n❌ Installation failed'));
|
|
@@ -187,6 +225,25 @@ async function createCommand(projectName, options) {
|
|
|
187
225
|
}
|
|
188
226
|
console.log(chalk_1.default.gray('\n Server will run on http://localhost:3001\n'));
|
|
189
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Validates that the selected feature combination makes sense.
|
|
230
|
+
* Returns an array of human-readable warning strings (empty = OK).
|
|
231
|
+
*/
|
|
232
|
+
function validateFeatureCombination(features) {
|
|
233
|
+
const warnings = [];
|
|
234
|
+
const authRequired = ['rbac', 'admin-dashboard', 'billing', 'mfa', 'gdpr', 'audit-log', 'chat-ui'];
|
|
235
|
+
if (!features.includes('auth')) {
|
|
236
|
+
authRequired.forEach((f) => {
|
|
237
|
+
if (features.includes(f)) {
|
|
238
|
+
warnings.push(`"${f}" requires "auth" — it may not work correctly without it`);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
if (features.includes('audit-log') && !features.includes('admin-dashboard')) {
|
|
243
|
+
warnings.push('"audit-log" works best with "admin-dashboard"');
|
|
244
|
+
}
|
|
245
|
+
return warnings;
|
|
246
|
+
}
|
|
190
247
|
async function createProject(targetDir, projectName, features, sqlite) {
|
|
191
248
|
const spinner = (0, ora_1.default)('Creating project structure...').start();
|
|
192
249
|
try {
|
|
@@ -238,7 +295,7 @@ async function createProject(targetDir, projectName, features, sqlite) {
|
|
|
238
295
|
}
|
|
239
296
|
catch (error) {
|
|
240
297
|
spinner.fail(chalk_1.default.red('Failed to create project'));
|
|
241
|
-
console.error(error.message);
|
|
298
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
242
299
|
throw error;
|
|
243
300
|
}
|
|
244
301
|
}
|
|
@@ -282,7 +339,9 @@ async function createBaseStructure(targetDir, projectName, features) {
|
|
|
282
339
|
: templates.generateAppLayout(projectName);
|
|
283
340
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/layout.tsx'), layoutContent);
|
|
284
341
|
// Create app/page.tsx using template generator
|
|
285
|
-
const pageContent =
|
|
342
|
+
const pageContent = features.includes('auth')
|
|
343
|
+
? templates.generateAppPage()
|
|
344
|
+
: templates.generateAppPageNoAuth();
|
|
286
345
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/page.tsx'), pageContent);
|
|
287
346
|
// Create globals.css using template generator
|
|
288
347
|
const globalsCss = templates.generateGlobalsCss();
|
|
@@ -294,18 +353,19 @@ async function createPackageJson(targetDir, projectName, features) {
|
|
|
294
353
|
react: '^18.3.1',
|
|
295
354
|
'react-dom': '^18.3.1',
|
|
296
355
|
'@prisma/client': '^5.22.0',
|
|
297
|
-
// Auth is core infrastructure — routes, middleware, and API handlers all depend on it
|
|
298
|
-
'next-auth': '^4.24.10',
|
|
299
|
-
'@auth/prisma-adapter': '^2.11.1',
|
|
300
|
-
'bcryptjs': '^2.4.3',
|
|
301
|
-
'next-themes': '^0.4.4',
|
|
302
|
-
'sonner': '^1.7.0',
|
|
303
356
|
};
|
|
357
|
+
// Auth dependencies — only when auth feature is selected
|
|
358
|
+
if (features.includes('auth')) {
|
|
359
|
+
dependencies['next-auth'] = '^4.24.10';
|
|
360
|
+
dependencies['@auth/prisma-adapter'] = '^2.11.1';
|
|
361
|
+
dependencies['bcryptjs'] = '^2.4.3';
|
|
362
|
+
dependencies['next-themes'] = '^0.4.4';
|
|
363
|
+
dependencies['sonner'] = '^1.7.0';
|
|
364
|
+
}
|
|
304
365
|
const devDependencies = {
|
|
305
366
|
'@types/node': '^20',
|
|
306
367
|
'@types/react': '^18',
|
|
307
368
|
'@types/react-dom': '^18',
|
|
308
|
-
'@types/bcryptjs': '^2.4.6',
|
|
309
369
|
typescript: '^5',
|
|
310
370
|
tailwindcss: '^3.4.0',
|
|
311
371
|
postcss: '^8.5.10',
|
|
@@ -313,6 +373,9 @@ async function createPackageJson(targetDir, projectName, features) {
|
|
|
313
373
|
prisma: '^5.22.0',
|
|
314
374
|
tsx: '^4.20.6',
|
|
315
375
|
};
|
|
376
|
+
if (features.includes('auth')) {
|
|
377
|
+
devDependencies['@types/bcryptjs'] = '^2.4.6';
|
|
378
|
+
}
|
|
316
379
|
// Note: ChimerAI workspace packages are not yet published to npm
|
|
317
380
|
// For standalone projects, these features will need manual implementation
|
|
318
381
|
// or you can use the complete starter kit with 'chimerai init'
|
|
@@ -358,10 +421,8 @@ async function createPackageJson(targetDir, projectName, features) {
|
|
|
358
421
|
},
|
|
359
422
|
dependencies,
|
|
360
423
|
devDependencies,
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
uuid: '^11',
|
|
364
|
-
},
|
|
424
|
+
// uuid override only needed when next-auth is installed (suppresses uuid@8 deprecation warning)
|
|
425
|
+
...(features.includes('auth') ? { overrides: { uuid: '^11' } } : {}),
|
|
365
426
|
prisma: {
|
|
366
427
|
seed: 'tsx prisma/seed.ts',
|
|
367
428
|
},
|
|
@@ -857,8 +918,10 @@ async function copyFeatureFiles(targetDir, features) {
|
|
|
857
918
|
}
|
|
858
919
|
// Health check endpoint (used by Docker healthcheck and monitoring)
|
|
859
920
|
const healthRoute = templates.generateHealthRoute();
|
|
860
|
-
// Next.js middleware
|
|
861
|
-
const middleware =
|
|
921
|
+
// Next.js middleware — auth-aware version when auth selected, CORS-only otherwise
|
|
922
|
+
const middleware = features.includes('auth')
|
|
923
|
+
? templates.generateMiddleware()
|
|
924
|
+
: templates.generateMiddlewareNoAuth();
|
|
862
925
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'middleware.ts'), middleware);
|
|
863
926
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/health'));
|
|
864
927
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/health/route.ts'), healthRoute);
|
|
@@ -1214,8 +1277,20 @@ async function getServerSessionWithPermissions() {
|
|
|
1214
1277
|
}
|
|
1215
1278
|
}
|
|
1216
1279
|
async function createSeedScript(targetDir, features, sqlite) {
|
|
1280
|
+
// Without auth there are no users/providers to seed — write a minimal placeholder
|
|
1281
|
+
if (!features.includes('auth')) {
|
|
1282
|
+
const minimalSeed = `import { PrismaClient } from '@prisma/client';
|
|
1283
|
+
const prisma = new PrismaClient();
|
|
1284
|
+
async function main() {
|
|
1285
|
+
console.log('🌱 No auth feature selected — nothing to seed yet.');
|
|
1286
|
+
console.log(' Run: chimerai add auth to add authentication.');
|
|
1287
|
+
}
|
|
1288
|
+
main().catch(console.error).finally(() => prisma.$disconnect());
|
|
1289
|
+
`;
|
|
1290
|
+
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'prisma/seed.ts'), minimalSeed);
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1217
1293
|
// Generate seed script with feature-specific configuration
|
|
1218
|
-
// next-auth / bcryptjs are always installed (core infrastructure)
|
|
1219
1294
|
const seedScript = `import { PrismaClient } from '@prisma/client';
|
|
1220
1295
|
import * as bcrypt from 'bcryptjs';
|
|
1221
1296
|
import crypto from 'crypto';
|
|
@@ -1472,10 +1547,7 @@ echo Next steps:
|
|
|
1472
1547
|
echo npm run dev
|
|
1473
1548
|
echo Open: http://localhost:3001
|
|
1474
1549
|
echo.
|
|
1475
|
-
echo Login with:
|
|
1476
|
-
echo Email: admin@example.com
|
|
1477
|
-
echo Password: admin123
|
|
1478
|
-
echo.
|
|
1550
|
+
${features.includes('auth') ? 'echo Login with:\necho Email: admin@example.com\necho Password: admin123\necho.' : ''}
|
|
1479
1551
|
pause
|
|
1480
1552
|
`
|
|
1481
1553
|
: `@echo off
|
|
@@ -1544,10 +1616,7 @@ echo Next steps:
|
|
|
1544
1616
|
echo npm run dev
|
|
1545
1617
|
echo Open: http://localhost:3001
|
|
1546
1618
|
echo.
|
|
1547
|
-
echo Login with:
|
|
1548
|
-
echo Email: admin@example.com
|
|
1549
|
-
echo Password: admin123
|
|
1550
|
-
echo.
|
|
1619
|
+
${features.includes('auth') ? 'echo Login with:\necho Email: admin@example.com\necho Password: admin123\necho.' : ''}
|
|
1551
1620
|
pause
|
|
1552
1621
|
`;
|
|
1553
1622
|
// Linux/macOS install.sh
|
|
@@ -1585,10 +1654,7 @@ echo "Next steps:"
|
|
|
1585
1654
|
echo " npm run dev"
|
|
1586
1655
|
echo " Open: http://localhost:3001"
|
|
1587
1656
|
echo ""
|
|
1588
|
-
echo "Login with:"
|
|
1589
|
-
echo " Email: admin@example.com"
|
|
1590
|
-
echo " Password: admin123"
|
|
1591
|
-
echo ""
|
|
1657
|
+
${features.includes('auth') ? 'echo "Login with:"\necho " Email: admin@example.com"\necho " Password: admin123"\necho ""' : ''}
|
|
1592
1658
|
`
|
|
1593
1659
|
: `#!/bin/bash
|
|
1594
1660
|
set -e
|
|
@@ -1635,10 +1701,7 @@ echo "Next steps:"
|
|
|
1635
1701
|
echo " npm run dev"
|
|
1636
1702
|
echo " Open: http://localhost:3001"
|
|
1637
1703
|
echo ""
|
|
1638
|
-
echo "Login with:"
|
|
1639
|
-
echo " Email: admin@example.com"
|
|
1640
|
-
echo " Password: admin123"
|
|
1641
|
-
echo ""
|
|
1704
|
+
${features.includes('auth') ? 'echo "Login with:"\necho " Email: admin@example.com"\necho " Password: admin123"\necho ""' : ''}
|
|
1642
1705
|
`;
|
|
1643
1706
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'install.bat'), installBat);
|
|
1644
1707
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'install.sh'), installSh);
|
|
@@ -1723,12 +1786,7 @@ npm run dev
|
|
|
1723
1786
|
|
|
1724
1787
|
Open [http://localhost:3001](http://localhost:3001) in your browser.
|
|
1725
1788
|
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
- Email: admin@example.com
|
|
1729
|
-
- Password: admin123
|
|
1730
|
-
|
|
1731
|
-
⚠️ Change these in production!
|
|
1789
|
+
${features.includes('auth') ? `### Default Admin Credentials\n\n- Email: admin@example.com\n- Password: admin123\n\n⚠️ Change these in production!` : ''}
|
|
1732
1790
|
|
|
1733
1791
|
## Available Scripts
|
|
1734
1792
|
|
|
@@ -1790,8 +1848,7 @@ Commercial License - See LICENSE file
|
|
|
1790
1848
|
5. \`pnpm dev\`
|
|
1791
1849
|
|
|
1792
1850
|
## Default Login
|
|
1793
|
-
- Email: admin@example.com
|
|
1794
|
-
- Password: admin123
|
|
1851
|
+
${features.includes('auth') ? '- Email: admin@example.com\n- Password: admin123' : '- No auth configured. Run: `chimerai add auth`'}
|
|
1795
1852
|
|
|
1796
1853
|
## CLI Commands
|
|
1797
1854
|
- \`chimerai add <component>\` — Add features
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* written to a file in the generated project.
|
|
7
7
|
*/
|
|
8
8
|
export { generateNextConfig, generateTsConfig, generateTailwindConfig, generatePostcssConfig, generateGlobalsCss, } from './config.js';
|
|
9
|
-
export { generateAppLayout, generateAppLayoutWithAuth, generateAppPage, generateAuthBasicLayout, generateDashboardLayout, generateDashboardPage, generateProfilePage, generateUserProfileRoute, generateSettingsPage, generateUseAppNameHook, } from './layout.js';
|
|
9
|
+
export { generateAppLayout, generateAppLayoutWithAuth, generateAppPage, generateAppPageNoAuth, generateAuthBasicLayout, generateDashboardLayout, generateDashboardPage, generateProfilePage, generateUserProfileRoute, generateSettingsPage, generateUseAppNameHook, } from './layout.js';
|
|
10
10
|
export { generateNextAuthRoute, generateLoginPage, generateSessionProvider, generateLogoutButton, generateNextAuthTypes, generateAuthLib, generateResolveAuth, } from './auth.js';
|
|
11
11
|
export { generateChatPage, generateUseChatHook, generateChatMessage, generateChatInput, generateChatSidebar, generateModelSelector, generateChatStreamRouteWithPersistence, generateConversationsRoute, generateConversationDetailRoute, } from './chat.js';
|
|
12
12
|
export { generateAdminLayout, generateAdminDashboardPage, generateAdminUsersPage, generateAdminRolesPage, generateAdminSettingsPage, generateAdminLogsPage, generateAuditLogHelper, generatePermissionsLib, generateRequirePermissionLib, } from './admin.js';
|
|
@@ -14,7 +14,7 @@ export { generateModelProvidersPage, generatePromptManagementPage, generatePromp
|
|
|
14
14
|
export { generateAdminUsersRoute, generateAdminUsersIdRoute, generateAdminRolesRoute, generateAdminRolesIdRoute, generatePromptsRoute, generatePromptsIdRoute, generatePromptsSetDefaultRoute, generateHealthRoute, generateModelsRoute, generateV1ModelsRoute, generateAuditLogRoute, generateGdprDataExportRoute, generateGdprAccountDeleteRoute, generateAdminSettingsRoute, generateAppSettingsRoute, } from './api-routes.js';
|
|
15
15
|
export { generateProviderCrudRoute, generateProviderIdRoute, generateProviderTestRoute, generateProviderSyncRoute, generateInternalProvidersRoute, generateInternalProviderIdRoute, generateInternalProviderUsageRoute, generateNotifyProviderChangeLib, } from './provider-routes.js';
|
|
16
16
|
export { generatePrismaLib, generateEncryptionLib, generateApiKeyAuthLib, generateApiProtectionLib, generatePrismaSchema, } from './prisma.js';
|
|
17
|
-
export { generateMiddleware } from './middleware.js';
|
|
17
|
+
export { generateMiddleware, generateMiddlewareNoAuth } from './middleware.js';
|
|
18
18
|
export { generateStripeLib, generateBillingPage, generateCheckoutRoute, generatePortalRoute, generateSubscriptionRoute, generateStripeWebhookRoute, } from './billing.js';
|
|
19
19
|
export { generateRagLib, generateRagPage, generateRagUploadRoute, generateRagQueryRoute, generateRagStatsRoute, generateRagClearRoute, generateRagDeleteRoute, } from './rag.js';
|
|
20
20
|
export { generateWidgetBundle, generateWidgetLoader, generateApiKeyManagementPage, generateApiKeysRoute, generateApiKeyIdRoute, generateRateLimiter, } from './widget.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,sCAAsC,EACtC,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGnH,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,GAEzB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"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"}
|
package/dist/templates/index.js
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* written to a file in the generated project.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
11
|
-
exports.
|
|
12
|
-
exports.FEATURE_TEMPLATES = exports.ALL_TEMPLATES = exports.TOOL_GENERATORS = exports.generateToolsInit = exports.generateWebhookTools = exports.generateDeeplTools = exports.generateAirtableTools = exports.generateGoogleSheetsTools = exports.generateVisionTools = exports.generateNlpTools = exports.generateCodeTools = exports.generateDocumentTools = exports.generateWebTools = exports.generateRoutesInit = exports.generateToolsRoutes = exports.generateGuardrailsRoutes = exports.generateRagRoutes = exports.generateChatRoutes = exports.generateFileExtractor = exports.generateDockerComposeAiService = exports.generateAiServiceReadme = exports.generateAiServiceDockerfile = exports.generateAiServiceRequirements = exports.generateAiServiceModels = exports.generateAiServiceConfig = exports.generateAiServiceMain = exports.generateGuardrailsService = exports.generateVectorStore = exports.generateRagService = exports.generateEmbeddingService = exports.generateModerationService = exports.generateModelService = exports.generateChatService = exports.generateServicesInit = exports.generateProviderClient = exports.TOOL_INFO = exports.writeAiManifest = exports.readAiManifest = exports.generateDockerComposeDev = exports.generateDockerComposeProd = exports.generateDockerignore = exports.generateDockerfile = exports.GDPR_SCHEMA_EXTENSION = exports.generateGdprConsentRoute = void 0;
|
|
10
|
+
exports.generatePromptsIdRoute = exports.generatePromptsRoute = exports.generateAdminRolesIdRoute = exports.generateAdminRolesRoute = exports.generateAdminUsersIdRoute = exports.generateAdminUsersRoute = exports.generatePromptSelector = exports.generatePromptManagementPage = exports.generateModelProvidersPage = exports.generateRequirePermissionLib = exports.generatePermissionsLib = exports.generateAuditLogHelper = exports.generateAdminLogsPage = exports.generateAdminSettingsPage = exports.generateAdminRolesPage = exports.generateAdminUsersPage = exports.generateAdminDashboardPage = exports.generateAdminLayout = exports.generateConversationDetailRoute = exports.generateConversationsRoute = exports.generateChatStreamRouteWithPersistence = exports.generateModelSelector = exports.generateChatSidebar = exports.generateChatInput = exports.generateChatMessage = exports.generateUseChatHook = exports.generateChatPage = exports.generateResolveAuth = exports.generateAuthLib = exports.generateNextAuthTypes = exports.generateLogoutButton = exports.generateSessionProvider = exports.generateLoginPage = exports.generateNextAuthRoute = exports.generateUseAppNameHook = exports.generateSettingsPage = exports.generateUserProfileRoute = exports.generateProfilePage = exports.generateDashboardPage = exports.generateDashboardLayout = exports.generateAuthBasicLayout = exports.generateAppPageNoAuth = exports.generateAppPage = exports.generateAppLayoutWithAuth = exports.generateAppLayout = exports.generateGlobalsCss = exports.generatePostcssConfig = exports.generateTailwindConfig = exports.generateTsConfig = exports.generateNextConfig = void 0;
|
|
11
|
+
exports.MFA_USER_FIELDS = exports.MFA_SCHEMA_EXTENSION = exports.generateMfaPage = exports.generateMfaDisableRoute = exports.generateMfaVerifyRoute = exports.generateMfaSetupRoute = exports.generateMfaLib = exports.generateRateLimiter = exports.generateApiKeyIdRoute = exports.generateApiKeysRoute = exports.generateApiKeyManagementPage = exports.generateWidgetLoader = exports.generateWidgetBundle = exports.generateRagDeleteRoute = exports.generateRagClearRoute = exports.generateRagStatsRoute = exports.generateRagQueryRoute = exports.generateRagUploadRoute = exports.generateRagPage = exports.generateRagLib = exports.generateStripeWebhookRoute = exports.generateSubscriptionRoute = exports.generatePortalRoute = exports.generateCheckoutRoute = exports.generateBillingPage = exports.generateStripeLib = exports.generateMiddlewareNoAuth = exports.generateMiddleware = exports.generatePrismaSchema = exports.generateApiProtectionLib = exports.generateApiKeyAuthLib = exports.generateEncryptionLib = exports.generatePrismaLib = exports.generateNotifyProviderChangeLib = exports.generateInternalProviderUsageRoute = exports.generateInternalProviderIdRoute = exports.generateInternalProvidersRoute = exports.generateProviderSyncRoute = exports.generateProviderTestRoute = exports.generateProviderIdRoute = exports.generateProviderCrudRoute = exports.generateAppSettingsRoute = exports.generateAdminSettingsRoute = exports.generateGdprAccountDeleteRoute = exports.generateGdprDataExportRoute = exports.generateAuditLogRoute = exports.generateV1ModelsRoute = exports.generateModelsRoute = exports.generateHealthRoute = exports.generatePromptsSetDefaultRoute = void 0;
|
|
12
|
+
exports.FEATURE_TEMPLATES = exports.ALL_TEMPLATES = exports.TOOL_GENERATORS = exports.generateToolsInit = exports.generateWebhookTools = exports.generateDeeplTools = exports.generateAirtableTools = exports.generateGoogleSheetsTools = exports.generateVisionTools = exports.generateNlpTools = exports.generateCodeTools = exports.generateDocumentTools = exports.generateWebTools = exports.generateRoutesInit = exports.generateToolsRoutes = exports.generateGuardrailsRoutes = exports.generateRagRoutes = exports.generateChatRoutes = exports.generateFileExtractor = exports.generateDockerComposeAiService = exports.generateAiServiceReadme = exports.generateAiServiceDockerfile = exports.generateAiServiceRequirements = exports.generateAiServiceModels = exports.generateAiServiceConfig = exports.generateAiServiceMain = exports.generateGuardrailsService = exports.generateVectorStore = exports.generateRagService = exports.generateEmbeddingService = exports.generateModerationService = exports.generateModelService = exports.generateChatService = exports.generateServicesInit = exports.generateProviderClient = exports.TOOL_INFO = exports.writeAiManifest = exports.readAiManifest = exports.generateDockerComposeDev = exports.generateDockerComposeProd = exports.generateDockerignore = exports.generateDockerfile = exports.GDPR_SCHEMA_EXTENSION = exports.generateGdprConsentRoute = exports.generateGdprPage = exports.generateGdprLib = void 0;
|
|
13
13
|
// Config templates
|
|
14
14
|
var config_js_1 = require("./config.js");
|
|
15
15
|
Object.defineProperty(exports, "generateNextConfig", { enumerable: true, get: function () { return config_js_1.generateNextConfig; } });
|
|
@@ -22,6 +22,7 @@ var layout_js_1 = require("./layout.js");
|
|
|
22
22
|
Object.defineProperty(exports, "generateAppLayout", { enumerable: true, get: function () { return layout_js_1.generateAppLayout; } });
|
|
23
23
|
Object.defineProperty(exports, "generateAppLayoutWithAuth", { enumerable: true, get: function () { return layout_js_1.generateAppLayoutWithAuth; } });
|
|
24
24
|
Object.defineProperty(exports, "generateAppPage", { enumerable: true, get: function () { return layout_js_1.generateAppPage; } });
|
|
25
|
+
Object.defineProperty(exports, "generateAppPageNoAuth", { enumerable: true, get: function () { return layout_js_1.generateAppPageNoAuth; } });
|
|
25
26
|
Object.defineProperty(exports, "generateAuthBasicLayout", { enumerable: true, get: function () { return layout_js_1.generateAuthBasicLayout; } });
|
|
26
27
|
Object.defineProperty(exports, "generateDashboardLayout", { enumerable: true, get: function () { return layout_js_1.generateDashboardLayout; } });
|
|
27
28
|
Object.defineProperty(exports, "generateDashboardPage", { enumerable: true, get: function () { return layout_js_1.generateDashboardPage; } });
|
|
@@ -102,6 +103,7 @@ Object.defineProperty(exports, "generatePrismaSchema", { enumerable: true, get:
|
|
|
102
103
|
// Middleware template
|
|
103
104
|
var middleware_js_1 = require("./middleware.js");
|
|
104
105
|
Object.defineProperty(exports, "generateMiddleware", { enumerable: true, get: function () { return middleware_js_1.generateMiddleware; } });
|
|
106
|
+
Object.defineProperty(exports, "generateMiddlewareNoAuth", { enumerable: true, get: function () { return middleware_js_1.generateMiddlewareNoAuth; } });
|
|
105
107
|
// Billing templates
|
|
106
108
|
var billing_js_1 = require("./billing.js");
|
|
107
109
|
Object.defineProperty(exports, "generateStripeLib", { enumerable: true, get: function () { return billing_js_1.generateStripeLib; } });
|
|
@@ -16,6 +16,12 @@ export declare function generateAppLayout(projectName?: string): string;
|
|
|
16
16
|
* @returns TypeScript/JSX content for app/layout.tsx with SessionProvider
|
|
17
17
|
*/
|
|
18
18
|
export declare function generateAppLayoutWithAuth(projectName?: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generates a simple landing page for projects WITHOUT auth.
|
|
21
|
+
* No useSession, no redirect — just renders immediately.
|
|
22
|
+
* @returns TypeScript/JSX content for app/page.tsx
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateAppPageNoAuth(): string;
|
|
19
25
|
/**
|
|
20
26
|
* Generates the home page component that handles session-based routing
|
|
21
27
|
* Redirects unauthenticated users to /login, authenticated users to /dashboard
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/templates/layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAyB9E;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAmCtF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAiCxC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CA2BhD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAuGhD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,CAgErE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkG5C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA6BjD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAyJ7C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAkC/C"}
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/templates/layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAyB9E;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAmCtF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAkB9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAiCxC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CA2BhD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAuGhD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,CAgErE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkG5C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA6BjD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAyJ7C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAkC/C"}
|
package/dist/templates/layout.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.generateAppLayout = generateAppLayout;
|
|
8
8
|
exports.generateAppLayoutWithAuth = generateAppLayoutWithAuth;
|
|
9
|
+
exports.generateAppPageNoAuth = generateAppPageNoAuth;
|
|
9
10
|
exports.generateAppPage = generateAppPage;
|
|
10
11
|
exports.generateAuthBasicLayout = generateAuthBasicLayout;
|
|
11
12
|
exports.generateDashboardLayout = generateDashboardLayout;
|
|
@@ -88,6 +89,30 @@ export default function RootLayout({
|
|
|
88
89
|
}
|
|
89
90
|
`;
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Generates a simple landing page for projects WITHOUT auth.
|
|
94
|
+
* No useSession, no redirect — just renders immediately.
|
|
95
|
+
* @returns TypeScript/JSX content for app/page.tsx
|
|
96
|
+
*/
|
|
97
|
+
function generateAppPageNoAuth() {
|
|
98
|
+
return `// @chimerai component=AppPageNoAuth version=1.0
|
|
99
|
+
export default function Home() {
|
|
100
|
+
return (
|
|
101
|
+
<main className="flex min-h-screen flex-col items-center justify-center p-24">
|
|
102
|
+
<div className="text-center">
|
|
103
|
+
<h1 className="text-4xl font-bold mb-4">Welcome</h1>
|
|
104
|
+
<p className="text-muted-foreground">
|
|
105
|
+
Your ChimerAI application is running.
|
|
106
|
+
</p>
|
|
107
|
+
<p className="text-sm text-muted-foreground mt-2">
|
|
108
|
+
To add authentication, run: <code>chimerai add auth</code>
|
|
109
|
+
</p>
|
|
110
|
+
</div>
|
|
111
|
+
</main>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
91
116
|
/**
|
|
92
117
|
* Generates the home page component that handles session-based routing
|
|
93
118
|
* Redirects unauthenticated users to /login, authenticated users to /dashboard
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* Next.js middleware template with security headers and CORS for widget endpoints.
|
|
3
3
|
* Generates middleware.ts for the root of the Next.js project.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generates a minimal Next.js middleware WITHOUT auth enforcement.
|
|
7
|
+
* Used when auth feature is not selected — only CORS + security headers.
|
|
8
|
+
* No getToken / next-auth/jwt import.
|
|
9
|
+
* @returns TypeScript content for middleware.ts
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateMiddlewareNoAuth(): string;
|
|
5
12
|
/**
|
|
6
13
|
* Generates the Next.js middleware with security headers and CORS.
|
|
7
14
|
* Widget endpoints (/api/v1/*) get CORS headers from CORS_ALLOWED_ORIGINS env.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/templates/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAsG3C"}
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/templates/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAuDjD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAsG3C"}
|
|
@@ -4,7 +4,70 @@
|
|
|
4
4
|
* Generates middleware.ts for the root of the Next.js project.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateMiddlewareNoAuth = generateMiddlewareNoAuth;
|
|
7
8
|
exports.generateMiddleware = generateMiddleware;
|
|
9
|
+
/**
|
|
10
|
+
* Generates a minimal Next.js middleware WITHOUT auth enforcement.
|
|
11
|
+
* Used when auth feature is not selected — only CORS + security headers.
|
|
12
|
+
* No getToken / next-auth/jwt import.
|
|
13
|
+
* @returns TypeScript content for middleware.ts
|
|
14
|
+
*/
|
|
15
|
+
function generateMiddlewareNoAuth() {
|
|
16
|
+
return `// @chimerai component=MiddlewareNoAuth version=1.0
|
|
17
|
+
import { NextResponse } from 'next/server';
|
|
18
|
+
import type { NextRequest } from 'next/server';
|
|
19
|
+
|
|
20
|
+
/** Merge CORS_ALLOWED_ORIGINS + WIDGET_ALLOWED_ORIGINS (legacy alias) */
|
|
21
|
+
function getAllowedOrigins(): string[] {
|
|
22
|
+
const raw = [
|
|
23
|
+
process.env.CORS_ALLOWED_ORIGINS || '',
|
|
24
|
+
process.env.WIDGET_ALLOWED_ORIGINS || '',
|
|
25
|
+
].filter(Boolean).join(',');
|
|
26
|
+
if (!raw) return ['*'];
|
|
27
|
+
return raw.split(',').map(o => o.trim()).filter(Boolean);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function middleware(request: NextRequest) {
|
|
31
|
+
const { pathname } = request.nextUrl;
|
|
32
|
+
|
|
33
|
+
// --- CORS for Widget/Public API Endpoints (/api/v1/*) ---
|
|
34
|
+
if (pathname.startsWith('/api/v1/')) {
|
|
35
|
+
const allowedOrigins = getAllowedOrigins();
|
|
36
|
+
const origin = request.headers.get('origin') || '';
|
|
37
|
+
|
|
38
|
+
if (request.method === 'OPTIONS') {
|
|
39
|
+
const res = new NextResponse(null, { status: 204 });
|
|
40
|
+
const allowOrigin = allowedOrigins.includes('*') ? '*' : (allowedOrigins.includes(origin) ? origin : '');
|
|
41
|
+
if (allowOrigin) res.headers.set('Access-Control-Allow-Origin', allowOrigin);
|
|
42
|
+
res.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
43
|
+
res.headers.set('Access-Control-Allow-Headers', 'Content-Type, x-api-key, Authorization');
|
|
44
|
+
res.headers.set('Access-Control-Max-Age', '86400');
|
|
45
|
+
return res;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const response = NextResponse.next();
|
|
49
|
+
const allowOrigin = allowedOrigins.includes('*') ? '*' : (allowedOrigins.includes(origin) ? origin : '');
|
|
50
|
+
if (allowOrigin) response.headers.set('Access-Control-Allow-Origin', allowOrigin);
|
|
51
|
+
return response;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// --- Standard security headers for all routes ---
|
|
55
|
+
const response = NextResponse.next();
|
|
56
|
+
response.headers.set('X-Frame-Options', 'DENY');
|
|
57
|
+
response.headers.set('X-Content-Type-Options', 'nosniff');
|
|
58
|
+
response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
59
|
+
response.headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
|
|
60
|
+
if (process.env.NODE_ENV === 'production') {
|
|
61
|
+
response.headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
|
|
62
|
+
}
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const config = {
|
|
67
|
+
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
|
|
68
|
+
};
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
8
71
|
/**
|
|
9
72
|
* Generates the Next.js middleware with security headers and CORS.
|
|
10
73
|
* Widget endpoints (/api/v1/*) get CORS headers from CORS_ALLOWED_ORIGINS env.
|
package/package.json
CHANGED