@supunkalharajayasinghe/project-cli 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +380 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +48 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/greet.d.ts +3 -0
- package/dist/commands/greet.d.ts.map +1 -0
- package/dist/commands/greet.js +10 -0
- package/dist/commands/greet.js.map +1 -0
- package/dist/generators/applyAiPlan.d.ts +3 -0
- package/dist/generators/applyAiPlan.d.ts.map +1 -0
- package/dist/generators/applyAiPlan.js +426 -0
- package/dist/generators/applyAiPlan.js.map +1 -0
- package/dist/generators/applyFeatureModules.d.ts +4 -0
- package/dist/generators/applyFeatureModules.d.ts.map +1 -0
- package/dist/generators/applyFeatureModules.js +242 -0
- package/dist/generators/applyFeatureModules.js.map +1 -0
- package/dist/generators/applyFullstackPlan.d.ts +3 -0
- package/dist/generators/applyFullstackPlan.d.ts.map +1 -0
- package/dist/generators/applyFullstackPlan.js +413 -0
- package/dist/generators/applyFullstackPlan.js.map +1 -0
- package/dist/generators/applyPlan.d.ts +3 -0
- package/dist/generators/applyPlan.d.ts.map +1 -0
- package/dist/generators/applyPlan.js +22 -0
- package/dist/generators/applyPlan.js.map +1 -0
- package/dist/generators/applyWebsitePlan.d.ts +3 -0
- package/dist/generators/applyWebsitePlan.d.ts.map +1 -0
- package/dist/generators/applyWebsitePlan.js +1053 -0
- package/dist/generators/applyWebsitePlan.js.map +1 -0
- package/dist/generators/createNextBase.d.ts +3 -0
- package/dist/generators/createNextBase.d.ts.map +1 -0
- package/dist/generators/createNextBase.js +20 -0
- package/dist/generators/createNextBase.js.map +1 -0
- package/dist/generators/generateBasicProject.d.ts +3 -0
- package/dist/generators/generateBasicProject.d.ts.map +1 -0
- package/dist/generators/generateBasicProject.js +65 -0
- package/dist/generators/generateBasicProject.js.map +1 -0
- package/dist/generators/starterBranding.d.ts +9 -0
- package/dist/generators/starterBranding.d.ts.map +1 -0
- package/dist/generators/starterBranding.js +48 -0
- package/dist/generators/starterBranding.js.map +1 -0
- package/dist/generators/writeGeneratedReadme.d.ts +3 -0
- package/dist/generators/writeGeneratedReadme.d.ts.map +1 -0
- package/dist/generators/writeGeneratedReadme.js +99 -0
- package/dist/generators/writeGeneratedReadme.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/askBasicScaffoldOptions.d.ts +3 -0
- package/dist/prompts/askBasicScaffoldOptions.d.ts.map +1 -0
- package/dist/prompts/askBasicScaffoldOptions.js +36 -0
- package/dist/prompts/askBasicScaffoldOptions.js.map +1 -0
- package/dist/prompts/askCreatePlan.d.ts +3 -0
- package/dist/prompts/askCreatePlan.d.ts.map +1 -0
- package/dist/prompts/askCreatePlan.js +232 -0
- package/dist/prompts/askCreatePlan.js.map +1 -0
- package/dist/types.d.ts +64 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/files.d.ts +14 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +47 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/generateSecret.d.ts +2 -0
- package/dist/utils/generateSecret.d.ts.map +1 -0
- package/dist/utils/generateSecret.js +5 -0
- package/dist/utils/generateSecret.js.map +1 -0
- package/dist/utils/pathExists.d.ts +2 -0
- package/dist/utils/pathExists.d.ts.map +1 -0
- package/dist/utils/pathExists.js +11 -0
- package/dist/utils/pathExists.js.map +1 -0
- package/dist/utils/runCommand.d.ts +8 -0
- package/dist/utils/runCommand.d.ts.map +1 -0
- package/dist/utils/runCommand.js +59 -0
- package/dist/utils/runCommand.js.map +1 -0
- package/dist/utils/strings.d.ts +3 -0
- package/dist/utils/strings.d.ts.map +1 -0
- package/dist/utils/strings.js +15 -0
- package/dist/utils/strings.js.map +1 -0
- package/dist/utils/validateFreeText.d.ts +13 -0
- package/dist/utils/validateFreeText.d.ts.map +1 -0
- package/dist/utils/validateFreeText.js +19 -0
- package/dist/utils/validateFreeText.js.map +1 -0
- package/dist/utils/validateProjectName.d.ts +7 -0
- package/dist/utils/validateProjectName.d.ts.map +1 -0
- package/dist/utils/validateProjectName.js +42 -0
- package/dist/utils/validateProjectName.js.map +1 -0
- package/dist/utils/writeJson.d.ts +2 -0
- package/dist/utils/writeJson.d.ts.map +1 -0
- package/dist/utils/writeJson.js +2 -0
- package/dist/utils/writeJson.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyFeatureModules.js","sourceRoot":"","sources":["../../src/generators/applyFeatureModules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyFullstackPlan.d.ts","sourceRoot":"","sources":["../../src/generators/applyFullstackPlan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAexE"}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { writeFileSafe } from '../utils/files.js';
|
|
3
|
+
import { toTitle } from '../utils/strings.js';
|
|
4
|
+
import { starterBranding } from './starterBranding.js';
|
|
5
|
+
export async function applyFullstackPlan(plan) {
|
|
6
|
+
if (plan.blueprint !== 'fullstack-product') {
|
|
7
|
+
throw new Error('applyFullstackPlan can only be used with fullstack-product plans.');
|
|
8
|
+
}
|
|
9
|
+
await writeLayout(plan);
|
|
10
|
+
await writeHomePage(plan);
|
|
11
|
+
await writeDashboardPage(plan);
|
|
12
|
+
await writeDashboardComponents(plan);
|
|
13
|
+
await writeHealthRoute(plan);
|
|
14
|
+
await writeServerFiles(plan);
|
|
15
|
+
await writeLibFiles(plan);
|
|
16
|
+
await writeTypesFile(plan);
|
|
17
|
+
}
|
|
18
|
+
async function writeLayout(plan) {
|
|
19
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/app/layout.tsx'), `import type { Metadata } from 'next';
|
|
20
|
+
import type { ReactNode } from 'react';
|
|
21
|
+
import './globals.css';
|
|
22
|
+
|
|
23
|
+
export const metadata: Metadata = {
|
|
24
|
+
title: ${JSON.stringify(toTitle(plan.projectName))},
|
|
25
|
+
description: 'Generated full-stack product starter.',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default function RootLayout({
|
|
29
|
+
children,
|
|
30
|
+
}: Readonly<{
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
}>) {
|
|
33
|
+
return (
|
|
34
|
+
<html lang="en">
|
|
35
|
+
<body className="antialiased">{children}</body>
|
|
36
|
+
</html>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
`);
|
|
40
|
+
}
|
|
41
|
+
async function writeHomePage(plan) {
|
|
42
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/app/page.tsx'), `import Link from 'next/link';
|
|
43
|
+
import { Sparkles, ArrowRight, LayoutDashboard, Activity } from 'lucide-react';
|
|
44
|
+
|
|
45
|
+
export default function HomePage() {
|
|
46
|
+
return (
|
|
47
|
+
<div className="flex flex-col min-h-screen">
|
|
48
|
+
<header className="border-b border-slate-200/80 bg-white/80 backdrop-blur-md sticky top-0 z-50">
|
|
49
|
+
<div className="mx-auto max-w-6xl px-6 py-4 flex items-center justify-between">
|
|
50
|
+
<div className="flex items-center gap-2">
|
|
51
|
+
<span className="h-6 w-6 rounded-lg bg-indigo-600 flex items-center justify-center text-xs font-bold text-white shadow-sm shadow-indigo-500/30">
|
|
52
|
+
P
|
|
53
|
+
</span>
|
|
54
|
+
<span className="text-base font-bold tracking-tight text-slate-900">${toTitle(plan.projectName)}</span>
|
|
55
|
+
</div>
|
|
56
|
+
<Link href="/dashboard" className="text-sm font-semibold text-indigo-600 hover:text-indigo-500 transition inline-flex items-center gap-1">
|
|
57
|
+
Go to Dashboard
|
|
58
|
+
<ArrowRight className="h-4 w-4" />
|
|
59
|
+
</Link>
|
|
60
|
+
</div>
|
|
61
|
+
</header>
|
|
62
|
+
|
|
63
|
+
<main className="flex-1 mx-auto max-w-4xl px-6 py-24 flex flex-col justify-center text-center relative overflow-hidden">
|
|
64
|
+
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 -z-10 h-72 w-72 rounded-full bg-indigo-400/10 blur-3xl pointer-events-none" />
|
|
65
|
+
|
|
66
|
+
<div>
|
|
67
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-indigo-50 px-3.5 py-1.5 text-xs font-semibold text-indigo-700 ring-1 ring-inset ring-indigo-700/10">
|
|
68
|
+
<Sparkles className="h-3.5 w-3.5 animate-pulse" />
|
|
69
|
+
v1.3.0 • Premium Blueprint Starters
|
|
70
|
+
</span>
|
|
71
|
+
<h1 className="mt-8 text-4xl font-extrabold tracking-tight text-slate-900 sm:text-6xl bg-gradient-to-r from-indigo-600 via-violet-600 to-indigo-500 bg-clip-text text-transparent">
|
|
72
|
+
${toTitle(plan.projectName)}
|
|
73
|
+
</h1>
|
|
74
|
+
<p className="mt-6 text-lg leading-8 text-slate-600 max-w-2xl mx-auto font-medium">
|
|
75
|
+
A premium full-stack SaaS platform generated by project-cli, pre-configured with server actions, API health polling, Docker deployment files, and database schemas.
|
|
76
|
+
</p>
|
|
77
|
+
<div className="mt-10 flex items-center justify-center gap-4">
|
|
78
|
+
<Link
|
|
79
|
+
href="/dashboard"
|
|
80
|
+
className="inline-flex items-center gap-2 rounded-xl bg-indigo-600 px-6 py-3.5 text-sm font-semibold text-white shadow-md shadow-indigo-500/20 hover:bg-indigo-500 transition duration-200"
|
|
81
|
+
>
|
|
82
|
+
<LayoutDashboard className="h-4 w-4" />
|
|
83
|
+
Open Dashboard
|
|
84
|
+
</Link>
|
|
85
|
+
<Link
|
|
86
|
+
href="/api/health"
|
|
87
|
+
target="_blank"
|
|
88
|
+
className="inline-flex items-center gap-2 rounded-xl border border-slate-200 bg-white/80 backdrop-blur-sm px-6 py-3.5 text-sm font-semibold text-slate-700 hover:bg-slate-50 transition duration-200"
|
|
89
|
+
>
|
|
90
|
+
<Activity className="h-4 w-4" />
|
|
91
|
+
Check API Health
|
|
92
|
+
</Link>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</main>
|
|
96
|
+
|
|
97
|
+
<footer className="border-t border-slate-200/80 bg-slate-50/50 py-8 text-center text-xs text-slate-400">
|
|
98
|
+
<div className="mx-auto max-w-6xl px-6 flex flex-col sm:flex-row items-center justify-between gap-4">
|
|
99
|
+
<div>
|
|
100
|
+
© {new Date().getFullYear()} ${toTitle(plan.projectName)}. All rights reserved.
|
|
101
|
+
</div>
|
|
102
|
+
<div className="flex items-center gap-1.5">
|
|
103
|
+
<span>Generated with ${starterBranding.cliName} ${starterBranding.version}</span>
|
|
104
|
+
<span className="text-slate-300">•</span>
|
|
105
|
+
<span className="font-semibold text-slate-550">${starterBranding.releaseName}</span>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</footer>
|
|
109
|
+
</div>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
`);
|
|
113
|
+
}
|
|
114
|
+
async function writeDashboardPage(plan) {
|
|
115
|
+
const hasPrisma = plan.modules.includes('prisma');
|
|
116
|
+
const hasRedis = plan.modules.includes('redis');
|
|
117
|
+
const hasDocker = plan.modules.includes('docker');
|
|
118
|
+
const hasCI = plan.modules.includes('github-actions');
|
|
119
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/app/dashboard/page.tsx'), `'use client';
|
|
120
|
+
|
|
121
|
+
import { useState, useEffect } from 'react';
|
|
122
|
+
import { DashboardShell } from '@/components/dashboard/DashboardShell';
|
|
123
|
+
import { StatCard } from '@/components/dashboard/StatCard';
|
|
124
|
+
import { BarChart3, Zap, HardDrive, Database, Cpu, Activity, ShieldCheck, Box, Workflow } from 'lucide-react';
|
|
125
|
+
|
|
126
|
+
interface HealthData {
|
|
127
|
+
ok: boolean;
|
|
128
|
+
service: string;
|
|
129
|
+
timestamp: string;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export default function DashboardPage() {
|
|
133
|
+
const [health, setHealth] = useState<HealthData | null>(null);
|
|
134
|
+
const [loading, setLoading] = useState(true);
|
|
135
|
+
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
fetch('/api/health')
|
|
138
|
+
.then((res) => res.json())
|
|
139
|
+
.then((data) => {
|
|
140
|
+
setHealth(data);
|
|
141
|
+
setLoading(false);
|
|
142
|
+
})
|
|
143
|
+
.catch(() => {
|
|
144
|
+
setLoading(false);
|
|
145
|
+
});
|
|
146
|
+
}, []);
|
|
147
|
+
|
|
148
|
+
const hasPrisma = ${hasPrisma};
|
|
149
|
+
const hasRedis = ${hasRedis};
|
|
150
|
+
const hasDocker = ${hasDocker};
|
|
151
|
+
const hasCI = ${hasCI};
|
|
152
|
+
|
|
153
|
+
return (
|
|
154
|
+
<DashboardShell
|
|
155
|
+
title="Product Dashboard"
|
|
156
|
+
description="A clean interface showing product metrics, connected services, and quick links."
|
|
157
|
+
>
|
|
158
|
+
{/* Active Modules Badges */}
|
|
159
|
+
<div className="mb-8 flex flex-wrap gap-2">
|
|
160
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-slate-100 px-3 py-1.5 text-xs font-semibold text-slate-700 ring-1 ring-inset ring-slate-700/10">
|
|
161
|
+
<Activity className="h-3.5 w-3.5" /> Core Engine
|
|
162
|
+
</span>
|
|
163
|
+
{hasPrisma && (
|
|
164
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-emerald-50 px-3 py-1.5 text-xs font-semibold text-emerald-700 ring-1 ring-inset ring-emerald-600/10">
|
|
165
|
+
<Database className="h-3.5 w-3.5" /> PostgreSQL (Prisma)
|
|
166
|
+
</span>
|
|
167
|
+
)}
|
|
168
|
+
{hasRedis && (
|
|
169
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-rose-50 px-3 py-1.5 text-xs font-semibold text-rose-700 ring-1 ring-inset ring-rose-600/10">
|
|
170
|
+
<Cpu className="h-3.5 w-3.5" /> Redis Cache
|
|
171
|
+
</span>
|
|
172
|
+
)}
|
|
173
|
+
{hasDocker && (
|
|
174
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-blue-50 px-3 py-1.5 text-xs font-semibold text-blue-700 ring-1 ring-inset ring-blue-600/10">
|
|
175
|
+
<Box className="h-3.5 w-3.5" /> Docker Container
|
|
176
|
+
</span>
|
|
177
|
+
)}
|
|
178
|
+
{hasCI && (
|
|
179
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-purple-50 px-3 py-1.5 text-xs font-semibold text-purple-700 ring-1 ring-inset ring-purple-600/10">
|
|
180
|
+
<Workflow className="h-3.5 w-3.5" /> GitHub Actions
|
|
181
|
+
</span>
|
|
182
|
+
)}
|
|
183
|
+
</div>
|
|
184
|
+
|
|
185
|
+
{/* Metrics Section */}
|
|
186
|
+
<section className="grid gap-6 md:grid-cols-3">
|
|
187
|
+
<StatCard label="Total Projects" value="12" change="+4% this week" icon={BarChart3} />
|
|
188
|
+
<StatCard label="API Requests" value="1,240" change="99.9% uptime" icon={Zap} />
|
|
189
|
+
<StatCard label="Memory Usage" value="42MB" change="Within limits" icon={HardDrive} />
|
|
190
|
+
</section>
|
|
191
|
+
|
|
192
|
+
<div className="mt-8 grid gap-8 md:grid-cols-3">
|
|
193
|
+
{/* API Health Card */}
|
|
194
|
+
<div className="md:col-span-1 rounded-2xl border border-slate-200 bg-white p-6 shadow-sm flex flex-col justify-between hover:shadow-md transition duration-200">
|
|
195
|
+
<div>
|
|
196
|
+
<h3 className="font-bold text-slate-950">API Health Status</h3>
|
|
197
|
+
<p className="mt-2 text-sm text-slate-500 leading-relaxed font-medium">
|
|
198
|
+
Monitors the backend \`/api/health\` JSON endpoint.
|
|
199
|
+
</p>
|
|
200
|
+
</div>
|
|
201
|
+
<div className="mt-6 pt-6 border-t border-slate-100 flex items-center justify-between">
|
|
202
|
+
<span className="text-sm font-semibold text-slate-700">Status</span>
|
|
203
|
+
{loading ? (
|
|
204
|
+
<span className="text-xs text-slate-400 font-medium animate-pulse">Checking...</span>
|
|
205
|
+
) : health?.ok ? (
|
|
206
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-emerald-50 px-2.5 py-1 text-xs font-semibold text-emerald-700 ring-1 ring-inset ring-emerald-600/10">
|
|
207
|
+
<ShieldCheck className="h-3.5 w-3.5 animate-pulse" /> Operational
|
|
208
|
+
</span>
|
|
209
|
+
) : (
|
|
210
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-rose-50 px-2.5 py-1 text-xs font-semibold text-rose-700 ring-1 ring-inset ring-rose-600/10">
|
|
211
|
+
<Activity className="h-3.5 w-3.5" /> Offline
|
|
212
|
+
</span>
|
|
213
|
+
)}
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
{/* Next Steps / Workspace Card */}
|
|
218
|
+
<div className="md:col-span-2 rounded-2xl border border-slate-200 bg-white p-6 shadow-sm hover:shadow-md transition duration-200">
|
|
219
|
+
<h3 className="font-bold text-slate-950">Getting Started</h3>
|
|
220
|
+
<p className="mt-2 text-sm text-slate-500 leading-relaxed font-medium">
|
|
221
|
+
Follow these simple steps to build out your product logic:
|
|
222
|
+
</p>
|
|
223
|
+
|
|
224
|
+
<ul className="mt-6 space-y-4 text-sm text-slate-750 font-medium">
|
|
225
|
+
<li className="flex gap-3">
|
|
226
|
+
<span className="h-5 w-5 rounded-full bg-indigo-50 flex items-center justify-center text-xs font-bold text-indigo-600 flex-shrink-0 mt-0.5">1</span>
|
|
227
|
+
<span>
|
|
228
|
+
<strong>Customize UI:</strong> Edit <code className="text-xs bg-slate-100 px-1.5 py-0.5 rounded font-mono text-indigo-650">src/app/dashboard/page.tsx</code> to structure your product dashboard features.
|
|
229
|
+
</span>
|
|
230
|
+
</li>
|
|
231
|
+
<li className="flex gap-3">
|
|
232
|
+
<span className="h-5 w-5 rounded-full bg-indigo-50 flex items-center justify-center text-xs font-bold text-indigo-600 flex-shrink-0 mt-0.5">2</span>
|
|
233
|
+
<span>
|
|
234
|
+
<strong>API Endpoints:</strong> View <code className="text-xs bg-slate-100 px-1.5 py-0.5 rounded font-mono text-indigo-650">src/app/api/health/route.ts</code> to see how server routes map to services.
|
|
235
|
+
</span>
|
|
236
|
+
</li>
|
|
237
|
+
{hasPrisma && (
|
|
238
|
+
<li className="flex gap-3">
|
|
239
|
+
<span className="h-5 w-5 rounded-full bg-indigo-50 flex items-center justify-center text-xs font-bold text-indigo-600 flex-shrink-0 mt-0.5">3</span>
|
|
240
|
+
<span>
|
|
241
|
+
<strong>Database Setup:</strong> Run <code className="text-xs bg-slate-100 px-1.5 py-0.5 rounded font-mono text-indigo-655">npm run db:push</code> to synchronize the schema.
|
|
242
|
+
</span>
|
|
243
|
+
</li>
|
|
244
|
+
)}
|
|
245
|
+
</ul>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</DashboardShell>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
`);
|
|
252
|
+
}
|
|
253
|
+
async function writeDashboardComponents(plan) {
|
|
254
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/components/dashboard/DashboardShell.tsx'), `import type { ReactNode } from 'react';
|
|
255
|
+
import Link from 'next/link';
|
|
256
|
+
import { Layers, Github } from 'lucide-react';
|
|
257
|
+
|
|
258
|
+
interface DashboardShellProps {
|
|
259
|
+
title: string;
|
|
260
|
+
description: string;
|
|
261
|
+
children: ReactNode;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function DashboardShell({
|
|
265
|
+
title,
|
|
266
|
+
description,
|
|
267
|
+
children,
|
|
268
|
+
}: DashboardShellProps) {
|
|
269
|
+
return (
|
|
270
|
+
<div className="min-h-screen flex flex-col bg-slate-50/50">
|
|
271
|
+
<header className="border-b border-slate-200/80 bg-white/80 backdrop-blur-md sticky top-0 z-50">
|
|
272
|
+
<div className="mx-auto max-w-6xl px-6 py-4 flex items-center justify-between">
|
|
273
|
+
<div className="flex items-center gap-6">
|
|
274
|
+
<Link href="/" className="flex items-center gap-2">
|
|
275
|
+
<span className="h-6 w-6 rounded-lg bg-indigo-600 flex items-center justify-center text-xs font-bold text-white shadow-sm shadow-indigo-500/30">
|
|
276
|
+
<Layers className="h-4.5 w-4.5" />
|
|
277
|
+
</span>
|
|
278
|
+
<span className="text-base font-bold tracking-tight text-slate-900">Workspace</span>
|
|
279
|
+
</Link>
|
|
280
|
+
<nav className="hidden sm:flex gap-4">
|
|
281
|
+
<Link href="/dashboard" className="text-sm font-semibold text-slate-900">
|
|
282
|
+
Dashboard
|
|
283
|
+
</Link>
|
|
284
|
+
</nav>
|
|
285
|
+
</div>
|
|
286
|
+
<div className="flex items-center gap-4">
|
|
287
|
+
<a
|
|
288
|
+
href="${starterBranding.githubUrl}"
|
|
289
|
+
target="_blank"
|
|
290
|
+
rel="noopener noreferrer"
|
|
291
|
+
className="text-sm font-medium text-slate-500 hover:text-slate-900 transition inline-flex items-center gap-1"
|
|
292
|
+
>
|
|
293
|
+
<Github className="h-4 w-4" />
|
|
294
|
+
GitHub Docs
|
|
295
|
+
</a>
|
|
296
|
+
</div>
|
|
297
|
+
</div>
|
|
298
|
+
</header>
|
|
299
|
+
|
|
300
|
+
<main className="flex-1 mx-auto w-full max-w-6xl px-6 py-10">
|
|
301
|
+
<div className="mb-8">
|
|
302
|
+
<h1 className="text-3xl font-extrabold tracking-tight text-slate-900">
|
|
303
|
+
{title}
|
|
304
|
+
</h1>
|
|
305
|
+
<p className="mt-2 text-sm text-slate-500 font-medium">{description}</p>
|
|
306
|
+
</div>
|
|
307
|
+
|
|
308
|
+
{children}
|
|
309
|
+
</main>
|
|
310
|
+
|
|
311
|
+
<footer className="border-t border-slate-200 bg-white py-6 text-center text-xs text-slate-400">
|
|
312
|
+
<div className="mx-auto max-w-6xl px-6 flex flex-col sm:flex-row items-center justify-between gap-4">
|
|
313
|
+
<div>
|
|
314
|
+
© {new Date().getFullYear()} Workspace. All rights reserved.
|
|
315
|
+
</div>
|
|
316
|
+
<div className="flex items-center gap-1.5">
|
|
317
|
+
<span>Generated with ${starterBranding.cliName} ${starterBranding.version}</span>
|
|
318
|
+
<span className="text-slate-300">•</span>
|
|
319
|
+
<span className="font-semibold text-slate-550">${starterBranding.releaseName}</span>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
</footer>
|
|
323
|
+
</div>
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
`);
|
|
327
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/components/dashboard/StatCard.tsx'), `import { LucideIcon } from 'lucide-react';
|
|
328
|
+
|
|
329
|
+
interface StatCardProps {
|
|
330
|
+
label: string;
|
|
331
|
+
value: string;
|
|
332
|
+
change?: string;
|
|
333
|
+
icon: LucideIcon;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export function StatCard({ label, value, change, icon: Icon }: StatCardProps) {
|
|
337
|
+
return (
|
|
338
|
+
<div className="rounded-2xl border border-slate-200 bg-white p-6 shadow-sm flex items-center justify-between hover:shadow-md transition duration-200">
|
|
339
|
+
<div>
|
|
340
|
+
<p className="text-sm font-semibold text-slate-500 uppercase tracking-wide">{label}</p>
|
|
341
|
+
<p className="mt-2 text-3xl font-extrabold tracking-tight text-slate-900">{value}</p>
|
|
342
|
+
{change && (
|
|
343
|
+
<p className="mt-1.5 text-xs text-slate-400 font-semibold">{change}</p>
|
|
344
|
+
)}
|
|
345
|
+
</div>
|
|
346
|
+
<span className="p-3.5 bg-slate-55 rounded-2xl border border-slate-100 text-indigo-600">
|
|
347
|
+
<Icon className="h-6 w-6" />
|
|
348
|
+
</span>
|
|
349
|
+
</div>
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
`);
|
|
353
|
+
}
|
|
354
|
+
async function writeHealthRoute(plan) {
|
|
355
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/app/api/health/route.ts'), `export async function GET() {
|
|
356
|
+
return Response.json({
|
|
357
|
+
ok: true,
|
|
358
|
+
service: '${plan.projectName}',
|
|
359
|
+
blueprint: 'fullstack-product',
|
|
360
|
+
timestamp: new Date().toISOString(),
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
`);
|
|
364
|
+
}
|
|
365
|
+
async function writeServerFiles(plan) {
|
|
366
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/server/actions/index.ts'), `export async function exampleAction() {
|
|
367
|
+
return {
|
|
368
|
+
ok: true,
|
|
369
|
+
message: 'Server action placeholder',
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
`);
|
|
373
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/server/services/productService.ts'), `export interface ProductSummary {
|
|
374
|
+
name: string;
|
|
375
|
+
blueprint: string;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export function getProductSummary(): ProductSummary {
|
|
379
|
+
return {
|
|
380
|
+
name: ${JSON.stringify(plan.projectName)},
|
|
381
|
+
blueprint: 'fullstack-product',
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
`);
|
|
385
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/server/services/index.ts'), `export { getProductSummary } from './productService.js';
|
|
386
|
+
export type { ProductSummary } from './productService.js';
|
|
387
|
+
`);
|
|
388
|
+
}
|
|
389
|
+
async function writeLibFiles(plan) {
|
|
390
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/lib/env.ts'), `export const env = {
|
|
391
|
+
databaseUrl: process.env.DATABASE_URL,
|
|
392
|
+
redisUrl: process.env.REDIS_URL,
|
|
393
|
+
} as const;
|
|
394
|
+
`);
|
|
395
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/lib/utils.ts'), `export function formatAppName(value: string): string {
|
|
396
|
+
return value
|
|
397
|
+
.split(/[-_\\s]+/)
|
|
398
|
+
.filter(Boolean)
|
|
399
|
+
.map((part) => \`\${part.charAt(0).toUpperCase()}\${part.slice(1)}\`)
|
|
400
|
+
.join(' ');
|
|
401
|
+
}
|
|
402
|
+
`);
|
|
403
|
+
}
|
|
404
|
+
async function writeTypesFile(plan) {
|
|
405
|
+
await writeFileSafe(path.join(plan.targetPath, 'src/types/product.ts'), `export type ProductBlueprint = 'saas' | 'dashboard' | 'custom';
|
|
406
|
+
|
|
407
|
+
export interface ProductConfig {
|
|
408
|
+
name: string;
|
|
409
|
+
blueprint: ProductBlueprint;
|
|
410
|
+
}
|
|
411
|
+
`);
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=applyFullstackPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyFullstackPlan.js","sourceRoot":"","sources":["../../src/generators/applyFullstackPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyPlan.d.ts","sourceRoot":"","sources":["../../src/generators/applyPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { applyAiPlan } from './applyAiPlan.js';
|
|
2
|
+
import { applyFeatureModules } from './applyFeatureModules.js';
|
|
3
|
+
import { applyFullstackPlan } from './applyFullstackPlan.js';
|
|
4
|
+
import { applyWebsitePlan } from './applyWebsitePlan.js';
|
|
5
|
+
import { writeGeneratedReadme } from './writeGeneratedReadme.js';
|
|
6
|
+
import { writeGlobalsCss } from './starterBranding.js';
|
|
7
|
+
export async function applyPlan(plan) {
|
|
8
|
+
// Overwrite globals.css with the polished light theme styling
|
|
9
|
+
await writeGlobalsCss(plan.targetPath);
|
|
10
|
+
if (plan.blueprint === 'website') {
|
|
11
|
+
await applyWebsitePlan(plan);
|
|
12
|
+
}
|
|
13
|
+
if (plan.blueprint === 'fullstack-product') {
|
|
14
|
+
await applyFullstackPlan(plan);
|
|
15
|
+
}
|
|
16
|
+
if (plan.blueprint === 'ai-app') {
|
|
17
|
+
await applyAiPlan(plan);
|
|
18
|
+
}
|
|
19
|
+
await applyFeatureModules(plan);
|
|
20
|
+
await writeGeneratedReadme(plan);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=applyPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyPlan.js","sourceRoot":"","sources":["../../src/generators/applyPlan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,8DAA8D;IAC9D,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;QAC3C,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyWebsitePlan.d.ts","sourceRoot":"","sources":["../../src/generators/applyWebsitePlan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtE"}
|