@chimerai/cli 0.2.73
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/LICENSE +21 -0
- package/README.md +293 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +317 -0
- package/dist/commands/add.d.ts +11 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +2126 -0
- package/dist/commands/create.d.ts +12 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +1703 -0
- package/dist/commands/deploy.d.ts +11 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +219 -0
- package/dist/commands/dev.d.ts +17 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +206 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +728 -0
- package/dist/commands/generate.d.ts +19 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +429 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +269 -0
- package/dist/commands/list.d.ts +12 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +328 -0
- package/dist/commands/migrate.d.ts +14 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +197 -0
- package/dist/commands/plugin.d.ts +10 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +239 -0
- package/dist/commands/remove.d.ts +11 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +472 -0
- package/dist/commands/secret.d.ts +12 -0
- package/dist/commands/secret.d.ts.map +1 -0
- package/dist/commands/secret.js +102 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +788 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +211 -0
- package/dist/commands/use.d.ts +9 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +51 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/license.d.ts +55 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +258 -0
- package/dist/scanner.d.ts +31 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +113 -0
- package/dist/schema-manager.d.ts +26 -0
- package/dist/schema-manager.d.ts.map +1 -0
- package/dist/schema-manager.js +132 -0
- package/dist/templates/admin.d.ts +49 -0
- package/dist/templates/admin.d.ts.map +1 -0
- package/dist/templates/admin.js +1358 -0
- package/dist/templates/ai-routes.d.ts +17 -0
- package/dist/templates/ai-routes.d.ts.map +1 -0
- package/dist/templates/ai-routes.js +1130 -0
- package/dist/templates/ai-service-tools.d.ts +22 -0
- package/dist/templates/ai-service-tools.d.ts.map +1 -0
- package/dist/templates/ai-service-tools.js +1424 -0
- package/dist/templates/ai-service.d.ts +66 -0
- package/dist/templates/ai-service.d.ts.map +1 -0
- package/dist/templates/ai-service.js +2202 -0
- package/dist/templates/api-routes.d.ts +108 -0
- package/dist/templates/api-routes.d.ts.map +1 -0
- package/dist/templates/api-routes.js +1219 -0
- package/dist/templates/auth.d.ts +48 -0
- package/dist/templates/auth.d.ts.map +1 -0
- package/dist/templates/auth.js +381 -0
- package/dist/templates/billing.d.ts +44 -0
- package/dist/templates/billing.d.ts.map +1 -0
- package/dist/templates/billing.js +551 -0
- package/dist/templates/chat.d.ts +63 -0
- package/dist/templates/chat.d.ts.map +1 -0
- package/dist/templates/chat.js +1979 -0
- package/dist/templates/components.d.ts +22 -0
- package/dist/templates/components.d.ts.map +1 -0
- package/dist/templates/components.js +672 -0
- package/dist/templates/config.d.ts +6 -0
- package/dist/templates/config.d.ts.map +1 -0
- package/dist/templates/config.js +86 -0
- package/dist/templates/docker.d.ts +25 -0
- package/dist/templates/docker.d.ts.map +1 -0
- package/dist/templates/docker.js +165 -0
- package/dist/templates/gdpr.d.ts +16 -0
- package/dist/templates/gdpr.d.ts.map +1 -0
- package/dist/templates/gdpr.js +259 -0
- package/dist/templates/index.d.ts +77 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +339 -0
- package/dist/templates/layout.d.ts +67 -0
- package/dist/templates/layout.d.ts.map +1 -0
- package/dist/templates/layout.js +670 -0
- package/dist/templates/mfa.d.ts +23 -0
- package/dist/templates/mfa.d.ts.map +1 -0
- package/dist/templates/mfa.js +353 -0
- package/dist/templates/middleware.d.ts +12 -0
- package/dist/templates/middleware.d.ts.map +1 -0
- package/dist/templates/middleware.js +116 -0
- package/dist/templates/prisma.d.ts +35 -0
- package/dist/templates/prisma.d.ts.map +1 -0
- package/dist/templates/prisma.js +724 -0
- package/dist/templates/provider-routes.d.ts +21 -0
- package/dist/templates/provider-routes.d.ts.map +1 -0
- package/dist/templates/provider-routes.js +1203 -0
- package/dist/templates/rag.d.ts +48 -0
- package/dist/templates/rag.d.ts.map +1 -0
- package/dist/templates/rag.js +532 -0
- package/dist/templates/widget.d.ts +64 -0
- package/dist/templates/widget.d.ts.map +1 -0
- package/dist/templates/widget.js +1360 -0
- package/dist/utils/provider-db.d.ts +63 -0
- package/dist/utils/provider-db.d.ts.map +1 -0
- package/dist/utils/provider-db.js +300 -0
- package/dist/utils.d.ts +78 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +330 -0
- package/package.json +60 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateNextConfig = generateNextConfig;
|
|
4
|
+
exports.generateTsConfig = generateTsConfig;
|
|
5
|
+
exports.generateTailwindConfig = generateTailwindConfig;
|
|
6
|
+
exports.generatePostcssConfig = generatePostcssConfig;
|
|
7
|
+
exports.generateGlobalsCss = generateGlobalsCss;
|
|
8
|
+
function generateNextConfig() {
|
|
9
|
+
return `// @chimerai component=NextConfig version=1.0
|
|
10
|
+
/** @type {import('next').NextConfig} */
|
|
11
|
+
const nextConfig = {
|
|
12
|
+
reactStrictMode: true,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
module.exports = nextConfig;
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
function generateTsConfig() {
|
|
19
|
+
return `{
|
|
20
|
+
"compilerOptions": {
|
|
21
|
+
"target": "ES2017",
|
|
22
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
23
|
+
"allowJs": true,
|
|
24
|
+
"skipLibCheck": true,
|
|
25
|
+
"strict": true,
|
|
26
|
+
"noEmit": true,
|
|
27
|
+
"esModuleInterop": true,
|
|
28
|
+
"module": "esnext",
|
|
29
|
+
"moduleResolution": "bundler",
|
|
30
|
+
"resolveJsonModule": true,
|
|
31
|
+
"isolatedModules": true,
|
|
32
|
+
"jsx": "preserve",
|
|
33
|
+
"incremental": true,
|
|
34
|
+
"plugins": [
|
|
35
|
+
{
|
|
36
|
+
"name": "next"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"paths": {
|
|
40
|
+
"@/*": ["./*"]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
44
|
+
"exclude": ["node_modules"]
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
function generateTailwindConfig() {
|
|
49
|
+
return `// @chimerai component=TailwindConfig version=1.0
|
|
50
|
+
/** @type {import('tailwindcss').Config} */
|
|
51
|
+
module.exports = {
|
|
52
|
+
darkMode: 'class',
|
|
53
|
+
content: [
|
|
54
|
+
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
|
|
55
|
+
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
56
|
+
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
57
|
+
],
|
|
58
|
+
theme: {
|
|
59
|
+
extend: {},
|
|
60
|
+
},
|
|
61
|
+
plugins: [],
|
|
62
|
+
};
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
function generatePostcssConfig() {
|
|
66
|
+
return `module.exports = {
|
|
67
|
+
plugins: {
|
|
68
|
+
tailwindcss: {},
|
|
69
|
+
autoprefixer: {},
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
function generateGlobalsCss() {
|
|
75
|
+
return `/* @chimerai component=GlobalsCss version=1.3 */
|
|
76
|
+
@tailwind base;
|
|
77
|
+
@tailwind components;
|
|
78
|
+
@tailwind utilities;
|
|
79
|
+
|
|
80
|
+
@layer base {
|
|
81
|
+
body {
|
|
82
|
+
@apply bg-background text-foreground;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker & Deploy Template Generators
|
|
3
|
+
* Generates Dockerfile, .dockerignore, and docker-compose configurations
|
|
4
|
+
* for both development and production deployments.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Multi-stage Dockerfile for Next.js standalone production build.
|
|
8
|
+
* Stages: base → deps → builder → runner
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateDockerfile(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Standard .dockerignore for Next.js projects.
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateDockerignore(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Production docker-compose with Next.js app + PostgreSQL.
|
|
17
|
+
* Includes healthchecks and proper restart policies.
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateDockerComposeProd(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Development docker-compose with PostgreSQL + Redis.
|
|
22
|
+
* Used by `chimerai create` for local development setup.
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateDockerComposeDev(): string;
|
|
25
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/templates/docker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAsC3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA2ClD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAuCjD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Docker & Deploy Template Generators
|
|
4
|
+
* Generates Dockerfile, .dockerignore, and docker-compose configurations
|
|
5
|
+
* for both development and production deployments.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateDockerfile = generateDockerfile;
|
|
9
|
+
exports.generateDockerignore = generateDockerignore;
|
|
10
|
+
exports.generateDockerComposeProd = generateDockerComposeProd;
|
|
11
|
+
exports.generateDockerComposeDev = generateDockerComposeDev;
|
|
12
|
+
/**
|
|
13
|
+
* Multi-stage Dockerfile for Next.js standalone production build.
|
|
14
|
+
* Stages: base → deps → builder → runner
|
|
15
|
+
*/
|
|
16
|
+
function generateDockerfile() {
|
|
17
|
+
return `# @chimerai component=Dockerfile version=1.0
|
|
18
|
+
# ---- Base ----
|
|
19
|
+
FROM node:20-alpine AS base
|
|
20
|
+
RUN corepack enable && corepack prepare pnpm@latest --activate
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
|
|
23
|
+
# ---- Dependencies ----
|
|
24
|
+
FROM base AS deps
|
|
25
|
+
COPY package.json pnpm-lock.yaml* ./
|
|
26
|
+
COPY prisma ./prisma/
|
|
27
|
+
RUN pnpm install --frozen-lockfile
|
|
28
|
+
RUN npx prisma generate
|
|
29
|
+
|
|
30
|
+
# ---- Build ----
|
|
31
|
+
FROM base AS builder
|
|
32
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
33
|
+
COPY . .
|
|
34
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
35
|
+
RUN pnpm build
|
|
36
|
+
|
|
37
|
+
# ---- Production ----
|
|
38
|
+
FROM base AS runner
|
|
39
|
+
ENV NODE_ENV=production
|
|
40
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
41
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
42
|
+
RUN adduser --system --uid 1001 nextjs
|
|
43
|
+
COPY --from=builder /app/public ./public
|
|
44
|
+
COPY --from=builder /app/.next/standalone ./
|
|
45
|
+
COPY --from=builder /app/.next/static ./.next/static
|
|
46
|
+
COPY --from=builder /app/prisma ./prisma
|
|
47
|
+
COPY --from=deps /app/node_modules/.prisma ./node_modules/.prisma
|
|
48
|
+
USER nextjs
|
|
49
|
+
EXPOSE 3000
|
|
50
|
+
ENV PORT=3000
|
|
51
|
+
ENV HOSTNAME="0.0.0.0"
|
|
52
|
+
CMD ["node", "server.js"]
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Standard .dockerignore for Next.js projects.
|
|
57
|
+
*/
|
|
58
|
+
function generateDockerignore() {
|
|
59
|
+
return `# @chimerai component=Dockerignore version=1.0
|
|
60
|
+
node_modules
|
|
61
|
+
.next
|
|
62
|
+
.git
|
|
63
|
+
.env
|
|
64
|
+
.env.local
|
|
65
|
+
.env*.local
|
|
66
|
+
*.md
|
|
67
|
+
.vscode
|
|
68
|
+
.idea
|
|
69
|
+
coverage
|
|
70
|
+
.turbo
|
|
71
|
+
dist
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Production docker-compose with Next.js app + PostgreSQL.
|
|
76
|
+
* Includes healthchecks and proper restart policies.
|
|
77
|
+
*/
|
|
78
|
+
function generateDockerComposeProd() {
|
|
79
|
+
return `# @chimerai component=DockerComposeProd version=1.0
|
|
80
|
+
services:
|
|
81
|
+
app:
|
|
82
|
+
build: .
|
|
83
|
+
container_name: chimerai-app
|
|
84
|
+
restart: unless-stopped
|
|
85
|
+
ports:
|
|
86
|
+
- '3000:3000'
|
|
87
|
+
environment:
|
|
88
|
+
- DATABASE_URL=\${DATABASE_URL}
|
|
89
|
+
- NEXTAUTH_SECRET=\${NEXTAUTH_SECRET}
|
|
90
|
+
- NEXTAUTH_URL=\${NEXTAUTH_URL}
|
|
91
|
+
depends_on:
|
|
92
|
+
postgres:
|
|
93
|
+
condition: service_healthy
|
|
94
|
+
healthcheck:
|
|
95
|
+
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/api/health"]
|
|
96
|
+
interval: 30s
|
|
97
|
+
timeout: 10s
|
|
98
|
+
retries: 3
|
|
99
|
+
|
|
100
|
+
postgres:
|
|
101
|
+
image: postgres:16-alpine
|
|
102
|
+
container_name: chimerai-postgres
|
|
103
|
+
restart: unless-stopped
|
|
104
|
+
environment:
|
|
105
|
+
POSTGRES_USER: \${POSTGRES_USER:-postgres}
|
|
106
|
+
POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
|
|
107
|
+
POSTGRES_DB: \${POSTGRES_DB:-chimerai_db}
|
|
108
|
+
ports:
|
|
109
|
+
- '5432:5432'
|
|
110
|
+
volumes:
|
|
111
|
+
- postgres_data:/var/lib/postgresql/data
|
|
112
|
+
healthcheck:
|
|
113
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
114
|
+
interval: 10s
|
|
115
|
+
timeout: 5s
|
|
116
|
+
retries: 5
|
|
117
|
+
|
|
118
|
+
volumes:
|
|
119
|
+
postgres_data:
|
|
120
|
+
`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Development docker-compose with PostgreSQL + Redis.
|
|
124
|
+
* Used by `chimerai create` for local development setup.
|
|
125
|
+
*/
|
|
126
|
+
function generateDockerComposeDev() {
|
|
127
|
+
return `# @chimerai component=DockerComposeDev version=1.0
|
|
128
|
+
services:
|
|
129
|
+
postgres:
|
|
130
|
+
image: postgres:16-alpine
|
|
131
|
+
container_name: myapp-postgres
|
|
132
|
+
restart: unless-stopped
|
|
133
|
+
environment:
|
|
134
|
+
POSTGRES_USER: postgres
|
|
135
|
+
POSTGRES_PASSWORD: postgres
|
|
136
|
+
POSTGRES_DB: myapp_db
|
|
137
|
+
ports:
|
|
138
|
+
- '5432:5432'
|
|
139
|
+
volumes:
|
|
140
|
+
- postgres_data:/var/lib/postgresql/data
|
|
141
|
+
healthcheck:
|
|
142
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
143
|
+
interval: 10s
|
|
144
|
+
timeout: 5s
|
|
145
|
+
retries: 5
|
|
146
|
+
|
|
147
|
+
redis:
|
|
148
|
+
image: redis:7-alpine
|
|
149
|
+
container_name: myapp-redis
|
|
150
|
+
restart: unless-stopped
|
|
151
|
+
ports:
|
|
152
|
+
- '6379:6379'
|
|
153
|
+
volumes:
|
|
154
|
+
- redis_data:/data
|
|
155
|
+
healthcheck:
|
|
156
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
157
|
+
interval: 10s
|
|
158
|
+
timeout: 5s
|
|
159
|
+
retries: 5
|
|
160
|
+
|
|
161
|
+
volumes:
|
|
162
|
+
postgres_data:
|
|
163
|
+
redis_data:
|
|
164
|
+
`;
|
|
165
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GDPR Compliance Templates
|
|
3
|
+
* Consent management, data export, account deletion
|
|
4
|
+
*/
|
|
5
|
+
/** lib/gdpr.ts — GDPR helpers */
|
|
6
|
+
export declare function generateGdprLib(): string;
|
|
7
|
+
/** app/gdpr/page.tsx — GDPR self-service portal */
|
|
8
|
+
export declare function generateGdprPage(): string;
|
|
9
|
+
/** app/api/gdpr/consent/route.ts */
|
|
10
|
+
export declare function generateGdprConsentRoute(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Prisma schema extension: ConsentLog model for GDPR consent tracking.
|
|
13
|
+
* SQLite-safe: no @db.Text, no Json, no arrays.
|
|
14
|
+
*/
|
|
15
|
+
export declare const GDPR_SCHEMA_EXTENSION = "\nmodel ConsentLog {\n id String @id @default(cuid())\n userId String\n type String\n granted Boolean\n createdAt DateTime @default(now())\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@index([userId])\n @@index([type])\n}\n";
|
|
16
|
+
//# sourceMappingURL=gdpr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gdpr.d.ts","sourceRoot":"","sources":["../../src/templates/gdpr.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iCAAiC;AACjC,wBAAgB,eAAe,IAAI,MAAM,CAsExC;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,IAAI,MAAM,CAwIzC;AAED,oCAAoC;AACpC,wBAAgB,wBAAwB,IAAI,MAAM,CAoBjD;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6SAYjC,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GDPR Compliance Templates
|
|
4
|
+
* Consent management, data export, account deletion
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.GDPR_SCHEMA_EXTENSION = void 0;
|
|
8
|
+
exports.generateGdprLib = generateGdprLib;
|
|
9
|
+
exports.generateGdprPage = generateGdprPage;
|
|
10
|
+
exports.generateGdprConsentRoute = generateGdprConsentRoute;
|
|
11
|
+
/** lib/gdpr.ts — GDPR helpers */
|
|
12
|
+
function generateGdprLib() {
|
|
13
|
+
return `// @chimerai component=GdprLib version=1.0
|
|
14
|
+
import { prisma } from '@/lib/prisma';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Export all personal data for a user as a JSON object.
|
|
18
|
+
*/
|
|
19
|
+
export async function exportUserData(userId: string): Promise<Record<string, unknown>> {
|
|
20
|
+
const user = await (prisma as any).user.findUnique({
|
|
21
|
+
where: { id: userId },
|
|
22
|
+
include: {
|
|
23
|
+
sessions: true,
|
|
24
|
+
accounts: true,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
if (!user) throw new Error('User not found');
|
|
29
|
+
|
|
30
|
+
// Remove sensitive internal fields
|
|
31
|
+
const { password, mfaSecret, ...safeUser } = user as any;
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
exportedAt: new Date().toISOString(),
|
|
35
|
+
user: safeUser,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Delete all personal data for a user (GDPR right to erasure).
|
|
41
|
+
* Deletes sessions, accounts and the user record itself.
|
|
42
|
+
*/
|
|
43
|
+
export async function deleteUserData(userId: string): Promise<void> {
|
|
44
|
+
await (prisma as any).session.deleteMany({ where: { userId } });
|
|
45
|
+
await (prisma as any).account.deleteMany({ where: { userId } });
|
|
46
|
+
await (prisma as any).user.delete({ where: { id: userId } });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Record a consent decision for a user.
|
|
51
|
+
*/
|
|
52
|
+
export async function recordConsent(
|
|
53
|
+
userId: string,
|
|
54
|
+
type: string,
|
|
55
|
+
granted: boolean
|
|
56
|
+
): Promise<void> {
|
|
57
|
+
await (prisma as any).consentLog.create({
|
|
58
|
+
data: { userId, type, granted },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get the latest consent status for each type for a user.
|
|
64
|
+
*/
|
|
65
|
+
export async function getConsentStatus(
|
|
66
|
+
userId: string
|
|
67
|
+
): Promise<Record<string, boolean>> {
|
|
68
|
+
const logs = await (prisma as any).consentLog.findMany({
|
|
69
|
+
where: { userId },
|
|
70
|
+
orderBy: { createdAt: 'desc' },
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const result: Record<string, boolean> = {};
|
|
74
|
+
for (const log of logs as any[]) {
|
|
75
|
+
if (!(log.type in result)) {
|
|
76
|
+
result[log.type] = log.granted;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
}
|
|
83
|
+
/** app/gdpr/page.tsx — GDPR self-service portal */
|
|
84
|
+
function generateGdprPage() {
|
|
85
|
+
return `// @chimerai component=GdprPage version=1.0
|
|
86
|
+
'use client';
|
|
87
|
+
|
|
88
|
+
import { useState } from 'react';
|
|
89
|
+
|
|
90
|
+
type ConsentState = Record<string, boolean>;
|
|
91
|
+
|
|
92
|
+
export default function GdprPage() {
|
|
93
|
+
const [consent, setConsent] = useState<ConsentState>({
|
|
94
|
+
analytics: false,
|
|
95
|
+
marketing: false,
|
|
96
|
+
});
|
|
97
|
+
const [exportStatus, setExportStatus] = useState<'idle' | 'loading' | 'done'>('idle');
|
|
98
|
+
const [deleteStatus, setDeleteStatus] = useState<'idle' | 'confirm' | 'loading' | 'done'>('idle');
|
|
99
|
+
const [saveStatus, setSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle');
|
|
100
|
+
|
|
101
|
+
async function saveConsent() {
|
|
102
|
+
setSaveStatus('saving');
|
|
103
|
+
await fetch('/api/gdpr/consent', {
|
|
104
|
+
method: 'POST',
|
|
105
|
+
headers: { 'Content-Type': 'application/json' },
|
|
106
|
+
body: JSON.stringify({ consent }),
|
|
107
|
+
});
|
|
108
|
+
setSaveStatus('saved');
|
|
109
|
+
setTimeout(() => setSaveStatus('idle'), 2000);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function exportData() {
|
|
113
|
+
setExportStatus('loading');
|
|
114
|
+
const res = await fetch('/api/gdpr/export');
|
|
115
|
+
const blob = await res.blob();
|
|
116
|
+
const url = URL.createObjectURL(blob);
|
|
117
|
+
const a = document.createElement('a');
|
|
118
|
+
a.href = url;
|
|
119
|
+
a.download = \`my-data-\${new Date().toISOString().slice(0, 10)}.json\`;
|
|
120
|
+
a.click();
|
|
121
|
+
setExportStatus('done');
|
|
122
|
+
setTimeout(() => setExportStatus('idle'), 3000);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function deleteAccount() {
|
|
126
|
+
setDeleteStatus('loading');
|
|
127
|
+
const res = await fetch('/api/gdpr/delete', { method: 'DELETE' });
|
|
128
|
+
if (res.ok) {
|
|
129
|
+
setDeleteStatus('done');
|
|
130
|
+
setTimeout(() => (window.location.href = '/'), 2000);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<div className="max-w-2xl mx-auto py-10 px-4 space-y-10">
|
|
136
|
+
<div>
|
|
137
|
+
<h1 className="text-2xl font-bold mb-1">Privacy & Data</h1>
|
|
138
|
+
<p className="text-gray-500 text-sm">Manage your personal data and consent preferences.</p>
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
{/* Consent */}
|
|
142
|
+
<section className="border rounded-xl p-6 space-y-4">
|
|
143
|
+
<h2 className="text-lg font-semibold">Consent Preferences</h2>
|
|
144
|
+
{Object.keys(consent).map((key) => (
|
|
145
|
+
<label key={key} className="flex items-center gap-3 cursor-pointer">
|
|
146
|
+
<input
|
|
147
|
+
type="checkbox"
|
|
148
|
+
checked={consent[key]}
|
|
149
|
+
onChange={(e) => setConsent((c) => ({ ...c, [key]: e.target.checked }))}
|
|
150
|
+
className="w-4 h-4 rounded"
|
|
151
|
+
/>
|
|
152
|
+
<span className="capitalize text-sm">{key}</span>
|
|
153
|
+
</label>
|
|
154
|
+
))}
|
|
155
|
+
<button
|
|
156
|
+
onClick={saveConsent}
|
|
157
|
+
disabled={saveStatus === 'saving'}
|
|
158
|
+
className="mt-2 bg-blue-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-blue-700 disabled:opacity-50"
|
|
159
|
+
>
|
|
160
|
+
{saveStatus === 'saved' ? '✓ Saved' : saveStatus === 'saving' ? 'Saving...' : 'Save Preferences'}
|
|
161
|
+
</button>
|
|
162
|
+
</section>
|
|
163
|
+
|
|
164
|
+
{/* Export */}
|
|
165
|
+
<section className="border rounded-xl p-6 space-y-3">
|
|
166
|
+
<h2 className="text-lg font-semibold">Export My Data</h2>
|
|
167
|
+
<p className="text-sm text-gray-500">
|
|
168
|
+
Download a copy of all personal data we hold about you (JSON format).
|
|
169
|
+
</p>
|
|
170
|
+
<button
|
|
171
|
+
onClick={exportData}
|
|
172
|
+
disabled={exportStatus === 'loading'}
|
|
173
|
+
className="bg-gray-800 text-white px-4 py-2 rounded-lg text-sm hover:bg-gray-700 disabled:opacity-50"
|
|
174
|
+
>
|
|
175
|
+
{exportStatus === 'loading' ? 'Preparing...' : exportStatus === 'done' ? '✓ Downloaded' : 'Download My Data'}
|
|
176
|
+
</button>
|
|
177
|
+
</section>
|
|
178
|
+
|
|
179
|
+
{/* Delete */}
|
|
180
|
+
<section className="border border-red-200 rounded-xl p-6 space-y-3">
|
|
181
|
+
<h2 className="text-lg font-semibold text-red-700">Delete My Account</h2>
|
|
182
|
+
<p className="text-sm text-gray-500">
|
|
183
|
+
Permanently delete your account and all associated data. This action cannot be undone.
|
|
184
|
+
</p>
|
|
185
|
+
{deleteStatus === 'idle' && (
|
|
186
|
+
<button
|
|
187
|
+
onClick={() => setDeleteStatus('confirm')}
|
|
188
|
+
className="bg-red-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-red-700"
|
|
189
|
+
>
|
|
190
|
+
Delete My Account
|
|
191
|
+
</button>
|
|
192
|
+
)}
|
|
193
|
+
{deleteStatus === 'confirm' && (
|
|
194
|
+
<div className="space-y-2">
|
|
195
|
+
<p className="text-sm font-medium text-red-700">Are you sure? This cannot be undone.</p>
|
|
196
|
+
<div className="flex gap-2">
|
|
197
|
+
<button
|
|
198
|
+
onClick={deleteAccount}
|
|
199
|
+
className="bg-red-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-red-700"
|
|
200
|
+
>
|
|
201
|
+
Yes, delete everything
|
|
202
|
+
</button>
|
|
203
|
+
<button
|
|
204
|
+
onClick={() => setDeleteStatus('idle')}
|
|
205
|
+
className="border px-4 py-2 rounded-lg text-sm hover:bg-gray-50"
|
|
206
|
+
>
|
|
207
|
+
Cancel
|
|
208
|
+
</button>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
)}
|
|
212
|
+
{deleteStatus === 'done' && (
|
|
213
|
+
<p className="text-sm text-green-700">✓ Account deleted. Redirecting...</p>
|
|
214
|
+
)}
|
|
215
|
+
</section>
|
|
216
|
+
</div>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
`;
|
|
220
|
+
}
|
|
221
|
+
/** app/api/gdpr/consent/route.ts */
|
|
222
|
+
function generateGdprConsentRoute() {
|
|
223
|
+
return `// @chimerai component=GdprConsentRoute version=1.0
|
|
224
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
225
|
+
import { getServerSession } from 'next-auth';
|
|
226
|
+
import { authOptions } from '@/lib/auth';
|
|
227
|
+
import { recordConsent } from '@/lib/gdpr';
|
|
228
|
+
|
|
229
|
+
export async function POST(req: NextRequest) {
|
|
230
|
+
const session = await getServerSession(authOptions);
|
|
231
|
+
if (!session?.user?.id) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
232
|
+
|
|
233
|
+
const { consent } = await req.json() as { consent: Record<string, boolean> };
|
|
234
|
+
|
|
235
|
+
for (const [type, granted] of Object.entries(consent)) {
|
|
236
|
+
await recordConsent(session.user.id, type, granted);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return NextResponse.json({ success: true });
|
|
240
|
+
}
|
|
241
|
+
`;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Prisma schema extension: ConsentLog model for GDPR consent tracking.
|
|
245
|
+
* SQLite-safe: no @db.Text, no Json, no arrays.
|
|
246
|
+
*/
|
|
247
|
+
exports.GDPR_SCHEMA_EXTENSION = `
|
|
248
|
+
model ConsentLog {
|
|
249
|
+
id String @id @default(cuid())
|
|
250
|
+
userId String
|
|
251
|
+
type String
|
|
252
|
+
granted Boolean
|
|
253
|
+
createdAt DateTime @default(now())
|
|
254
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
255
|
+
|
|
256
|
+
@@index([userId])
|
|
257
|
+
@@index([type])
|
|
258
|
+
}
|
|
259
|
+
`;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChimerAI CLI Template Generators - Main Export
|
|
3
|
+
*
|
|
4
|
+
* This module exports all template generator functions for use in CLI commands.
|
|
5
|
+
* Each generator function returns a string of TypeScript/TSX/CSS code that can be
|
|
6
|
+
* written to a file in the generated project.
|
|
7
|
+
*/
|
|
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';
|
|
10
|
+
export { generateNextAuthRoute, generateLoginPage, generateSessionProvider, generateLogoutButton, generateNextAuthTypes, generateAuthLib, generateResolveAuth, } from './auth.js';
|
|
11
|
+
export { generateChatPage, generateUseChatHook, generateChatMessage, generateChatInput, generateChatSidebar, generateModelSelector, generateChatStreamRouteWithPersistence, generateConversationsRoute, generateConversationDetailRoute, } from './chat.js';
|
|
12
|
+
export { generateAdminLayout, generateAdminDashboardPage, generateAdminUsersPage, generateAdminRolesPage, generateAdminSettingsPage, generateAdminLogsPage, generateAuditLogHelper, generatePermissionsLib, generateRequirePermissionLib, } from './admin.js';
|
|
13
|
+
export { generateModelProvidersPage, generatePromptManagementPage, generatePromptSelector } from './components.js';
|
|
14
|
+
export { generateAdminUsersRoute, generateAdminUsersIdRoute, generateAdminRolesRoute, generateAdminRolesIdRoute, generatePromptsRoute, generatePromptsIdRoute, generatePromptsSetDefaultRoute, generateHealthRoute, generateModelsRoute, generateV1ModelsRoute, generateAuditLogRoute, generateGdprDataExportRoute, generateGdprAccountDeleteRoute, generateAdminSettingsRoute, generateAppSettingsRoute, } from './api-routes.js';
|
|
15
|
+
export { generateProviderCrudRoute, generateProviderIdRoute, generateProviderTestRoute, generateProviderSyncRoute, generateInternalProvidersRoute, generateInternalProviderIdRoute, generateInternalProviderUsageRoute, generateNotifyProviderChangeLib, } from './provider-routes.js';
|
|
16
|
+
export { generatePrismaLib, generateEncryptionLib, generateApiKeyAuthLib, generateApiProtectionLib, generatePrismaSchema, } from './prisma.js';
|
|
17
|
+
export { generateMiddleware } from './middleware.js';
|
|
18
|
+
export { generateStripeLib, generateBillingPage, generateCheckoutRoute, generatePortalRoute, generateSubscriptionRoute, generateStripeWebhookRoute, } from './billing.js';
|
|
19
|
+
export { generateRagLib, generateRagPage, generateRagUploadRoute, generateRagQueryRoute, generateRagStatsRoute, generateRagClearRoute, generateRagDeleteRoute, } from './rag.js';
|
|
20
|
+
export { generateWidgetBundle, generateWidgetLoader, generateApiKeyManagementPage, generateApiKeysRoute, generateApiKeyIdRoute, generateRateLimiter, } from './widget.js';
|
|
21
|
+
export { generateMfaLib, generateMfaSetupRoute, generateMfaVerifyRoute, generateMfaDisableRoute, generateMfaPage, MFA_SCHEMA_EXTENSION, MFA_USER_FIELDS, } from './mfa.js';
|
|
22
|
+
export { generateGdprLib, generateGdprPage, generateGdprConsentRoute, GDPR_SCHEMA_EXTENSION, } from './gdpr.js';
|
|
23
|
+
export { generateDockerfile, generateDockerignore, generateDockerComposeProd, generateDockerComposeDev, } from './docker.js';
|
|
24
|
+
export { readAiManifest, writeAiManifest, TOOL_INFO, generateProviderClient, generateServicesInit, generateChatService, generateModelService, generateModerationService, generateEmbeddingService, generateRagService, generateVectorStore, generateGuardrailsService, generateAiServiceMain, generateAiServiceConfig, generateAiServiceModels, generateAiServiceRequirements, generateAiServiceDockerfile, generateAiServiceReadme, generateDockerComposeAiService, generateFileExtractor, } from './ai-service.js';
|
|
25
|
+
export type { AiServiceManifest, ToolInfo } from './ai-service.js';
|
|
26
|
+
export { generateChatRoutes, generateRagRoutes, generateGuardrailsRoutes, generateToolsRoutes, generateRoutesInit, } from './ai-routes.js';
|
|
27
|
+
export { generateWebTools, generateDocumentTools, generateCodeTools, generateNlpTools, generateVisionTools, generateGoogleSheetsTools, generateAirtableTools, generateDeeplTools, generateWebhookTools, generateToolsInit, TOOL_GENERATORS, } from './ai-service-tools.js';
|
|
28
|
+
/**
|
|
29
|
+
* All available templates organized by category
|
|
30
|
+
* Used for listing and querying templates programmatically
|
|
31
|
+
*/
|
|
32
|
+
export declare const ALL_TEMPLATES: {
|
|
33
|
+
config: string[];
|
|
34
|
+
layout: string[];
|
|
35
|
+
auth: string[];
|
|
36
|
+
chat: string[];
|
|
37
|
+
admin: string[];
|
|
38
|
+
components: string[];
|
|
39
|
+
apiRoutes: string[];
|
|
40
|
+
prisma: string[];
|
|
41
|
+
widget: string[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Template groups by feature
|
|
45
|
+
* Useful for feature installation commands
|
|
46
|
+
*/
|
|
47
|
+
export declare const FEATURE_TEMPLATES: {
|
|
48
|
+
auth: {
|
|
49
|
+
name: string;
|
|
50
|
+
templates: string[];
|
|
51
|
+
};
|
|
52
|
+
chat: {
|
|
53
|
+
name: string;
|
|
54
|
+
templates: string[];
|
|
55
|
+
};
|
|
56
|
+
rbac: {
|
|
57
|
+
name: string;
|
|
58
|
+
templates: string[];
|
|
59
|
+
};
|
|
60
|
+
providers: {
|
|
61
|
+
name: string;
|
|
62
|
+
templates: string[];
|
|
63
|
+
};
|
|
64
|
+
widget: {
|
|
65
|
+
name: string;
|
|
66
|
+
templates: string[];
|
|
67
|
+
};
|
|
68
|
+
prompts: {
|
|
69
|
+
name: string;
|
|
70
|
+
templates: string[];
|
|
71
|
+
};
|
|
72
|
+
aiService: {
|
|
73
|
+
name: string;
|
|
74
|
+
templates: string[];
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"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"}
|