mycontext-cli 4.2.11 → 4.2.13

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.
Files changed (55) hide show
  1. package/README.md +46 -605
  2. package/dist/README.md +46 -605
  3. package/dist/cli.js +8 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/build-app.d.ts +1 -0
  6. package/dist/commands/build-app.d.ts.map +1 -1
  7. package/dist/commands/build-app.js +2 -1
  8. package/dist/commands/build-app.js.map +1 -1
  9. package/dist/commands/build-feature.d.ts +5 -0
  10. package/dist/commands/build-feature.d.ts.map +1 -0
  11. package/dist/commands/build-feature.js +39 -0
  12. package/dist/commands/build-feature.js.map +1 -0
  13. package/dist/commands/init.d.ts +0 -3
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +24 -7
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/plan.d.ts +5 -0
  18. package/dist/commands/plan.d.ts.map +1 -0
  19. package/dist/commands/plan.js +32 -0
  20. package/dist/commands/plan.js.map +1 -0
  21. package/dist/commands/test.d.ts +4 -0
  22. package/dist/commands/test.d.ts.map +1 -1
  23. package/dist/commands/test.js +90 -0
  24. package/dist/commands/test.js.map +1 -1
  25. package/dist/commands/vision-test.d.ts +6 -4
  26. package/dist/commands/vision-test.d.ts.map +1 -1
  27. package/dist/commands/vision-test.js +81 -22
  28. package/dist/commands/vision-test.js.map +1 -1
  29. package/dist/doctor/DoctorEngine.d.ts.map +1 -1
  30. package/dist/doctor/DoctorEngine.js +4 -1
  31. package/dist/doctor/DoctorEngine.js.map +1 -1
  32. package/dist/doctor/rules/index.d.ts +2 -1
  33. package/dist/doctor/rules/index.d.ts.map +1 -1
  34. package/dist/doctor/rules/index.js +4 -1
  35. package/dist/doctor/rules/index.js.map +1 -1
  36. package/dist/doctor/rules/security-rules.d.ts +6 -0
  37. package/dist/doctor/rules/security-rules.d.ts.map +1 -0
  38. package/dist/doctor/rules/security-rules.js +66 -0
  39. package/dist/doctor/rules/security-rules.js.map +1 -0
  40. package/dist/doctor/types.d.ts +1 -1
  41. package/dist/doctor/types.d.ts.map +1 -1
  42. package/dist/generator/scaffold.d.ts +11 -0
  43. package/dist/generator/scaffold.d.ts.map +1 -0
  44. package/dist/generator/scaffold.js +107 -0
  45. package/dist/generator/scaffold.js.map +1 -0
  46. package/dist/generator/templates/nextjs.d.ts +11 -0
  47. package/dist/generator/templates/nextjs.d.ts.map +1 -0
  48. package/dist/generator/templates/nextjs.js +499 -0
  49. package/dist/generator/templates/nextjs.js.map +1 -0
  50. package/dist/package.json +1 -1
  51. package/dist/planner/index.d.ts +11 -0
  52. package/dist/planner/index.d.ts.map +1 -0
  53. package/dist/planner/index.js +142 -0
  54. package/dist/planner/index.js.map +1 -0
  55. package/package.json +1 -1
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DeterministicScaffoldGenerator = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const nextjs_1 = require("./templates/nextjs");
11
+ class DeterministicScaffoldGenerator {
12
+ constructor(targetDir = process.cwd()) {
13
+ this.targetDir = targetDir;
14
+ }
15
+ async generate(fsr) {
16
+ console.log(chalk_1.default.blue(`=== Scaffolding Feature: ${fsr.featureId} ===`));
17
+ const usesSrc = fs_extra_1.default.existsSync(path_1.default.join(this.targetDir, 'src'));
18
+ const baseDir = usesSrc ? path_1.default.join(this.targetDir, 'src') : this.targetDir;
19
+ // 1. Generate Models/Types
20
+ if (fsr.models && fsr.models.length > 0) {
21
+ const typesDir = path_1.default.join(baseDir, 'types');
22
+ await fs_extra_1.default.ensureDir(typesDir);
23
+ const typesContent = (0, nextjs_1.generateTypesTemplate)(fsr.models);
24
+ await fs_extra_1.default.writeFile(path_1.default.join(typesDir, `${fsr.featureId}.ts`), typesContent);
25
+ console.log(chalk_1.default.green(`✓ Types generated: types/${fsr.featureId}.ts`));
26
+ }
27
+ // 2. Generate Server Actions
28
+ if (fsr.serverActions && fsr.serverActions.length > 0) {
29
+ const actionsDir = path_1.default.join(baseDir, 'app', 'actions');
30
+ await fs_extra_1.default.ensureDir(actionsDir);
31
+ const actionsContent = fsr.serverActions.map((a) => (0, nextjs_1.generateServerActionTemplate)(a, fsr.models)).join('\n\n');
32
+ const cleanContent = `"use server";\n\nimport { revalidatePath } from "next/cache";\n\n` +
33
+ actionsContent.replace(/"use server";\n\nimport { revalidatePath } from "next\/cache";\n\n/g, '');
34
+ await fs_extra_1.default.writeFile(path_1.default.join(actionsDir, `${fsr.featureId}.ts`), cleanContent);
35
+ console.log(chalk_1.default.green(`✓ Actions generated: app/actions/${fsr.featureId}.ts`));
36
+ }
37
+ // 3. Generate Components
38
+ if (fsr.components && fsr.components.length > 0) {
39
+ const componentsDir = path_1.default.join(baseDir, 'components');
40
+ await fs_extra_1.default.ensureDir(componentsDir);
41
+ for (const comp of fsr.components) {
42
+ // Exclude the page entry point from standard components if it is defined as the entry component
43
+ if (comp.name === fsr.entryPoint.component)
44
+ continue;
45
+ const content = comp.type === 'server'
46
+ ? (0, nextjs_1.generateServerComponentTemplate)(comp)
47
+ : (0, nextjs_1.generateClientComponentTemplate)(comp);
48
+ await fs_extra_1.default.writeFile(path_1.default.join(componentsDir, `${comp.name}.tsx`), content);
49
+ console.log(chalk_1.default.green(`✓ Component generated: components/${comp.name}.tsx`));
50
+ }
51
+ }
52
+ // 4. Generate Entry Point (Page)
53
+ if (fsr.entryPoint.type === 'page') {
54
+ const normalizedPath = fsr.entryPoint.path.startsWith('/') ? fsr.entryPoint.path.slice(1) : fsr.entryPoint.path;
55
+ const pageDir = path_1.default.join(baseDir, 'app', normalizedPath);
56
+ await fs_extra_1.default.ensureDir(pageDir);
57
+ const rootComponent = fsr.components.find((c) => c.name === fsr.entryPoint.component);
58
+ const childNames = rootComponent ? rootComponent.children || [] : [];
59
+ const children = childNames.map(name => fsr.components.find(c => c.name === name)).filter(Boolean);
60
+ const pageContent = (0, nextjs_1.generateNextPageTemplate)(fsr.entryPoint.component || 'Page', children, fsr.uiRules);
61
+ await fs_extra_1.default.writeFile(path_1.default.join(pageDir, 'page.tsx'), pageContent);
62
+ console.log(chalk_1.default.green(`✓ Page generated: app/${normalizedPath}/page.tsx`));
63
+ }
64
+ // 5. Generate Root Landing Page
65
+ await this.generateRootLandingPage([{
66
+ path: fsr.entryPoint.path,
67
+ name: fsr.entryPoint.component || fsr.featureId
68
+ }]);
69
+ console.log(chalk_1.default.blue(`\n✅ Scaffolding complete for ${fsr.featureId}.`));
70
+ console.log(chalk_1.default.gray(`Note: Import paths use "@/components" alias.`));
71
+ }
72
+ async generateRootLandingPage(extraRoutes = []) {
73
+ const usesSrc = fs_extra_1.default.existsSync(path_1.default.join(this.targetDir, 'src'));
74
+ const baseDir = usesSrc ? path_1.default.join(this.targetDir, 'src') : this.targetDir;
75
+ const featuresDir = path_1.default.join(this.targetDir, '.mycontext', 'features');
76
+ let routes = [...extraRoutes];
77
+ if (await fs_extra_1.default.pathExists(featuresDir)) {
78
+ const files = await fs_extra_1.default.readdir(featuresDir);
79
+ for (const file of files) {
80
+ if (file.endsWith('.fsr.json')) {
81
+ try {
82
+ const fData = await fs_extra_1.default.readJson(path_1.default.join(featuresDir, file));
83
+ if (fData.entryPoint && fData.entryPoint.path) {
84
+ // Avoid duplicates
85
+ if (!routes.some(r => r.path === fData.entryPoint.path)) {
86
+ routes.push({
87
+ path: fData.entryPoint.path,
88
+ name: fData.entryPoint.component || fData.featureId
89
+ });
90
+ }
91
+ }
92
+ }
93
+ catch (e) {
94
+ // ignore
95
+ }
96
+ }
97
+ }
98
+ }
99
+ const rootPagePath = path_1.default.join(baseDir, 'app', 'page.tsx');
100
+ await fs_extra_1.default.ensureDir(path_1.default.join(baseDir, 'app'));
101
+ const rootPageContent = (0, nextjs_1.generateRootLandingPageTemplate)(routes);
102
+ await fs_extra_1.default.writeFile(rootPagePath, rootPageContent);
103
+ console.log(chalk_1.default.green(`✓ Root landing page updated: app/page.tsx`));
104
+ }
105
+ }
106
+ exports.DeterministicScaffoldGenerator = DeterministicScaffoldGenerator;
107
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/generator/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { FSRComponent, FSRServerAction, FSRModel, FSRUiRules } from "@myycontext/core";
2
+ export declare const generateNextPageTemplate: (componentName: string, children?: FSRComponent[], uiRules?: FSRUiRules) => string;
3
+ export declare const generateServerComponentTemplate: (component: FSRComponent) => string;
4
+ export declare const generateClientComponentTemplate: (component: FSRComponent) => string;
5
+ export declare const generateServerActionTemplate: (action: FSRServerAction, models?: FSRModel[]) => string;
6
+ export declare const generateTypesTemplate: (models: FSRModel[]) => string;
7
+ export declare const generateRootLandingPageTemplate: (routes: {
8
+ path: string;
9
+ name: string;
10
+ }[]) => string;
11
+ //# sourceMappingURL=nextjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvF,eAAO,MAAM,wBAAwB,GAAI,eAAe,MAAM,EAAE,WAAU,YAAY,EAAO,EAAE,UAAU,UAAU,KAAG,MAmCrH,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,WAAW,YAAY,KAAG,MAgBzE,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,WAAW,YAAY,KAAG,MAsSzE,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,QAAQ,eAAe,EAAE,SAAQ,QAAQ,EAAO,KAAG,MAgB/F,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,QAAQ,QAAQ,EAAE,KAAG,MAU1D,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,QAAQ;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EAAE,KAAG,MA+HxF,CAAC"}
@@ -0,0 +1,499 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateRootLandingPageTemplate = exports.generateTypesTemplate = exports.generateServerActionTemplate = exports.generateClientComponentTemplate = exports.generateServerComponentTemplate = exports.generateNextPageTemplate = void 0;
4
+ const generateNextPageTemplate = (componentName, children = [], uiRules) => {
5
+ const childImports = children.map((c) => `import { ${c.name} } from "@/components/${c.name}";`).join('\n');
6
+ const primaryChildren = children.filter(c => c.weight === 'primary' || !c.weight);
7
+ const secondaryChildren = children.filter(c => c.weight === 'secondary');
8
+ const primaryRender = primaryChildren.map((c) => `<${c.name} />`).join('\n ');
9
+ const secondaryRender = secondaryChildren.map((c) => `<${c.name} />`).join('\n ');
10
+ const layoutContent = secondaryChildren.length > 0
11
+ ? `<div className="grid grid-cols-1 lg:grid-cols-12 gap-12 items-start">
12
+ <div className="lg:col-span-8 flex flex-col gap-12">
13
+ ${primaryRender}
14
+ </div>
15
+ <div className="lg:col-span-4 flex flex-col gap-12">
16
+ ${secondaryRender}
17
+ </div>
18
+ </div>`
19
+ : `<div className="flex flex-col gap-12">
20
+ ${primaryRender}
21
+ </div>`;
22
+ return `import React from 'react';
23
+ ${childImports}
24
+
25
+ export default async function ${componentName}() {
26
+ return (
27
+ <div className="min-h-[calc(100vh-80px)] bg-slate-50/50">
28
+ <main className="max-w-7xl mx-auto px-6 py-16">
29
+ ${layoutContent}
30
+ </main>
31
+ </div>
32
+ );
33
+ }
34
+ `;
35
+ };
36
+ exports.generateNextPageTemplate = generateNextPageTemplate;
37
+ const generateServerComponentTemplate = (component) => {
38
+ const children = component.children || [];
39
+ const childImports = children.map((c) => `import { ${c} } from "@/components/${c}";`).join('\n');
40
+ const childRender = children.map((c) => `<${c} />`).join('\n ');
41
+ return `import React from 'react';
42
+ ${childImports}
43
+
44
+ export function ${component.name}() {
45
+ return (
46
+ <div className="w-full">
47
+ ${childRender}
48
+ </div>
49
+ );
50
+ }
51
+ `;
52
+ };
53
+ exports.generateServerComponentTemplate = generateServerComponentTemplate;
54
+ const generateClientComponentTemplate = (component) => {
55
+ const children = component.children || component.contains || [];
56
+ const childImports = children.map((c) => `import { ${c} } from "@/components/${c}";`).join('\n');
57
+ const childRender = children.map((c) => `<${c} />`).join('\n ');
58
+ const triggerText = component.triggers?.[0] || 'State';
59
+ let stateRender = '';
60
+ let uiRender = '';
61
+ if (component.state?.type === 'local_storage') {
62
+ const isToken = component.state.target === 'user_tokens';
63
+ const modelArray = component.state.model ? `${component.state.model}[]` : 'any[]';
64
+ stateRender = isToken
65
+ ? ` const [tokens, setTokens] = useState<number>(10);
66
+
67
+ useEffect(() => {
68
+ const loadTokens = () => {
69
+ const saved = localStorage.getItem('user_tokens');
70
+ if (saved) setTokens(parseInt(saved));
71
+ else localStorage.setItem('user_tokens', '10');
72
+ };
73
+
74
+ loadTokens();
75
+ window.addEventListener('local-storage-update', loadTokens);
76
+ return () => window.removeEventListener('local-storage-update', loadTokens);
77
+ }, []);`
78
+ : ` const [items, setItems] = useState<${modelArray}>([]);
79
+
80
+ useEffect(() => {
81
+ const loadData = () => {
82
+ const saved = localStorage.getItem('${component.name.toLowerCase()}_data');
83
+ if (saved) setItems(JSON.parse(saved));
84
+ };
85
+
86
+ loadData();
87
+ window.addEventListener('local-storage-update', loadData);
88
+ return () => window.removeEventListener('local-storage-update', loadData);
89
+ }, []);
90
+
91
+ const saveItems = (newItems: ${modelArray}) => {
92
+ setItems(newItems);
93
+ localStorage.setItem('${component.name.toLowerCase()}_data', JSON.stringify(newItems));
94
+ window.dispatchEvent(new Event('local-storage-update'));
95
+ };`;
96
+ uiRender = isToken
97
+ ? ` <div className="bg-white p-6 rounded-3xl border border-slate-200 shadow-sm flex items-center justify-between group hover:border-blue-200 transition-colors">
98
+ <div className="flex items-center gap-4">
99
+ <div className="w-12 h-12 bg-blue-50 rounded-2xl flex items-center justify-center group-hover:scale-110 transition-transform">
100
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" className="text-blue-600"><circle cx="12" cy="12" r="10"/><path d="M12 6v12"/><path d="M6 12h12"/></svg>
101
+ </div>
102
+ <div>
103
+ <p className="text-[10px] font-black uppercase tracking-widening text-slate-400 mb-0.5">Wallet Balance</p>
104
+ <p className="text-slate-900 font-bold leading-none">Token Credits</p>
105
+ </div>
106
+ </div>
107
+ <div className="text-3xl font-black text-blue-600 tracking-tight">
108
+ {tokens}
109
+ </div>
110
+ </div>`
111
+ : ` <div className="mb-4">
112
+ {items.length === 0 ? <p className="text-muted-foreground text-sm">No items found.</p> : (
113
+ <ul className="space-y-2">
114
+ {items.map((item: any) => (
115
+ <li key={item.id} className="p-3 bg-muted rounded flex justify-between">
116
+ <span>{item.title || item.name || 'Item'}</span>
117
+ </li>
118
+ ))}
119
+ </ul>
120
+ )}
121
+ </div>
122
+ <div className="mt-4 pt-4 border-t">
123
+ ${childRender || '<p>Add new items here</p>'}
124
+ </div>`;
125
+ }
126
+ else if (component.state?.type === 'image_uploader') {
127
+ stateRender = ` const [preview, setPreview] = useState<string | null>(null);
128
+
129
+ const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
130
+ const file = e.target.files?.[0];
131
+ if (file) {
132
+ const url = URL.createObjectURL(file);
133
+ setPreview(url);
134
+ window.dispatchEvent(new CustomEvent('image-uploaded', { detail: { url } }));
135
+ }
136
+ };`;
137
+ uiRender = ` <div className="group relative border-2 border-dashed border-slate-200 rounded-3xl p-10 bg-white hover:border-blue-400 hover:bg-blue-50/50 transition-all duration-300 cursor-pointer">
138
+ <input
139
+ type="file"
140
+ accept="image/*"
141
+ onChange={handleFileChange}
142
+ className="absolute inset-0 opacity-0 cursor-pointer z-10"
143
+ />
144
+ <div className="flex flex-col items-center text-center">
145
+ <div className="w-14 h-14 bg-slate-100 rounded-2xl flex items-center justify-center mb-4 group-hover:bg-blue-100 group-hover:scale-110 transition-all">
146
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="text-slate-400 group-hover:text-blue-600"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>
147
+ </div>
148
+ <p className="text-slate-900 font-bold mb-1">Select an Image</p>
149
+ <p className="text-slate-500 text-sm">PNG, JPG or WEBP (Max 5MB)</p>
150
+ </div>
151
+ </div>
152
+
153
+ {preview && (
154
+ <div className="mt-4 p-2 bg-white rounded-2xl border border-slate-100 shadow-sm animate-in fade-in slide-in-from-top-2 duration-300">
155
+ <div className="relative aspect-video rounded-xl overflow-hidden bg-slate-50">
156
+ <img src={preview} alt="Upload Preview" className="w-full h-full object-contain" />
157
+ <div className="absolute top-2 right-2 px-2 py-1 bg-black/60 backdrop-blur-md rounded text-[10px] text-white font-bold uppercase tracking-wider">
158
+ Asset Preview
159
+ </div>
160
+ </div>
161
+ </div>
162
+ )}`;
163
+ }
164
+ else if (component.state?.type === 'asset_processing') {
165
+ const testModeLogic = ` // Test mode fast-forward
166
+ const isTestMode = typeof window !== 'undefined' && (window as any).__MYCONTEXT_TEST_MODE__;
167
+ const timeout = isTestMode ? 100 : 3000;`;
168
+ stateRender = ` const [status, setStatus] = useState<'idle' | 'processing' | 'done'>('idle');
169
+ const [result, setResult] = useState<string | null>(null);
170
+
171
+ useEffect(() => {
172
+ const handleUpload = (e: any) => {
173
+ setStatus('processing');
174
+ ${testModeLogic}
175
+ setTimeout(() => {
176
+ setStatus('done');
177
+ setResult(e.detail.url);
178
+ const tokens = parseInt(localStorage.getItem('user_tokens') || '10');
179
+ localStorage.setItem('user_tokens', Math.max(0, tokens - 1).toString());
180
+ window.dispatchEvent(new Event('local-storage-update'));
181
+ }, timeout);
182
+ };
183
+
184
+ window.addEventListener('image-uploaded', handleUpload);
185
+ return () => window.removeEventListener('image-uploaded', handleUpload);
186
+ }, []);`;
187
+ uiRender = ` <div className="w-full">
188
+ <div className="bg-white rounded-[2.5rem] border border-slate-200 shadow-2xl shadow-blue-900/5 overflow-hidden p-10 mb-12">
189
+ {status === 'processing' && (
190
+ <div className="flex flex-col items-center py-24 bg-blue-50/20 rounded-[2rem] border border-blue-100/30">
191
+ <div className="relative">
192
+ <div className="w-20 h-20 border-4 border-slate-100 border-t-blue-600 rounded-full animate-spin"></div>
193
+ <div className="absolute inset-0 flex items-center justify-center">
194
+ <div className="w-3 h-3 bg-blue-600 rounded-full animate-pulse"></div>
195
+ </div>
196
+ </div>
197
+ <h3 className="mt-8 text-2xl font-black text-slate-900 tracking-tight">Processing Image...</h3>
198
+ <p className="text-slate-500 font-medium mt-2">Deterministic background removal in progress</p>
199
+ </div>
200
+ )}
201
+
202
+ {status === 'done' && result && (
203
+ <div className="space-y-8 animate-in zoom-in-95 duration-700">
204
+ <div className="bg-slate-50 rounded-[2rem] border border-slate-200 relative group overflow-hidden shadow-inner aspect-[4/3] flex items-center justify-center p-8">
205
+ <div className="absolute inset-0 bg-[url('https://www.transparenttextures.com/patterns/checkerboard.png')] opacity-30"></div>
206
+ <img src={result} alt="Result" className="max-w-full max-h-full object-contain rounded-xl shadow-[0_20px_50px_rgba(0,0,0,0.15)] relative z-10 hover:scale-[1.05] transition-transform duration-700" />
207
+ </div>
208
+ <div className="flex flex-col sm:flex-row gap-4">
209
+ <a
210
+ href={result}
211
+ download="removed-bg.png"
212
+ className="flex-1 flex items-center justify-center gap-3 py-5 bg-gradient-to-br from-blue-600 to-indigo-700 text-white font-black rounded-3xl hover:shadow-2xl hover:shadow-blue-500/20 hover:-translate-y-0.5 transition-all active:scale-[0.98]"
213
+ >
214
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/></svg>
215
+ Download Result
216
+ </a>
217
+ <button
218
+ onClick={() => setStatus('idle')}
219
+ className="px-10 py-5 bg-slate-100 text-slate-600 font-bold rounded-3xl hover:bg-slate-200 transition-all border border-slate-200/50"
220
+ >
221
+ Clear Asset
222
+ </button>
223
+ </div>
224
+ </div>
225
+ )}
226
+
227
+ {status === 'idle' && (
228
+ <div className="flex flex-col items-center py-32 bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-blue-50/50 via-white to-white border-2 border-dashed border-slate-200 rounded-[2rem]">
229
+ <div className="w-20 h-20 bg-blue-50 rounded-3xl flex items-center justify-center mb-8 shadow-sm">
230
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="text-blue-600"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" x2="12" y1="3" y2="15"/></svg>
231
+ </div>
232
+ <h2 className="text-3xl font-black text-slate-900 mb-2">Ready to Scaffold</h2>
233
+ <p className="text-slate-500 max-w-[320px] text-center font-medium leading-relaxed">
234
+ Upload your image below to see the deterministic removal logic in action.
235
+ </p>
236
+ </div>
237
+ )}
238
+ </div>
239
+
240
+ <div className="grid grid-cols-1 lg:grid-cols-12 gap-8 items-start">
241
+ <div className="lg:col-span-8 flex flex-col gap-8">
242
+ ${childRender.split('\n').filter(line => line.includes('Uploader') || line.includes('Preview')).join('\n ')}
243
+ </div>
244
+ <div className="lg:col-span-4 flex flex-col gap-8">
245
+ ${childRender.split('\n').filter(line => !line.includes('Uploader') && !line.includes('Preview')).join('\n ')}
246
+ </div>
247
+ </div>
248
+ </div>`;
249
+ }
250
+ else if (component.state?.type === 'local_storage_form') {
251
+ const targetKey = component.state.target || 'data';
252
+ stateRender = ` const [title, setTitle] = useState('');
253
+
254
+ const handleSubmit = (e: React.FormEvent) => {
255
+ e.preventDefault();
256
+ if (!title.trim()) return;
257
+
258
+ const saved = localStorage.getItem('${targetKey}');
259
+ const items = saved ? JSON.parse(saved) : [];
260
+
261
+ const newItem = {
262
+ id: Math.random().toString(36).substring(7),
263
+ title: title.trim(),
264
+ completed: false,
265
+ createdAt: new Date().toISOString()
266
+ };
267
+
268
+ localStorage.setItem('${targetKey}', JSON.stringify([...items, newItem]));
269
+ window.dispatchEvent(new Event('local-storage-update'));
270
+ setTitle('');
271
+ };`;
272
+ uiRender = ` <form onSubmit={handleSubmit} className="flex flex-col gap-4">
273
+ <div>
274
+ <label className="block text-sm font-medium mb-1">New Item</label>
275
+ <input
276
+ type="text"
277
+ value={title}
278
+ onChange={(e) => setTitle(e.target.value)}
279
+ className="w-full p-2 border rounded-md"
280
+ placeholder="What needs to be done?"
281
+ required
282
+ />
283
+ </div>
284
+ <button
285
+ type="submit"
286
+ className="px-4 py-2 bg-primary text-primary-foreground rounded-md shadow hover:bg-primary/90 transition-colors w-full"
287
+ >
288
+ Add Item
289
+ </button>
290
+ </form>`;
291
+ }
292
+ else if (component.props && Object.keys(component.props).length > 0) {
293
+ // Props-only component (stateless/visual)
294
+ const propsList = Object.keys(component.props).join(', ');
295
+ stateRender = '';
296
+ const isImage = component.name.toLowerCase().includes('image') || component.props.src;
297
+ uiRender = isImage
298
+ ? ` <div className="rounded-2xl overflow-hidden bg-slate-100 border border-slate-200">
299
+ {props.src ? <img src={props.src} alt="Preview" className="w-full h-auto" /> : <div className="p-10 text-center text-slate-400">No Image provided</div>}
300
+ </div>`
301
+ : ` <div className="p-4 bg-slate-50 rounded-xl border border-dashed border-slate-200 text-sm text-slate-500">
302
+ ${component.name} displaying: {JSON.stringify(props)}
303
+ </div>`;
304
+ return `"use client";\n\nimport React from 'react';\n${childImports}\n
305
+ export function ${component.name}(props: any) {
306
+ return (
307
+ <div className="w-full animate-in fade-in duration-500">
308
+ ${uiRender}
309
+ ${childRender}
310
+ </div>
311
+ );
312
+ }
313
+ `;
314
+ }
315
+ else {
316
+ // Default dummy template
317
+ stateRender = ` const [isOpen, setIsOpen] = useState(false);`;
318
+ uiRender = ` <button
319
+ onClick={() => setIsOpen(!isOpen)}
320
+ className="px-6 py-3 bg-white border border-slate-200 text-slate-700 font-bold rounded-2xl shadow-sm hover:bg-slate-50 transition-all active:scale-95"
321
+ >
322
+ Toggle ${triggerText}
323
+ </button>
324
+
325
+ {isOpen && (
326
+ <div className="mt-4 p-6 border rounded-3xl bg-slate-50/50 animate-in slide-in-from-top-2 duration-300">
327
+ ${childRender || '<p className="text-sm text-slate-500">Content triggered for demo purposes.</p>'}
328
+ </div>
329
+ )}`;
330
+ }
331
+ return `"use client";\n\nimport React, { useState, useEffect } from 'react';\n${childImports}\n
332
+ export function ${component.name}() {
333
+ ${stateRender}
334
+
335
+ return (
336
+ <div className="w-full animate-in fade-in duration-700">
337
+ ${uiRender}
338
+ </div>
339
+ );
340
+ }
341
+ `;
342
+ };
343
+ exports.generateClientComponentTemplate = generateClientComponentTemplate;
344
+ const generateServerActionTemplate = (action, models = []) => {
345
+ // Very simplistic strict-typed template
346
+ return `"use server";
347
+
348
+ import { revalidatePath } from "next/cache";
349
+
350
+ export async function ${action.name}(formData: FormData) {
351
+ // Auto-generated server action
352
+ console.log("Action called: ${action.name}");
353
+
354
+ // TODO: Implement InstantDB or other ORM logic here based on inputs
355
+
356
+ revalidatePath("/");
357
+ return { success: true };
358
+ }
359
+ `;
360
+ };
361
+ exports.generateServerActionTemplate = generateServerActionTemplate;
362
+ const generateTypesTemplate = (models) => {
363
+ const typeDefs = models.map(m => {
364
+ const fields = Object.entries(m.fields).map(([fname, fdef]) => {
365
+ const tsType = typeof fdef === 'string' ? fdef : fdef.type;
366
+ return ` ${fname}: ${tsType};`;
367
+ }).join('\n');
368
+ return `export interface ${m.name} {\n${fields}\n}`;
369
+ }).join('\n\n');
370
+ return `// Auto-generated Application Types\n\n${typeDefs}\n`;
371
+ };
372
+ exports.generateTypesTemplate = generateTypesTemplate;
373
+ const generateRootLandingPageTemplate = (routes) => {
374
+ const links = routes.map(r => ` <li key="${r.path}">
375
+ <Link href="${r.path}" className="text-slate-600 hover:text-blue-600 transition-all hover:translate-x-1 inline-block">
376
+ ${r.name}
377
+ </Link>
378
+ </li>`).join('\n');
379
+ const primaryAction = routes.length > 0 && routes[0] ? `
380
+ <Link href="${routes[0].path}" className="px-8 py-4 bg-gradient-to-r from-blue-600 to-indigo-600 text-white font-bold rounded-2xl shadow-xl hover:shadow-2xl hover:scale-105 transition-all transform active:scale-95">
381
+ Get Started: ${routes[0].name}
382
+ </Link>` : '';
383
+ const routeCards = routes.map(r => `
384
+ <Link href="${r.path}" className="group p-6 bg-white/80 backdrop-blur-sm border border-slate-200 rounded-3xl shadow-sm hover:shadow-xl hover:border-blue-200 transition-all transform hover:-translate-y-1">
385
+ <div className="w-12 h-12 bg-blue-100 rounded-2xl flex items-center justify-center mb-4 group-hover:scale-110 transition-transform">
386
+ <span className="text-blue-600 text-xl font-bold">${r.name.charAt(0)}</span>
387
+ </div>
388
+ <h3 className="text-lg font-bold text-slate-800 mb-1 group-hover:text-blue-600 transition-colors">${r.name}</h3>
389
+ <p className="text-sm text-slate-500">Explore the ${r.name} feature scaffolded by MyContext.</p>
390
+ </Link>`).join('\n');
391
+ return `import Link from 'next/link';
392
+ import React from 'react';
393
+
394
+ export default function Home() {
395
+ return (
396
+ <div className="min-h-screen bg-[radial-gradient(ellipse_at_top_left,_var(--tw-gradient-stops))] from-slate-50 via-white to-blue-50 flex flex-col font-sans selection:bg-blue-100 selection:text-blue-900">
397
+ <header className="w-full bg-white/70 backdrop-blur-md border-b border-slate-200/50 px-8 py-5 flex justify-between items-center sticky top-0 z-50">
398
+ <div className="flex items-center gap-3">
399
+ <div className="w-10 h-10 bg-gradient-to-br from-blue-600 to-indigo-700 rounded-xl shadow-lg flex items-center justify-center">
400
+ <span className="text-white font-black text-xl">M</span>
401
+ </div>
402
+ <div className="font-black text-2xl text-slate-800 tracking-tight">
403
+ MyContext <span className="text-blue-600">Scaffold</span>
404
+ </div>
405
+ </div>
406
+ <nav>
407
+ <ul className="flex space-x-8 list-none m-0 p-0 text-sm font-semibold">
408
+ <li>
409
+ <Link href="/" className="text-blue-600">
410
+ Overview
411
+ </Link>
412
+ </li>
413
+ <li className="text-slate-300">/</li>
414
+ <li>
415
+ <Link href="https://github.com/farajabien/mycontext-cli" target="_blank" className="text-slate-500 hover:text-slate-800 transition-colors">
416
+ GitHub
417
+ </Link>
418
+ </li>
419
+ </ul>
420
+ </nav>
421
+ </header>
422
+
423
+ <main className="flex-1 max-w-7xl mx-auto w-full px-8 py-20">
424
+ <div className="flex flex-col items-center text-center mb-20 animate-in fade-in slide-in-from-bottom-4 duration-1000">
425
+ <div className="inline-flex items-center gap-2 px-4 py-2 bg-blue-50 text-blue-700 rounded-full text-xs font-bold uppercase tracking-widest mb-8 border border-blue-100">
426
+ <span className="relative flex h-2 w-2">
427
+ <span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-blue-400 opacity-75"></span>
428
+ <span className="relative inline-flex rounded-full h-2 w-2 bg-blue-500"></span>
429
+ </span>
430
+ DS-NLC Compiler Phase 0.5
431
+ </div>
432
+
433
+ <h1 className="text-7xl font-black text-slate-900 mb-8 leading-[1.1] tracking-tight max-w-4xl">
434
+ Build with <span className="text-transparent bg-clip-text bg-gradient-to-r from-blue-600 to-indigo-600">Pure Intent.</span> <br/>
435
+ Zero Hallucination.
436
+ </h1>
437
+
438
+ <p className="text-xl text-slate-500 mb-12 leading-relaxed max-w-2xl font-medium">
439
+ Generated deterministically. This application is a direct reflection of your FSR manifest.
440
+ High-fidelity logic, premium UI, 100% TypeScript safety.
441
+ </p>
442
+
443
+ <div className="flex flex-wrap gap-6 justify-center">
444
+ ${primaryAction}
445
+ <a href="https://github.com/farajabien/mycontext-cli" target="_blank" rel="noreferrer" className="px-8 py-4 bg-white text-slate-700 border border-slate-200 font-bold rounded-2xl shadow-sm hover:bg-slate-50 hover:shadow-md transition-all active:scale-95">
446
+ Source Code
447
+ </a>
448
+ </div>
449
+ </div>
450
+
451
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 mb-20">
452
+ ${routeCards}
453
+ </div>
454
+
455
+ <div className="bg-slate-900 rounded-[3rem] p-12 text-center relative overflow-hidden group">
456
+ <div className="absolute inset-0 bg-blue-500/10 opacity-0 group-hover:opacity-100 transition-opacity duration-700"></div>
457
+ <h3 className="text-3xl font-bold text-white mb-4 relative z-10">Production-Ready Scaffolding</h3>
458
+ <p className="text-slate-400 max-w-xl mx-auto mb-8 relative z-10 font-medium text-lg">
459
+ Every component is atomically generated and strictly typed.
460
+ Ready for scale from the first second.
461
+ </p>
462
+ <div className="flex justify-center gap-12 relative z-10">
463
+ <div className="flex flex-col items-center">
464
+ <span className="text-white font-bold text-2xl">100%</span>
465
+ <span className="text-slate-500 text-xs">Type Safety</span>
466
+ </div>
467
+ <div className="w-px h-10 bg-slate-800"></div>
468
+ <div className="flex flex-col items-center">
469
+ <span className="text-white font-bold text-2xl">0ms</span>
470
+ <span className="text-slate-500 text-xs">Hallucination</span>
471
+ </div>
472
+ <div className="w-px h-10 bg-slate-800"></div>
473
+ <div className="flex flex-col items-center">
474
+ <span className="text-white font-bold text-2xl">FAST</span>
475
+ <span className="text-slate-500 text-xs">Deterministic</span>
476
+ </div>
477
+ </div>
478
+ </div>
479
+ </main>
480
+
481
+ <footer className="w-full bg-white/50 border-t border-slate-200 p-10 mt-auto">
482
+ <div className="max-w-7xl mx-auto flex flex-col md:flex-row justify-between items-center gap-6">
483
+ <div className="text-slate-400 text-sm font-medium">
484
+ Generated by MyContext DS-NLC Compiler © ${new Date().getFullYear()}
485
+ </div>
486
+ <div className="flex gap-8 text-sm font-semibold text-slate-500">
487
+ <Link href="https://mycontext.framer.website" className="hover:text-blue-600 transition-colors">Documentation</Link>
488
+ <Link href="https://github.com/farajabien" className="hover:text-blue-600 transition-colors">Creator</Link>
489
+ <Link href="https://x.com/farajabien" className="hover:text-blue-600 transition-colors">Updates</Link>
490
+ </div>
491
+ </div>
492
+ </footer>
493
+ </div>
494
+ );
495
+ }
496
+ `;
497
+ };
498
+ exports.generateRootLandingPageTemplate = generateRootLandingPageTemplate;
499
+ //# sourceMappingURL=nextjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../../src/generator/templates/nextjs.ts"],"names":[],"mappings":"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"}