@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.
@@ -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;AAmzED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBAyHtE"}
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"}
@@ -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;AA+CD,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,iBAuH9E"}
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"}
@@ -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
- { name: '👥 RBAC System (Users, Roles, Permissions)', value: 'rbac', licenseKey: 'rbac', checked: true },
58
- { name: '🔌 Model Providers Management', value: 'model-providers', licenseKey: 'model-providers', checked: true },
59
- { name: '📝 Prompt Template Management', value: 'prompt-management', licenseKey: 'prompt-management', checked: true },
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
- { name: '🎨 Admin Dashboard', value: 'admin-dashboard', licenseKey: 'admin-dashboard', checked: true },
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
- console.log(chalk_1.default.yellow('Login with:'));
160
- console.log(chalk_1.default.white(' Email: admin@example.com'));
161
- console.log(chalk_1.default.white(' Password: admin123\n'));
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 = templates.generateAppPage();
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
- overrides: {
362
- // Force uuid@11 to suppress uuid@8 deprecation warning from next-auth@4
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 (security headers + CORS for widget endpoints)
861
- const middleware = templates.generateMiddleware();
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
- ### Default Admin Credentials
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;AAGrD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;CA8DzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2E7B,CAAC"}
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,qBAAqB,EACrB,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,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;CA8DzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2E7B,CAAC"}
@@ -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.generatePromptsSetDefaultRoute = 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.generateAppPage = exports.generateAppLayoutWithAuth = exports.generateAppLayout = exports.generateGlobalsCss = exports.generatePostcssConfig = exports.generateTailwindConfig = exports.generateTsConfig = exports.generateNextConfig = void 0;
11
- exports.generateGdprPage = exports.generateGdprLib = 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.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 = 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 = 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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chimerai/cli",
3
- "version": "0.2.88",
3
+ "version": "0.2.89",
4
4
  "description": "CLI wizard for ChimerAI starter kit — scaffold auth, RBAC, AI chat, billing and more into any Next.js project",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {