mycontext-cli 4.2.7 → 4.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +10 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +19 -60
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init-interactive.d.ts +20 -0
- package/dist/commands/init-interactive.d.ts.map +1 -1
- package/dist/commands/init-interactive.js +168 -5
- package/dist/commands/init-interactive.js.map +1 -1
- package/dist/config/shadcn-catalog.json +93 -0
- package/dist/core/brain/BrainClient.d.ts +1 -1
- package/dist/core/brain/BrainClient.d.ts.map +1 -1
- package/dist/core/brain/BrainClient.js +5 -5
- package/dist/core/brain/BrainClient.js.map +1 -1
- package/dist/doctor/DoctorEngine.d.ts.map +1 -1
- package/dist/doctor/DoctorEngine.js +21 -11
- package/dist/doctor/DoctorEngine.js.map +1 -1
- package/dist/doctor/rules/dead-code-rules.d.ts.map +1 -1
- package/dist/doctor/rules/dead-code-rules.js +33 -0
- package/dist/doctor/rules/dead-code-rules.js.map +1 -1
- package/dist/doctor/rules/instantdb-rules.d.ts.map +1 -1
- package/dist/doctor/rules/instantdb-rules.js +278 -69
- package/dist/doctor/rules/instantdb-rules.js.map +1 -1
- package/dist/doctor/rules/nextjs-rules.d.ts.map +1 -1
- package/dist/doctor/rules/nextjs-rules.js +53 -3
- package/dist/doctor/rules/nextjs-rules.js.map +1 -1
- package/dist/package.json +4 -2
- package/dist/services/ComponentInferenceEngine.d.ts +66 -0
- package/dist/services/ComponentInferenceEngine.d.ts.map +1 -0
- package/dist/services/ComponentInferenceEngine.js +302 -0
- package/dist/services/ComponentInferenceEngine.js.map +1 -0
- package/dist/services/ComponentRegistry.d.ts +61 -0
- package/dist/services/ComponentRegistry.d.ts.map +1 -0
- package/dist/services/ComponentRegistry.js +128 -0
- package/dist/services/ComponentRegistry.js.map +1 -0
- package/dist/services/InferenceEngine.js +1 -1
- package/dist/services/ProjectScanner.d.ts.map +1 -1
- package/dist/services/ProjectScanner.js +18 -1
- package/dist/services/ProjectScanner.js.map +1 -1
- package/dist/services/ScaffoldEngine.d.ts +87 -0
- package/dist/services/ScaffoldEngine.d.ts.map +1 -0
- package/dist/services/ScaffoldEngine.js +409 -0
- package/dist/services/ScaffoldEngine.js.map +1 -0
- package/dist/services/ScaffoldPreview.d.ts +62 -0
- package/dist/services/ScaffoldPreview.d.ts.map +1 -0
- package/dist/services/ScaffoldPreview.js +292 -0
- package/dist/services/ScaffoldPreview.js.map +1 -0
- package/dist/services/TemplateEngine.d.ts +136 -0
- package/dist/services/TemplateEngine.d.ts.map +1 -0
- package/dist/services/TemplateEngine.js +483 -0
- package/dist/services/TemplateEngine.js.map +1 -0
- package/dist/services/TemplateHelpers.d.ts +9 -0
- package/dist/services/TemplateHelpers.d.ts.map +1 -0
- package/dist/services/TemplateHelpers.js +212 -0
- package/dist/services/TemplateHelpers.js.map +1 -0
- package/dist/templates/actions/auth-actions.ts.hbs +140 -0
- package/dist/templates/actions/crud-actions.ts.hbs +113 -0
- package/dist/templates/components/auth/login-form.tsx.hbs +67 -0
- package/dist/templates/components/auth/login-skeleton.tsx.hbs +24 -0
- package/dist/templates/components/auth/register-form.tsx.hbs +116 -0
- package/dist/templates/components/crud/entity-card.tsx.hbs +71 -0
- package/dist/templates/components/crud/entity-form.tsx.hbs +158 -0
- package/dist/templates/components/crud/entity-skeleton.tsx.hbs +90 -0
- package/dist/templates/components/crud/entity-table.tsx.hbs +129 -0
- package/dist/templates/components/ui/button.tsx.hbs +53 -0
- package/dist/templates/components/ui/card.tsx.hbs +68 -0
- package/dist/templates/components/ui/input.tsx.hbs +33 -0
- package/dist/templates/components/ui/label.tsx.hbs +20 -0
- package/dist/templates/components/ui/skeleton.tsx.hbs +15 -0
- package/dist/templates/components/ui/theme-provider.tsx.hbs +66 -0
- package/dist/templates/components/ui/theme-toggle.tsx.hbs +30 -0
- package/dist/templates/config/app.css.hbs +150 -0
- package/dist/templates/layouts/dashboard-layout.tsx.hbs +69 -0
- package/dist/templates/layouts/error.tsx.hbs +51 -0
- package/dist/templates/layouts/loading.tsx.hbs +22 -0
- package/dist/templates/layouts/not-found.tsx.hbs +24 -0
- package/dist/templates/layouts/root-layout.tsx.hbs +40 -0
- package/dist/templates/lib/instant.ts.hbs +19 -0
- package/dist/templates/lib/utils.ts.hbs +24 -0
- package/dist/templates/pages/auth/login-page.tsx.hbs +30 -0
- package/dist/templates/pages/auth/register-page.tsx.hbs +38 -0
- package/dist/templates/pages/crud/create-page.tsx.hbs +42 -0
- package/dist/templates/pages/crud/detail-page.tsx.hbs +90 -0
- package/dist/templates/pages/crud/list-page.tsx.hbs +60 -0
- package/dist/templates/pages/crud/loading.tsx.hbs +13 -0
- package/dist/templates/pages/landing-page.tsx.hbs +111 -0
- package/dist/types/asl.d.ts +1 -1
- package/dist/types/asl.d.ts.map +1 -1
- package/dist/types/living-context.d.ts +1 -1
- package/dist/types/living-context.d.ts.map +1 -1
- package/dist/utils/FileGenerator.js +3 -3
- package/dist/utils/FileGenerator.js.map +1 -1
- package/dist/utils/generateTypesFromSchema.d.ts +47 -0
- package/dist/utils/generateTypesFromSchema.d.ts.map +1 -0
- package/dist/utils/generateTypesFromSchema.js +298 -0
- package/dist/utils/generateTypesFromSchema.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ASL } from "../types/asl";
|
|
2
|
+
export interface ScaffoldManifest {
|
|
3
|
+
fileTree: string;
|
|
4
|
+
componentsSummary: {
|
|
5
|
+
shadcn: string[];
|
|
6
|
+
custom: number;
|
|
7
|
+
};
|
|
8
|
+
features: string[];
|
|
9
|
+
totalFiles: number;
|
|
10
|
+
estimatedTime: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* ScaffoldPreview - Generate human-readable preview of scaffold output
|
|
14
|
+
*
|
|
15
|
+
* Shows users exactly what will be generated before running scaffold:
|
|
16
|
+
* - Complete file tree with descriptions
|
|
17
|
+
* - Component counts and types
|
|
18
|
+
* - Feature list
|
|
19
|
+
* - Estimated generation time
|
|
20
|
+
*/
|
|
21
|
+
export declare class ScaffoldPreview {
|
|
22
|
+
private asl;
|
|
23
|
+
private componentInference;
|
|
24
|
+
constructor(asl: ASL);
|
|
25
|
+
/**
|
|
26
|
+
* Generate complete scaffold manifest for user review
|
|
27
|
+
*/
|
|
28
|
+
generateManifest(): ScaffoldManifest;
|
|
29
|
+
/**
|
|
30
|
+
* Build visual file tree showing all generated files
|
|
31
|
+
*/
|
|
32
|
+
private buildFileTree;
|
|
33
|
+
/**
|
|
34
|
+
* Summarize shadCN and custom components
|
|
35
|
+
*/
|
|
36
|
+
private summarizeComponents;
|
|
37
|
+
/**
|
|
38
|
+
* List all features that will be generated
|
|
39
|
+
*/
|
|
40
|
+
private listFeatures;
|
|
41
|
+
/**
|
|
42
|
+
* Count total files that will be generated
|
|
43
|
+
*/
|
|
44
|
+
private countFiles;
|
|
45
|
+
/**
|
|
46
|
+
* Count custom components (non-shadCN)
|
|
47
|
+
*/
|
|
48
|
+
private countCustomComponents;
|
|
49
|
+
/**
|
|
50
|
+
* Estimate generation time based on complexity
|
|
51
|
+
*/
|
|
52
|
+
private estimateTime;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a page path is an entity page
|
|
55
|
+
*/
|
|
56
|
+
private isEntityPage;
|
|
57
|
+
/**
|
|
58
|
+
* Format and display the complete preview
|
|
59
|
+
*/
|
|
60
|
+
display(): void;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ScaffoldPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScaffoldPreview.d.ts","sourceRoot":"","sources":["../../src/services/ScaffoldPreview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAwC,MAAM,cAAc,CAAC;AAIzE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAGd,OAAO,CAAC,GAAG;IAFvB,OAAO,CAAC,kBAAkB,CAA2B;gBAEjC,GAAG,EAAE,GAAG;IAI5B;;OAEG;IACH,gBAAgB,IAAI,gBAAgB;IAgBpC;;OAEG;IACH,OAAO,CAAC,aAAa;IA6HrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkCpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA6ClB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAehB"}
|
|
@@ -0,0 +1,292 @@
|
|
|
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.ScaffoldPreview = void 0;
|
|
7
|
+
const ComponentInferenceEngine_1 = require("./ComponentInferenceEngine");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
/**
|
|
10
|
+
* ScaffoldPreview - Generate human-readable preview of scaffold output
|
|
11
|
+
*
|
|
12
|
+
* Shows users exactly what will be generated before running scaffold:
|
|
13
|
+
* - Complete file tree with descriptions
|
|
14
|
+
* - Component counts and types
|
|
15
|
+
* - Feature list
|
|
16
|
+
* - Estimated generation time
|
|
17
|
+
*/
|
|
18
|
+
class ScaffoldPreview {
|
|
19
|
+
constructor(asl) {
|
|
20
|
+
this.asl = asl;
|
|
21
|
+
this.componentInference = new ComponentInferenceEngine_1.ComponentInferenceEngine();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate complete scaffold manifest for user review
|
|
25
|
+
*/
|
|
26
|
+
generateManifest() {
|
|
27
|
+
const fileTree = this.buildFileTree();
|
|
28
|
+
const componentsSummary = this.summarizeComponents();
|
|
29
|
+
const features = this.listFeatures();
|
|
30
|
+
const totalFiles = this.countFiles();
|
|
31
|
+
const estimatedTime = this.estimateTime();
|
|
32
|
+
return {
|
|
33
|
+
fileTree,
|
|
34
|
+
componentsSummary,
|
|
35
|
+
features,
|
|
36
|
+
totalFiles,
|
|
37
|
+
estimatedTime
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build visual file tree showing all generated files
|
|
42
|
+
*/
|
|
43
|
+
buildFileTree() {
|
|
44
|
+
const lines = [];
|
|
45
|
+
lines.push(`Project Structure (${this.countFiles()} files):`);
|
|
46
|
+
lines.push('├── app/');
|
|
47
|
+
// Auth routes (if auth configured)
|
|
48
|
+
if (this.asl.auth) {
|
|
49
|
+
const providerText = Array.isArray(this.asl.auth.provider)
|
|
50
|
+
? this.asl.auth.provider.join(' + ')
|
|
51
|
+
: this.asl.auth.provider;
|
|
52
|
+
lines.push('│ ├── (auth)/');
|
|
53
|
+
lines.push('│ │ ├── login/page.tsx ' + chalk_1.default.gray('[Auth form with ' + providerText + ' provider]'));
|
|
54
|
+
lines.push('│ │ └── register/page.tsx ' + chalk_1.default.gray('[Registration flow]'));
|
|
55
|
+
}
|
|
56
|
+
// Dashboard routes (protected)
|
|
57
|
+
lines.push('│ ├── (dashboard)/');
|
|
58
|
+
lines.push('│ │ ├── layout.tsx ' + chalk_1.default.gray('[Protected layout with RBAC]'));
|
|
59
|
+
// Entity routes
|
|
60
|
+
if (this.asl.entities) {
|
|
61
|
+
const entityEntries = Object.entries(this.asl.entities);
|
|
62
|
+
entityEntries.forEach(([entityName, entity], index) => {
|
|
63
|
+
const entityLower = entityName.toLowerCase();
|
|
64
|
+
const isLast = index === entityEntries.length - 1;
|
|
65
|
+
const prefix = isLast ? '│ │ └── ' : '│ │ ├── ';
|
|
66
|
+
lines.push(prefix + entityLower + 's/');
|
|
67
|
+
lines.push(prefix.replace('└── ', ' ').replace('├── ', '│ ') + '├── page.tsx ' + chalk_1.default.gray(`[${entityName}List with table]`));
|
|
68
|
+
lines.push(prefix.replace('└── ', ' ').replace('├── ', '│ ') + '├── [id]/page.tsx ' + chalk_1.default.gray(`[${entityName}Detail view]`));
|
|
69
|
+
lines.push(prefix.replace('└── ', ' ').replace('├── ', '│ ') + '└── new/page.tsx ' + chalk_1.default.gray(`[${entityName}Form]`));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Additional pages
|
|
73
|
+
const customPages = this.asl.pages.filter(p => !this.isEntityPage(p.path) && p.path !== '/' && p.path !== '/dashboard');
|
|
74
|
+
customPages.forEach((page, index) => {
|
|
75
|
+
const isLast = index === customPages.length - 1;
|
|
76
|
+
const prefix = isLast ? '│ │ └── ' : '│ │ ├── ';
|
|
77
|
+
lines.push(prefix + page.path.substring(1) + '/page.tsx ' + chalk_1.default.gray(`[${page.name}]`));
|
|
78
|
+
});
|
|
79
|
+
lines.push('│ └── page.tsx ' + chalk_1.default.gray('[Public landing page]'));
|
|
80
|
+
// Components
|
|
81
|
+
lines.push('├── components/');
|
|
82
|
+
// shadCN components
|
|
83
|
+
const shadcnComps = this.componentInference.inferNeededComponents(this.asl);
|
|
84
|
+
lines.push('│ ├── ui/ ' + chalk_1.default.gray(`[${shadcnComps.length} shadCN components]`));
|
|
85
|
+
shadcnComps.slice(0, 5).forEach((comp, index) => {
|
|
86
|
+
lines.push('│ │ ├── ' + comp + '.tsx');
|
|
87
|
+
});
|
|
88
|
+
if (shadcnComps.length > 5) {
|
|
89
|
+
lines.push('│ │ └── ... (' + (shadcnComps.length - 5) + ' more)');
|
|
90
|
+
}
|
|
91
|
+
// Auth components
|
|
92
|
+
if (this.asl.auth) {
|
|
93
|
+
lines.push('│ ├── auth/');
|
|
94
|
+
lines.push('│ │ ├── LoginForm.tsx ' + chalk_1.default.gray('[Email/password form]'));
|
|
95
|
+
lines.push('│ │ └── RegisterForm.tsx');
|
|
96
|
+
}
|
|
97
|
+
// Entity components
|
|
98
|
+
if (this.asl.entities) {
|
|
99
|
+
const entityEntries = Object.entries(this.asl.entities);
|
|
100
|
+
entityEntries.forEach(([entityName, entity], index) => {
|
|
101
|
+
const entityLower = entityName.toLowerCase();
|
|
102
|
+
const isLast = index === entityEntries.length - 1;
|
|
103
|
+
const prefix = isLast ? '│ └── ' : '│ ├── ';
|
|
104
|
+
lines.push(prefix + entityLower + 's/');
|
|
105
|
+
lines.push(prefix.replace('└── ', ' ').replace('├── ', '│ ') + '├── ' + entityName + 'Card.tsx');
|
|
106
|
+
lines.push(prefix.replace('└── ', ' ').replace('├── ', '│ ') + '├── ' + entityName + 'Form.tsx');
|
|
107
|
+
lines.push(prefix.replace('└── ', ' ').replace('├── ', '│ ') + '└── ' + entityName + 'List.tsx');
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Actions
|
|
111
|
+
lines.push('├── actions/');
|
|
112
|
+
if (this.asl.auth) {
|
|
113
|
+
lines.push('│ ├── auth.ts ' + chalk_1.default.gray('[login, register, logout]'));
|
|
114
|
+
}
|
|
115
|
+
if (this.asl.entities) {
|
|
116
|
+
const entityEntries = Object.entries(this.asl.entities);
|
|
117
|
+
entityEntries.forEach(([entityName, entity], index) => {
|
|
118
|
+
const entityLower = entityName.toLowerCase();
|
|
119
|
+
const isLast = index === entityEntries.length - 1 && !this.asl.auth;
|
|
120
|
+
const prefix = isLast ? '│ └── ' : '│ ├── ';
|
|
121
|
+
lines.push(prefix + entityLower + 's.ts ' + chalk_1.default.gray('[CRUD with RBAC checks]'));
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Lib
|
|
125
|
+
lines.push('├── lib/');
|
|
126
|
+
if (this.asl.permissions && this.asl.permissions.length > 0) {
|
|
127
|
+
lines.push('│ ├── guards/');
|
|
128
|
+
lines.push('│ │ ├── withAuth.tsx ' + chalk_1.default.gray('[Protected route HOC]'));
|
|
129
|
+
lines.push('│ │ └── withRole.tsx ' + chalk_1.default.gray('[Role-based access]'));
|
|
130
|
+
lines.push('│ ├── instant.ts ' + chalk_1.default.gray('[InstantDB client]'));
|
|
131
|
+
lines.push('│ └── permissions.ts ' + chalk_1.default.gray('[RBAC helpers]'));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
lines.push('│ └── instant.ts ' + chalk_1.default.gray('[InstantDB client]'));
|
|
135
|
+
}
|
|
136
|
+
// Types
|
|
137
|
+
lines.push('├── types/');
|
|
138
|
+
lines.push('│ └── schema.ts ' + chalk_1.default.gray('[TypeScript types from schema]'));
|
|
139
|
+
// Root files
|
|
140
|
+
const entityCount = this.asl.entities ? Object.keys(this.asl.entities).length : 0;
|
|
141
|
+
lines.push('├── instant.schema.ts ' + chalk_1.default.gray(`[InstantDB schema - ${entityCount} entities]`));
|
|
142
|
+
if (this.asl.permissions && this.asl.permissions.length > 0) {
|
|
143
|
+
lines.push('├── middleware.ts ' + chalk_1.default.gray('[Route protection]'));
|
|
144
|
+
}
|
|
145
|
+
lines.push('└── .env.local.example ' + chalk_1.default.gray('[InstantDB + auth keys]'));
|
|
146
|
+
return lines.join('\n');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Summarize shadCN and custom components
|
|
150
|
+
*/
|
|
151
|
+
summarizeComponents() {
|
|
152
|
+
const shadcnComps = this.componentInference.inferNeededComponents(this.asl);
|
|
153
|
+
const customComps = this.countCustomComponents();
|
|
154
|
+
return {
|
|
155
|
+
shadcn: shadcnComps,
|
|
156
|
+
custom: customComps
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* List all features that will be generated
|
|
161
|
+
*/
|
|
162
|
+
listFeatures() {
|
|
163
|
+
const features = [];
|
|
164
|
+
// Auth
|
|
165
|
+
if (this.asl.auth) {
|
|
166
|
+
const providers = Array.isArray(this.asl.auth.provider)
|
|
167
|
+
? this.asl.auth.provider.map(p => p === 'email' ? 'Email/password' : p.replace('-', ' ')).join(', ')
|
|
168
|
+
: (this.asl.auth.provider === 'email' ? 'Email/password' : this.asl.auth.provider.replace('-', ' '));
|
|
169
|
+
features.push(`✓ ${providers} authentication`);
|
|
170
|
+
}
|
|
171
|
+
// RBAC
|
|
172
|
+
if (this.asl.permissions && this.asl.permissions.length > 0) {
|
|
173
|
+
const roles = [...new Set(this.asl.permissions.map(p => p.role))];
|
|
174
|
+
features.push(`✓ Role-based access control (${roles.join(', ')})`);
|
|
175
|
+
}
|
|
176
|
+
// CRUD
|
|
177
|
+
features.push(`✓ CRUD operations for all entities`);
|
|
178
|
+
// Route protection
|
|
179
|
+
if (this.asl.permissions && this.asl.permissions.length > 0) {
|
|
180
|
+
features.push(`✓ Protected routes with middleware`);
|
|
181
|
+
}
|
|
182
|
+
// Type safety
|
|
183
|
+
features.push(`✓ Type-safe database operations`);
|
|
184
|
+
// Server actions
|
|
185
|
+
features.push(`✓ Server actions with permissions`);
|
|
186
|
+
return features;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Count total files that will be generated
|
|
190
|
+
*/
|
|
191
|
+
countFiles() {
|
|
192
|
+
let count = 0;
|
|
193
|
+
// Base structure
|
|
194
|
+
count += 3; // instant.schema.ts, .env.example, middleware.ts (if RBAC)
|
|
195
|
+
// Auth pages
|
|
196
|
+
if (this.asl.auth) {
|
|
197
|
+
count += 2; // login, register
|
|
198
|
+
count += 2; // LoginForm, RegisterForm
|
|
199
|
+
count += 1; // auth actions
|
|
200
|
+
}
|
|
201
|
+
// Entity pages and components
|
|
202
|
+
if (this.asl.entities) {
|
|
203
|
+
const entityCount = Object.keys(this.asl.entities).length;
|
|
204
|
+
count += entityCount * 7; // 3 pages + 3 components + 1 actions file per entity
|
|
205
|
+
}
|
|
206
|
+
// Custom pages
|
|
207
|
+
const customPages = this.asl.pages.filter(p => !this.isEntityPage(p.path) && p.path !== '/' && p.path !== '/dashboard');
|
|
208
|
+
count += customPages.length;
|
|
209
|
+
// Guards and lib
|
|
210
|
+
if (this.asl.permissions && this.asl.permissions.length > 0) {
|
|
211
|
+
count += 3; // withAuth, withRole, permissions.ts
|
|
212
|
+
}
|
|
213
|
+
count += 1; // instant.ts
|
|
214
|
+
// Types
|
|
215
|
+
count += 1; // schema.ts
|
|
216
|
+
// shadCN components
|
|
217
|
+
const shadcnComps = this.componentInference.inferNeededComponents(this.asl);
|
|
218
|
+
count += shadcnComps.length;
|
|
219
|
+
// Layouts
|
|
220
|
+
count += 1; // dashboard layout
|
|
221
|
+
count += 1; // landing page
|
|
222
|
+
return count;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Count custom components (non-shadCN)
|
|
226
|
+
*/
|
|
227
|
+
countCustomComponents() {
|
|
228
|
+
let count = 0;
|
|
229
|
+
// Auth components
|
|
230
|
+
if (this.asl.auth) {
|
|
231
|
+
count += 2; // LoginForm, RegisterForm
|
|
232
|
+
}
|
|
233
|
+
// Entity components (Card, Form, List per entity)
|
|
234
|
+
if (this.asl.entities) {
|
|
235
|
+
count += Object.keys(this.asl.entities).length * 3;
|
|
236
|
+
}
|
|
237
|
+
return count;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Estimate generation time based on complexity
|
|
241
|
+
*/
|
|
242
|
+
estimateTime() {
|
|
243
|
+
// Base time: 30 seconds
|
|
244
|
+
let seconds = 30;
|
|
245
|
+
// Auth adds 20 seconds
|
|
246
|
+
if (this.asl.auth) {
|
|
247
|
+
seconds += 20;
|
|
248
|
+
}
|
|
249
|
+
// Each entity adds 10 seconds
|
|
250
|
+
if (this.asl.entities) {
|
|
251
|
+
seconds += Object.keys(this.asl.entities).length * 10;
|
|
252
|
+
}
|
|
253
|
+
// shadCN components add 2 seconds each
|
|
254
|
+
const shadcnComps = this.componentInference.inferNeededComponents(this.asl);
|
|
255
|
+
seconds += shadcnComps.length * 2;
|
|
256
|
+
if (seconds < 60) {
|
|
257
|
+
return `~${seconds} seconds`;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const minutes = Math.ceil(seconds / 60);
|
|
261
|
+
return `~${minutes} minute${minutes > 1 ? 's' : ''}`;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check if a page path is an entity page
|
|
266
|
+
*/
|
|
267
|
+
isEntityPage(path) {
|
|
268
|
+
if (!this.asl.entities)
|
|
269
|
+
return false;
|
|
270
|
+
const entityNames = Object.keys(this.asl.entities).map(name => '/' + name.toLowerCase() + 's');
|
|
271
|
+
return entityNames.some(name => path.startsWith(name));
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Format and display the complete preview
|
|
275
|
+
*/
|
|
276
|
+
display() {
|
|
277
|
+
const manifest = this.generateManifest();
|
|
278
|
+
console.log('\n' + chalk_1.default.blue('📋 Scaffold Preview - ' + this.asl.project.name));
|
|
279
|
+
console.log(chalk_1.default.gray('━'.repeat(60)));
|
|
280
|
+
console.log('\n' + manifest.fileTree);
|
|
281
|
+
console.log('\n' + chalk_1.default.bold('Components Summary:'));
|
|
282
|
+
console.log(manifest.componentsSummary);
|
|
283
|
+
console.log('\n' + chalk_1.default.bold('Features:'));
|
|
284
|
+
manifest.features.forEach(feature => {
|
|
285
|
+
console.log(' • ' + feature);
|
|
286
|
+
});
|
|
287
|
+
console.log('\n' + chalk_1.default.gray(`Estimated time: ${manifest.estimatedTime}`));
|
|
288
|
+
console.log(chalk_1.default.gray('━'.repeat(60)) + '\n');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
exports.ScaffoldPreview = ScaffoldPreview;
|
|
292
|
+
//# sourceMappingURL=ScaffoldPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScaffoldPreview.js","sourceRoot":"","sources":["../../src/services/ScaffoldPreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { AuthSpec, PermissionSpec } from "../types/asl";
|
|
2
|
+
/**
|
|
3
|
+
* TemplateEngine - Generate code from templates
|
|
4
|
+
*
|
|
5
|
+
* Uses Handlebars templates to generate production-ready:
|
|
6
|
+
* - Auth pages and components
|
|
7
|
+
* - RBAC guards and middleware
|
|
8
|
+
* - Entity CRUD pages and components
|
|
9
|
+
* - UI components with CVA variants
|
|
10
|
+
* - Server Actions with validation
|
|
11
|
+
*
|
|
12
|
+
* Templates are in src/templates/ directory
|
|
13
|
+
*/
|
|
14
|
+
export declare class TemplateEngine {
|
|
15
|
+
private helpers;
|
|
16
|
+
private templatesDir;
|
|
17
|
+
constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Generate authentication pages (login, register)
|
|
20
|
+
*/
|
|
21
|
+
generateAuthPages(projectPath: string, auth: AuthSpec): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate auth components (LoginForm, RegisterForm)
|
|
24
|
+
*/
|
|
25
|
+
private generateAuthComponents;
|
|
26
|
+
/**
|
|
27
|
+
* Generate RBAC guards (withAuth, withRole)
|
|
28
|
+
*/
|
|
29
|
+
generateGuards(projectPath: string, permissions: PermissionSpec[]): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Generate route protection middleware
|
|
32
|
+
*/
|
|
33
|
+
generateMiddleware(projectPath: string, permissions: PermissionSpec[]): Promise<void>;
|
|
34
|
+
private generateLoginPage;
|
|
35
|
+
private generateRegisterPage;
|
|
36
|
+
private generateLoginForm;
|
|
37
|
+
private generateWithAuthGuard;
|
|
38
|
+
private generateWithRoleGuard;
|
|
39
|
+
private generateMiddlewareCode;
|
|
40
|
+
/**
|
|
41
|
+
* Generate root layout with font optimization and theme provider
|
|
42
|
+
*/
|
|
43
|
+
generateRootLayout(projectPath: string, projectName: string, projectDescription: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Generate utility files (utils.ts with cn helper)
|
|
46
|
+
*/
|
|
47
|
+
generateUtils(projectPath: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Generate InstantDB client setup
|
|
50
|
+
*/
|
|
51
|
+
generateInstantClient(projectPath: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Generate global CSS with Tailwind v4 and design tokens
|
|
54
|
+
*/
|
|
55
|
+
generateGlobalCSS(projectPath: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Generate theme provider component
|
|
58
|
+
*/
|
|
59
|
+
generateThemeProvider(projectPath: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate button component with CVA variants
|
|
62
|
+
*/
|
|
63
|
+
generateButton(projectPath: string): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Generate all UI components (Card, Input, Label, Skeleton, ThemeToggle)
|
|
66
|
+
*/
|
|
67
|
+
generateUIComponents(projectPath: string): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Generate production login page with Suspense
|
|
70
|
+
*/
|
|
71
|
+
generateProductionLoginPage(projectPath: string): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Generate production login form with useTransition
|
|
74
|
+
*/
|
|
75
|
+
generateProductionLoginForm(projectPath: string): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Generate login skeleton component
|
|
78
|
+
*/
|
|
79
|
+
generateLoginSkeleton(projectPath: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Generate register page
|
|
82
|
+
*/
|
|
83
|
+
generateProductionRegisterPage(projectPath: string): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Generate register form component
|
|
86
|
+
*/
|
|
87
|
+
generateRegisterForm(projectPath: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Generate auth Server Actions
|
|
90
|
+
*/
|
|
91
|
+
generateAuthActions(projectPath: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Generate dashboard layout with navigation
|
|
94
|
+
*/
|
|
95
|
+
generateDashboardLayout(projectPath: string, projectName: string, entities: Array<{
|
|
96
|
+
name: string;
|
|
97
|
+
}>): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Generate error boundary
|
|
100
|
+
*/
|
|
101
|
+
generateErrorBoundary(projectPath: string): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Generate loading boundary
|
|
104
|
+
*/
|
|
105
|
+
generateLoadingBoundary(projectPath: string): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Generate not-found page
|
|
108
|
+
*/
|
|
109
|
+
generateNotFoundPage(projectPath: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Generate landing page
|
|
112
|
+
*/
|
|
113
|
+
generateLandingPage(projectPath: string, projectName: string, projectDescription: string): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Generate CRUD pages for an entity
|
|
116
|
+
*/
|
|
117
|
+
generateEntityCRUDPages(projectPath: string, entityName: string, fields: Array<{
|
|
118
|
+
name: string;
|
|
119
|
+
type: string;
|
|
120
|
+
required?: boolean;
|
|
121
|
+
label?: string;
|
|
122
|
+
}>): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Generate CRUD Server Actions for an entity
|
|
125
|
+
*/
|
|
126
|
+
generateEntityActions(projectPath: string, entityName: string, fields: Array<{
|
|
127
|
+
name: string;
|
|
128
|
+
type: string;
|
|
129
|
+
required?: boolean;
|
|
130
|
+
}>): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Generate CRUD components for an entity
|
|
133
|
+
*/
|
|
134
|
+
generateEntityComponents(projectPath: string, entityName: string): Promise<void>;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=TemplateEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateEngine.d.ts","sourceRoot":"","sources":["../../src/services/TemplateEngine.ts"],"names":[],"mappings":"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"}
|