@chimerai/cli 0.2.86 → 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 +99 -44
- 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);
|
|
@@ -189,6 +225,25 @@ async function createCommand(projectName, options) {
|
|
|
189
225
|
}
|
|
190
226
|
console.log(chalk_1.default.gray('\n Server will run on http://localhost:3001\n'));
|
|
191
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
|
+
}
|
|
192
247
|
async function createProject(targetDir, projectName, features, sqlite) {
|
|
193
248
|
const spinner = (0, ora_1.default)('Creating project structure...').start();
|
|
194
249
|
try {
|
|
@@ -240,7 +295,7 @@ async function createProject(targetDir, projectName, features, sqlite) {
|
|
|
240
295
|
}
|
|
241
296
|
catch (error) {
|
|
242
297
|
spinner.fail(chalk_1.default.red('Failed to create project'));
|
|
243
|
-
console.error(error.message);
|
|
298
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
244
299
|
throw error;
|
|
245
300
|
}
|
|
246
301
|
}
|
|
@@ -284,7 +339,9 @@ async function createBaseStructure(targetDir, projectName, features) {
|
|
|
284
339
|
: templates.generateAppLayout(projectName);
|
|
285
340
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/layout.tsx'), layoutContent);
|
|
286
341
|
// Create app/page.tsx using template generator
|
|
287
|
-
const pageContent =
|
|
342
|
+
const pageContent = features.includes('auth')
|
|
343
|
+
? templates.generateAppPage()
|
|
344
|
+
: templates.generateAppPageNoAuth();
|
|
288
345
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/page.tsx'), pageContent);
|
|
289
346
|
// Create globals.css using template generator
|
|
290
347
|
const globalsCss = templates.generateGlobalsCss();
|
|
@@ -296,18 +353,19 @@ async function createPackageJson(targetDir, projectName, features) {
|
|
|
296
353
|
react: '^18.3.1',
|
|
297
354
|
'react-dom': '^18.3.1',
|
|
298
355
|
'@prisma/client': '^5.22.0',
|
|
299
|
-
// Auth is core infrastructure — routes, middleware, and API handlers all depend on it
|
|
300
|
-
'next-auth': '^4.24.10',
|
|
301
|
-
'@auth/prisma-adapter': '^2.11.1',
|
|
302
|
-
'bcryptjs': '^2.4.3',
|
|
303
|
-
'next-themes': '^0.4.4',
|
|
304
|
-
'sonner': '^1.7.0',
|
|
305
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
|
+
}
|
|
306
365
|
const devDependencies = {
|
|
307
366
|
'@types/node': '^20',
|
|
308
367
|
'@types/react': '^18',
|
|
309
368
|
'@types/react-dom': '^18',
|
|
310
|
-
'@types/bcryptjs': '^2.4.6',
|
|
311
369
|
typescript: '^5',
|
|
312
370
|
tailwindcss: '^3.4.0',
|
|
313
371
|
postcss: '^8.5.10',
|
|
@@ -315,6 +373,9 @@ async function createPackageJson(targetDir, projectName, features) {
|
|
|
315
373
|
prisma: '^5.22.0',
|
|
316
374
|
tsx: '^4.20.6',
|
|
317
375
|
};
|
|
376
|
+
if (features.includes('auth')) {
|
|
377
|
+
devDependencies['@types/bcryptjs'] = '^2.4.6';
|
|
378
|
+
}
|
|
318
379
|
// Note: ChimerAI workspace packages are not yet published to npm
|
|
319
380
|
// For standalone projects, these features will need manual implementation
|
|
320
381
|
// or you can use the complete starter kit with 'chimerai init'
|
|
@@ -360,10 +421,8 @@ async function createPackageJson(targetDir, projectName, features) {
|
|
|
360
421
|
},
|
|
361
422
|
dependencies,
|
|
362
423
|
devDependencies,
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
uuid: '^11',
|
|
366
|
-
},
|
|
424
|
+
// uuid override only needed when next-auth is installed (suppresses uuid@8 deprecation warning)
|
|
425
|
+
...(features.includes('auth') ? { overrides: { uuid: '^11' } } : {}),
|
|
367
426
|
prisma: {
|
|
368
427
|
seed: 'tsx prisma/seed.ts',
|
|
369
428
|
},
|
|
@@ -859,8 +918,10 @@ async function copyFeatureFiles(targetDir, features) {
|
|
|
859
918
|
}
|
|
860
919
|
// Health check endpoint (used by Docker healthcheck and monitoring)
|
|
861
920
|
const healthRoute = templates.generateHealthRoute();
|
|
862
|
-
// Next.js middleware
|
|
863
|
-
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();
|
|
864
925
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'middleware.ts'), middleware);
|
|
865
926
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/health'));
|
|
866
927
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/health/route.ts'), healthRoute);
|
|
@@ -1216,8 +1277,20 @@ async function getServerSessionWithPermissions() {
|
|
|
1216
1277
|
}
|
|
1217
1278
|
}
|
|
1218
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
|
+
}
|
|
1219
1293
|
// Generate seed script with feature-specific configuration
|
|
1220
|
-
// next-auth / bcryptjs are always installed (core infrastructure)
|
|
1221
1294
|
const seedScript = `import { PrismaClient } from '@prisma/client';
|
|
1222
1295
|
import * as bcrypt from 'bcryptjs';
|
|
1223
1296
|
import crypto from 'crypto';
|
|
@@ -1425,7 +1498,6 @@ async function createDockerCompose(targetDir) {
|
|
|
1425
1498
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'docker-compose.yml'), (0, index_js_1.generateDockerComposeDev)());
|
|
1426
1499
|
}
|
|
1427
1500
|
async function createInstallScripts(targetDir, features, sqlite) {
|
|
1428
|
-
// Windows install.bat
|
|
1429
1501
|
// Windows install.bat
|
|
1430
1502
|
const installBat = sqlite
|
|
1431
1503
|
? `@echo off
|
|
@@ -1475,10 +1547,7 @@ echo Next steps:
|
|
|
1475
1547
|
echo npm run dev
|
|
1476
1548
|
echo Open: http://localhost:3001
|
|
1477
1549
|
echo.
|
|
1478
|
-
echo Login with:
|
|
1479
|
-
echo Email: admin@example.com
|
|
1480
|
-
echo Password: admin123
|
|
1481
|
-
echo.
|
|
1550
|
+
${features.includes('auth') ? 'echo Login with:\necho Email: admin@example.com\necho Password: admin123\necho.' : ''}
|
|
1482
1551
|
pause
|
|
1483
1552
|
`
|
|
1484
1553
|
: `@echo off
|
|
@@ -1547,10 +1616,7 @@ echo Next steps:
|
|
|
1547
1616
|
echo npm run dev
|
|
1548
1617
|
echo Open: http://localhost:3001
|
|
1549
1618
|
echo.
|
|
1550
|
-
echo Login with:
|
|
1551
|
-
echo Email: admin@example.com
|
|
1552
|
-
echo Password: admin123
|
|
1553
|
-
echo.
|
|
1619
|
+
${features.includes('auth') ? 'echo Login with:\necho Email: admin@example.com\necho Password: admin123\necho.' : ''}
|
|
1554
1620
|
pause
|
|
1555
1621
|
`;
|
|
1556
1622
|
// Linux/macOS install.sh
|
|
@@ -1588,10 +1654,7 @@ echo "Next steps:"
|
|
|
1588
1654
|
echo " npm run dev"
|
|
1589
1655
|
echo " Open: http://localhost:3001"
|
|
1590
1656
|
echo ""
|
|
1591
|
-
echo "Login with:"
|
|
1592
|
-
echo " Email: admin@example.com"
|
|
1593
|
-
echo " Password: admin123"
|
|
1594
|
-
echo ""
|
|
1657
|
+
${features.includes('auth') ? 'echo "Login with:"\necho " Email: admin@example.com"\necho " Password: admin123"\necho ""' : ''}
|
|
1595
1658
|
`
|
|
1596
1659
|
: `#!/bin/bash
|
|
1597
1660
|
set -e
|
|
@@ -1638,10 +1701,7 @@ echo "Next steps:"
|
|
|
1638
1701
|
echo " npm run dev"
|
|
1639
1702
|
echo " Open: http://localhost:3001"
|
|
1640
1703
|
echo ""
|
|
1641
|
-
echo "Login with:"
|
|
1642
|
-
echo " Email: admin@example.com"
|
|
1643
|
-
echo " Password: admin123"
|
|
1644
|
-
echo ""
|
|
1704
|
+
${features.includes('auth') ? 'echo "Login with:"\necho " Email: admin@example.com"\necho " Password: admin123"\necho ""' : ''}
|
|
1645
1705
|
`;
|
|
1646
1706
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'install.bat'), installBat);
|
|
1647
1707
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'install.sh'), installSh);
|
|
@@ -1726,13 +1786,8 @@ npm run dev
|
|
|
1726
1786
|
|
|
1727
1787
|
Open [http://localhost:3001](http://localhost:3001) in your browser.
|
|
1728
1788
|
|
|
1729
|
-
${features.includes('auth') ? `### Default Admin Credentials
|
|
1730
|
-
|
|
1731
|
-
- Email: admin@example.com
|
|
1732
|
-
- Password: admin123
|
|
1789
|
+
${features.includes('auth') ? `### Default Admin Credentials\n\n- Email: admin@example.com\n- Password: admin123\n\n⚠️ Change these in production!` : ''}
|
|
1733
1790
|
|
|
1734
|
-
⚠️ Change these in production!
|
|
1735
|
-
` : ``}
|
|
1736
1791
|
## Available Scripts
|
|
1737
1792
|
|
|
1738
1793
|
- \`pnpm dev\` - Start development server
|
|
@@ -1793,7 +1848,7 @@ Commercial License - See LICENSE file
|
|
|
1793
1848
|
5. \`pnpm dev\`
|
|
1794
1849
|
|
|
1795
1850
|
## Default Login
|
|
1796
|
-
${features.includes('auth') ?
|
|
1851
|
+
${features.includes('auth') ? '- Email: admin@example.com\n- Password: admin123' : '- No auth configured. Run: `chimerai add auth`'}
|
|
1797
1852
|
|
|
1798
1853
|
## CLI Commands
|
|
1799
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":"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"}
|
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