popeye-cli 1.7.0 → 1.8.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/README.md +102 -5
- package/cheatsheet.md +407 -0
- package/dist/cli/commands/db.d.ts +10 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +240 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +18 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +255 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +96 -0
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/admin-wizard.d.ts +25 -0
- package/dist/generators/admin-wizard.d.ts.map +1 -0
- package/dist/generators/admin-wizard.js +123 -0
- package/dist/generators/admin-wizard.js.map +1 -0
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +10 -3
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/database.d.ts +58 -0
- package/dist/generators/database.d.ts.map +1 -0
- package/dist/generators/database.js +229 -0
- package/dist/generators/database.js.map +1 -0
- package/dist/generators/fullstack.d.ts.map +1 -1
- package/dist/generators/fullstack.js +23 -7
- package/dist/generators/fullstack.js.map +1 -1
- package/dist/generators/index.d.ts +2 -0
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +2 -0
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/templates/admin-wizard-python.d.ts +32 -0
- package/dist/generators/templates/admin-wizard-python.d.ts.map +1 -0
- package/dist/generators/templates/admin-wizard-python.js +425 -0
- package/dist/generators/templates/admin-wizard-python.js.map +1 -0
- package/dist/generators/templates/admin-wizard-react.d.ts +48 -0
- package/dist/generators/templates/admin-wizard-react.d.ts.map +1 -0
- package/dist/generators/templates/admin-wizard-react.js +554 -0
- package/dist/generators/templates/admin-wizard-react.js.map +1 -0
- package/dist/generators/templates/database-docker.d.ts +23 -0
- package/dist/generators/templates/database-docker.d.ts.map +1 -0
- package/dist/generators/templates/database-docker.js +221 -0
- package/dist/generators/templates/database-docker.js.map +1 -0
- package/dist/generators/templates/database-python.d.ts +54 -0
- package/dist/generators/templates/database-python.d.ts.map +1 -0
- package/dist/generators/templates/database-python.js +723 -0
- package/dist/generators/templates/database-python.js.map +1 -0
- package/dist/generators/templates/database-typescript.d.ts +34 -0
- package/dist/generators/templates/database-typescript.d.ts.map +1 -0
- package/dist/generators/templates/database-typescript.js +232 -0
- package/dist/generators/templates/database-typescript.js.map +1 -0
- package/dist/generators/templates/fullstack.d.ts.map +1 -1
- package/dist/generators/templates/fullstack.js +29 -0
- package/dist/generators/templates/fullstack.js.map +1 -1
- package/dist/generators/templates/index.d.ts +5 -0
- package/dist/generators/templates/index.d.ts.map +1 -1
- package/dist/generators/templates/index.js +5 -0
- package/dist/generators/templates/index.js.map +1 -1
- package/dist/state/index.d.ts +10 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +21 -0
- package/dist/state/index.js.map +1 -1
- package/dist/types/database-runtime.d.ts +86 -0
- package/dist/types/database-runtime.d.ts.map +1 -0
- package/dist/types/database-runtime.js +61 -0
- package/dist/types/database-runtime.js.map +1 -0
- package/dist/types/database.d.ts +85 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +71 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/workflow.d.ts +21 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/workflow/db-setup-runner.d.ts +63 -0
- package/dist/workflow/db-setup-runner.d.ts.map +1 -0
- package/dist/workflow/db-setup-runner.js +336 -0
- package/dist/workflow/db-setup-runner.js.map +1 -0
- package/dist/workflow/db-state-machine.d.ts +30 -0
- package/dist/workflow/db-state-machine.d.ts.map +1 -0
- package/dist/workflow/db-state-machine.js +51 -0
- package/dist/workflow/db-state-machine.js.map +1 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -0
- package/dist/workflow/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/db.ts +281 -0
- package/src/cli/commands/doctor.ts +273 -0
- package/src/cli/commands/index.ts +2 -0
- package/src/cli/index.ts +4 -0
- package/src/cli/interactive.ts +102 -0
- package/src/generators/admin-wizard.ts +146 -0
- package/src/generators/all.ts +10 -3
- package/src/generators/database.ts +286 -0
- package/src/generators/fullstack.ts +26 -9
- package/src/generators/index.ts +12 -0
- package/src/generators/templates/admin-wizard-python.ts +431 -0
- package/src/generators/templates/admin-wizard-react.ts +560 -0
- package/src/generators/templates/database-docker.ts +227 -0
- package/src/generators/templates/database-python.ts +734 -0
- package/src/generators/templates/database-typescript.ts +238 -0
- package/src/generators/templates/fullstack.ts +29 -0
- package/src/generators/templates/index.ts +5 -0
- package/src/state/index.ts +28 -0
- package/src/types/database-runtime.ts +69 -0
- package/src/types/database.ts +84 -0
- package/src/types/index.ts +29 -0
- package/src/types/workflow.ts +5 -0
- package/src/workflow/db-setup-runner.ts +391 -0
- package/src/workflow/db-state-machine.ts +58 -0
- package/src/workflow/index.ts +2 -0
- package/tests/generators/admin-wizard-orchestrator.test.ts +64 -0
- package/tests/generators/admin-wizard-templates.test.ts +366 -0
- package/tests/generators/cross-phase-integration.test.ts +383 -0
- package/tests/generators/database.test.ts +456 -0
- package/tests/generators/fe-be-db-integration.test.ts +613 -0
- package/tests/types/database-runtime.test.ts +158 -0
- package/tests/types/database.test.ts +187 -0
- package/tests/workflow/db-setup-runner.test.ts +211 -0
- package/tests/workflow/db-state-machine.test.ts +117 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Wizard generator orchestration module
|
|
3
|
+
* Creates the admin wizard backend + frontend layers for fullstack projects
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { generateAdminAuthMiddleware, generateMiddlewareInit, generateAdminDbRoutes, } from './templates/admin-wizard-python.js';
|
|
8
|
+
import { generateUseAdminApiHook, generateDbStatusBanner, generateConnectionForm, generateMigrationProgress, generateDbSetupStepper, generateAdminIndex, } from './templates/admin-wizard-react.js';
|
|
9
|
+
/** Python dependencies required by the admin wizard */
|
|
10
|
+
export const ADMIN_WIZARD_PYTHON_DEPS = ['python-multipart>=0.0.7'];
|
|
11
|
+
/**
|
|
12
|
+
* Create a directory if it doesn't exist
|
|
13
|
+
*/
|
|
14
|
+
async function ensureDir(dirPath) {
|
|
15
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Write a file with content
|
|
19
|
+
*/
|
|
20
|
+
async function writeFile(filePath, content) {
|
|
21
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate the complete admin wizard layer (backend middleware/routes + frontend components)
|
|
25
|
+
*
|
|
26
|
+
* Creates middleware/, routes/admin_db.py in the backend, and admin/ components
|
|
27
|
+
* in the frontend. Also augments requirements.txt with admin dependencies.
|
|
28
|
+
*
|
|
29
|
+
* @param projectDir - Root project directory (contains apps/)
|
|
30
|
+
* @param packageName - Python package name (snake_case)
|
|
31
|
+
* @returns List of absolute file paths created
|
|
32
|
+
*/
|
|
33
|
+
export async function generateAdminWizardLayer(projectDir, packageName) {
|
|
34
|
+
const backendDir = path.join(projectDir, 'apps', 'backend');
|
|
35
|
+
const srcPkgDir = path.join(backendDir, 'src', packageName);
|
|
36
|
+
const frontendDir = path.join(projectDir, 'apps', 'frontend');
|
|
37
|
+
const filesCreated = [];
|
|
38
|
+
// Ensure directories
|
|
39
|
+
await ensureDir(path.join(srcPkgDir, 'middleware'));
|
|
40
|
+
await ensureDir(path.join(frontendDir, 'src', 'admin'));
|
|
41
|
+
// Define all files to generate
|
|
42
|
+
const files = [
|
|
43
|
+
// Backend: middleware
|
|
44
|
+
{
|
|
45
|
+
path: path.join(srcPkgDir, 'middleware', '__init__.py'),
|
|
46
|
+
content: generateMiddlewareInit(),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
path: path.join(srcPkgDir, 'middleware', 'admin_auth.py'),
|
|
50
|
+
content: generateAdminAuthMiddleware(),
|
|
51
|
+
},
|
|
52
|
+
// Backend: admin routes
|
|
53
|
+
{
|
|
54
|
+
path: path.join(srcPkgDir, 'routes', 'admin_db.py'),
|
|
55
|
+
content: generateAdminDbRoutes(packageName),
|
|
56
|
+
},
|
|
57
|
+
// Frontend: admin components
|
|
58
|
+
{
|
|
59
|
+
path: path.join(frontendDir, 'src', 'admin', 'useAdminApi.ts'),
|
|
60
|
+
content: generateUseAdminApiHook(),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
path: path.join(frontendDir, 'src', 'admin', 'DbStatusBanner.tsx'),
|
|
64
|
+
content: generateDbStatusBanner(),
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
path: path.join(frontendDir, 'src', 'admin', 'ConnectionForm.tsx'),
|
|
68
|
+
content: generateConnectionForm(),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
path: path.join(frontendDir, 'src', 'admin', 'MigrationProgress.tsx'),
|
|
72
|
+
content: generateMigrationProgress(),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
path: path.join(frontendDir, 'src', 'admin', 'DbSetupStepper.tsx'),
|
|
76
|
+
content: generateDbSetupStepper(),
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
path: path.join(frontendDir, 'src', 'admin', 'index.ts'),
|
|
80
|
+
content: generateAdminIndex(),
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
// Write all files
|
|
84
|
+
for (const file of files) {
|
|
85
|
+
await writeFile(file.path, file.content);
|
|
86
|
+
filesCreated.push(file.path);
|
|
87
|
+
}
|
|
88
|
+
// Augment requirements.txt with admin deps
|
|
89
|
+
const reqPath = path.join(backendDir, 'requirements.txt');
|
|
90
|
+
try {
|
|
91
|
+
const existingReqs = await fs.readFile(reqPath, 'utf-8');
|
|
92
|
+
if (!existingReqs.includes('# Admin')) {
|
|
93
|
+
const adminSection = `\n# Admin\n${ADMIN_WIZARD_PYTHON_DEPS.join('\n')}\n`;
|
|
94
|
+
await writeFile(reqPath, existingReqs.trimEnd() + adminSection);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// requirements.txt doesn't exist yet - will be created by the main generator
|
|
99
|
+
}
|
|
100
|
+
return filesCreated;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the list of relative file paths generated by the admin wizard layer
|
|
104
|
+
*
|
|
105
|
+
* @param packageName - Python package name (snake_case)
|
|
106
|
+
* @returns List of relative file paths
|
|
107
|
+
*/
|
|
108
|
+
export function getAdminWizardFiles(packageName) {
|
|
109
|
+
return [
|
|
110
|
+
// Backend
|
|
111
|
+
`apps/backend/src/${packageName}/middleware/__init__.py`,
|
|
112
|
+
`apps/backend/src/${packageName}/middleware/admin_auth.py`,
|
|
113
|
+
`apps/backend/src/${packageName}/routes/admin_db.py`,
|
|
114
|
+
// Frontend
|
|
115
|
+
'apps/frontend/src/admin/useAdminApi.ts',
|
|
116
|
+
'apps/frontend/src/admin/DbStatusBanner.tsx',
|
|
117
|
+
'apps/frontend/src/admin/ConnectionForm.tsx',
|
|
118
|
+
'apps/frontend/src/admin/MigrationProgress.tsx',
|
|
119
|
+
'apps/frontend/src/admin/DbSetupStepper.tsx',
|
|
120
|
+
'apps/frontend/src/admin/index.ts',
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=admin-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-wizard.js","sourceRoot":"","sources":["../../src/generators/admin-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../../src/generators/all.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAMlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../../src/generators/all.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAMlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAuBD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmFpE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA4BnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmDpE;AA4HD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,iBAAiB,GAC9B;IACD,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,CAEA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG;IACtD,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,CAEA;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAsI3B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA2ChE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAqCD"}
|
package/dist/generators/all.js
CHANGED
|
@@ -8,6 +8,9 @@ import { generateFullstackProject } from './fullstack.js';
|
|
|
8
8
|
import { generateWebsiteProject } from './website.js';
|
|
9
9
|
import { buildWebsiteContext, validateWebsiteContext } from './website-context.js';
|
|
10
10
|
import { generateDesignTokensPackage as generateDesignTokensPackageImpl, generateUiPackage as generateUiPackageImpl, } from './shared-packages.js';
|
|
11
|
+
import { generateAllDockerComposeWithDb } from './templates/database-docker.js';
|
|
12
|
+
import { getAdminWizardFiles } from './admin-wizard.js';
|
|
13
|
+
import { getDatabaseFiles } from './database.js';
|
|
11
14
|
/**
|
|
12
15
|
* Create a directory if it doesn't exist
|
|
13
16
|
*/
|
|
@@ -420,14 +423,14 @@ export async function generateAllProject(spec, outputDir, options = {}) {
|
|
|
420
423
|
path: path.join(projectDir, '.popeye', 'workspace.json'),
|
|
421
424
|
content: generateAllWorkspaceJson(projectName),
|
|
422
425
|
},
|
|
423
|
-
// Docker compose (override to include website)
|
|
426
|
+
// Docker compose (override to include website + postgres)
|
|
424
427
|
{
|
|
425
428
|
path: path.join(projectDir, 'docker-compose.yml'),
|
|
426
|
-
content:
|
|
429
|
+
content: generateAllDockerComposeWithDb(projectName),
|
|
427
430
|
},
|
|
428
431
|
{
|
|
429
432
|
path: path.join(projectDir, 'infra', 'docker', 'docker-compose.yml'),
|
|
430
|
-
content:
|
|
433
|
+
content: generateAllDockerComposeWithDb(projectName),
|
|
431
434
|
},
|
|
432
435
|
// README
|
|
433
436
|
{
|
|
@@ -500,6 +503,10 @@ export function getAllProjectFiles(projectName) {
|
|
|
500
503
|
'packages/ui/src/button.tsx',
|
|
501
504
|
'packages/ui/src/card.tsx',
|
|
502
505
|
'packages/contracts/.gitkeep',
|
|
506
|
+
// Database layer
|
|
507
|
+
...getDatabaseFiles(packageName, 'sqlalchemy'),
|
|
508
|
+
// Admin wizard layer
|
|
509
|
+
...getAdminWizardFiles(packageName),
|
|
503
510
|
];
|
|
504
511
|
}
|
|
505
512
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"all.js","sourceRoot":"","sources":["../../src/generators/all.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EACL,2BAA2B,IAAI,+BAA+B,EAC9D,iBAAiB,IAAI,qBAAqB,GAC3C,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"all.js","sourceRoot":"","sources":["../../src/generators/all.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database generator orchestration module
|
|
3
|
+
* Creates complete database layers for fullstack and TS backend projects
|
|
4
|
+
*/
|
|
5
|
+
import type { BackendOrm } from '../types/database.js';
|
|
6
|
+
/** Python database dependencies */
|
|
7
|
+
export declare const DB_PYTHON_DEPS: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Options for database layer generation
|
|
10
|
+
*/
|
|
11
|
+
interface DatabaseLayerOptions {
|
|
12
|
+
includeVector?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate the complete Python database layer for a backend project
|
|
16
|
+
*
|
|
17
|
+
* Creates database/, migrations/, and supporting files under apps/backend/
|
|
18
|
+
*
|
|
19
|
+
* @param projectDir - Root project directory (contains apps/)
|
|
20
|
+
* @param projectName - Project name (used for naming)
|
|
21
|
+
* @param packageName - Python package name (snake_case)
|
|
22
|
+
* @param options - Generation options
|
|
23
|
+
* @returns List of absolute file paths created
|
|
24
|
+
*/
|
|
25
|
+
export declare function generatePythonDatabaseLayer(projectDir: string, _projectName: string, packageName: string, options?: DatabaseLayerOptions): Promise<string[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Generate the complete TypeScript database layer for a project
|
|
28
|
+
*
|
|
29
|
+
* Creates prisma/ and src/db/ directories with Prisma-based DB files
|
|
30
|
+
* NOTE: Not wired into any generator in Phase 1
|
|
31
|
+
*
|
|
32
|
+
* @param projectDir - Project directory (where prisma/ and src/ live)
|
|
33
|
+
* @param projectName - Project name
|
|
34
|
+
* @param options - Generation options
|
|
35
|
+
* @returns List of absolute file paths created
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateTypeScriptDatabaseLayer(projectDir: string, projectName: string, _options?: DatabaseLayerOptions): Promise<string[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Append database dependencies to an existing requirements.txt
|
|
40
|
+
*
|
|
41
|
+
* Idempotent: checks for existing "# Database" section to avoid duplicates.
|
|
42
|
+
* Handles empty input gracefully.
|
|
43
|
+
*
|
|
44
|
+
* @param baseContent - Existing requirements.txt content
|
|
45
|
+
* @param dbDeps - Database dependency strings to add
|
|
46
|
+
* @returns Augmented requirements.txt content
|
|
47
|
+
*/
|
|
48
|
+
export declare function augmentRequirements(baseContent: string, dbDeps: string[]): string;
|
|
49
|
+
/**
|
|
50
|
+
* Get the list of relative file paths generated for a database layer
|
|
51
|
+
*
|
|
52
|
+
* @param packageName - Python package name (for sqlalchemy) or project name (for prisma)
|
|
53
|
+
* @param orm - ORM type
|
|
54
|
+
* @returns List of relative file paths
|
|
55
|
+
*/
|
|
56
|
+
export declare function getDatabaseFiles(packageName: string, orm: BackendOrm): string[];
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/generators/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAwBvD,mCAAmC;AACnC,eAAO,MAAM,cAAc,UAK1B,CAAC;AAEF;;GAEG;AACH,UAAU,oBAAoB;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAgBD;;;;;;;;;;GAUG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA0FnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,+BAA+B,CACnD,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,oBAAyB,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,CAwCnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAWjF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,CA8B/E"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database generator orchestration module
|
|
3
|
+
* Creates complete database layers for fullstack and TS backend projects
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { generateDbConnection, generateDbModels, generateDbInit, generateDbSettings, generateAlembicIni, generateAlembicEnvPy, generateAlembicScriptMako, generateInitialMigration, generateDbVectorHelpers, generateDbStartupHook, generateDbHealthRoute, generateDbConftest, } from './templates/database-python.js';
|
|
8
|
+
import { generatePrismaSchema, generatePrismaClient, generatePrismaSeed, generatePrismaDbHealth, generatePrismaVectorHelpers, generatePrismaDbInit, } from './templates/database-typescript.js';
|
|
9
|
+
/** Python database dependencies */
|
|
10
|
+
export const DB_PYTHON_DEPS = [
|
|
11
|
+
'sqlalchemy[asyncio]>=2.0.0',
|
|
12
|
+
'asyncpg>=0.29.0',
|
|
13
|
+
'alembic>=1.13.0',
|
|
14
|
+
'pgvector>=0.2.5',
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Create a directory if it doesn't exist
|
|
18
|
+
*/
|
|
19
|
+
async function ensureDir(dirPath) {
|
|
20
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Write a file with content
|
|
24
|
+
*/
|
|
25
|
+
async function writeFile(filePath, content) {
|
|
26
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate the complete Python database layer for a backend project
|
|
30
|
+
*
|
|
31
|
+
* Creates database/, migrations/, and supporting files under apps/backend/
|
|
32
|
+
*
|
|
33
|
+
* @param projectDir - Root project directory (contains apps/)
|
|
34
|
+
* @param projectName - Project name (used for naming)
|
|
35
|
+
* @param packageName - Python package name (snake_case)
|
|
36
|
+
* @param options - Generation options
|
|
37
|
+
* @returns List of absolute file paths created
|
|
38
|
+
*/
|
|
39
|
+
export async function generatePythonDatabaseLayer(projectDir, _projectName, packageName, options = {}) {
|
|
40
|
+
const includeVector = options.includeVector !== false;
|
|
41
|
+
const backendDir = path.join(projectDir, 'apps', 'backend');
|
|
42
|
+
const srcPkgDir = path.join(backendDir, 'src', packageName);
|
|
43
|
+
const filesCreated = [];
|
|
44
|
+
// Ensure directories exist
|
|
45
|
+
await ensureDir(path.join(srcPkgDir, 'database'));
|
|
46
|
+
await ensureDir(path.join(srcPkgDir, 'routes'));
|
|
47
|
+
await ensureDir(path.join(backendDir, 'migrations', 'versions'));
|
|
48
|
+
await ensureDir(path.join(backendDir, 'tests'));
|
|
49
|
+
// Define all files to generate
|
|
50
|
+
const files = [
|
|
51
|
+
// Database package
|
|
52
|
+
{
|
|
53
|
+
path: path.join(srcPkgDir, 'database', '__init__.py'),
|
|
54
|
+
content: generateDbInit(packageName),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
path: path.join(srcPkgDir, 'database', 'connection.py'),
|
|
58
|
+
content: generateDbConnection(packageName),
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
path: path.join(srcPkgDir, 'database', 'models.py'),
|
|
62
|
+
content: generateDbModels(packageName),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
path: path.join(srcPkgDir, 'database', 'settings.py'),
|
|
66
|
+
content: generateDbSettings(packageName),
|
|
67
|
+
},
|
|
68
|
+
// Alembic migrations
|
|
69
|
+
{
|
|
70
|
+
path: path.join(backendDir, 'alembic.ini'),
|
|
71
|
+
content: generateAlembicIni(packageName),
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
path: path.join(backendDir, 'migrations', 'env.py'),
|
|
75
|
+
content: generateAlembicEnvPy(packageName),
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
path: path.join(backendDir, 'migrations', 'script.py.mako'),
|
|
79
|
+
content: generateAlembicScriptMako(),
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
path: path.join(backendDir, 'migrations', 'versions', '001_initial.py'),
|
|
83
|
+
content: generateInitialMigration(packageName),
|
|
84
|
+
},
|
|
85
|
+
// Startup hook
|
|
86
|
+
{
|
|
87
|
+
path: path.join(srcPkgDir, 'startup.py'),
|
|
88
|
+
content: generateDbStartupHook(packageName),
|
|
89
|
+
},
|
|
90
|
+
// Health route
|
|
91
|
+
{
|
|
92
|
+
path: path.join(srcPkgDir, 'routes', 'health_db.py'),
|
|
93
|
+
content: generateDbHealthRoute(packageName),
|
|
94
|
+
},
|
|
95
|
+
// Test fixtures
|
|
96
|
+
{
|
|
97
|
+
path: path.join(backendDir, 'tests', 'conftest_db.py'),
|
|
98
|
+
content: generateDbConftest(packageName),
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
// Add vector helpers if requested
|
|
102
|
+
if (includeVector) {
|
|
103
|
+
files.push({
|
|
104
|
+
path: path.join(srcPkgDir, 'database', 'vector.py'),
|
|
105
|
+
content: generateDbVectorHelpers(packageName),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Write all files
|
|
109
|
+
for (const file of files) {
|
|
110
|
+
await writeFile(file.path, file.content);
|
|
111
|
+
filesCreated.push(file.path);
|
|
112
|
+
}
|
|
113
|
+
// Augment requirements.txt with DB deps
|
|
114
|
+
const reqPath = path.join(backendDir, 'requirements.txt');
|
|
115
|
+
try {
|
|
116
|
+
const existingReqs = await fs.readFile(reqPath, 'utf-8');
|
|
117
|
+
const augmented = augmentRequirements(existingReqs, DB_PYTHON_DEPS);
|
|
118
|
+
await writeFile(reqPath, augmented);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// requirements.txt doesn't exist yet - will be created by the main generator
|
|
122
|
+
}
|
|
123
|
+
return filesCreated;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Generate the complete TypeScript database layer for a project
|
|
127
|
+
*
|
|
128
|
+
* Creates prisma/ and src/db/ directories with Prisma-based DB files
|
|
129
|
+
* NOTE: Not wired into any generator in Phase 1
|
|
130
|
+
*
|
|
131
|
+
* @param projectDir - Project directory (where prisma/ and src/ live)
|
|
132
|
+
* @param projectName - Project name
|
|
133
|
+
* @param options - Generation options
|
|
134
|
+
* @returns List of absolute file paths created
|
|
135
|
+
*/
|
|
136
|
+
export async function generateTypeScriptDatabaseLayer(projectDir, projectName, _options = {}) {
|
|
137
|
+
const filesCreated = [];
|
|
138
|
+
// Ensure directories
|
|
139
|
+
await ensureDir(path.join(projectDir, 'prisma'));
|
|
140
|
+
await ensureDir(path.join(projectDir, 'src', 'db'));
|
|
141
|
+
const files = [
|
|
142
|
+
{
|
|
143
|
+
path: path.join(projectDir, 'prisma', 'schema.prisma'),
|
|
144
|
+
content: generatePrismaSchema(projectName),
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
path: path.join(projectDir, 'prisma', 'seed.ts'),
|
|
148
|
+
content: generatePrismaSeed(),
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
path: path.join(projectDir, 'src', 'db', 'client.ts'),
|
|
152
|
+
content: generatePrismaClient(projectName),
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
path: path.join(projectDir, 'src', 'db', 'health.ts'),
|
|
156
|
+
content: generatePrismaDbHealth(),
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
path: path.join(projectDir, 'src', 'db', 'vector.ts'),
|
|
160
|
+
content: generatePrismaVectorHelpers(),
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
path: path.join(projectDir, 'src', 'db', 'index.ts'),
|
|
164
|
+
content: generatePrismaDbInit(),
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
for (const file of files) {
|
|
168
|
+
await writeFile(file.path, file.content);
|
|
169
|
+
filesCreated.push(file.path);
|
|
170
|
+
}
|
|
171
|
+
return filesCreated;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Append database dependencies to an existing requirements.txt
|
|
175
|
+
*
|
|
176
|
+
* Idempotent: checks for existing "# Database" section to avoid duplicates.
|
|
177
|
+
* Handles empty input gracefully.
|
|
178
|
+
*
|
|
179
|
+
* @param baseContent - Existing requirements.txt content
|
|
180
|
+
* @param dbDeps - Database dependency strings to add
|
|
181
|
+
* @returns Augmented requirements.txt content
|
|
182
|
+
*/
|
|
183
|
+
export function augmentRequirements(baseContent, dbDeps) {
|
|
184
|
+
// Check for existing Database section
|
|
185
|
+
if (baseContent.includes('# Database')) {
|
|
186
|
+
return baseContent;
|
|
187
|
+
}
|
|
188
|
+
// Ensure trailing newline before adding section
|
|
189
|
+
const base = baseContent.trimEnd();
|
|
190
|
+
const depsBlock = dbDeps.join('\n');
|
|
191
|
+
return `${base}\n\n# Database\n${depsBlock}\n`;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get the list of relative file paths generated for a database layer
|
|
195
|
+
*
|
|
196
|
+
* @param packageName - Python package name (for sqlalchemy) or project name (for prisma)
|
|
197
|
+
* @param orm - ORM type
|
|
198
|
+
* @returns List of relative file paths
|
|
199
|
+
*/
|
|
200
|
+
export function getDatabaseFiles(packageName, orm) {
|
|
201
|
+
if (orm === 'sqlalchemy') {
|
|
202
|
+
return [
|
|
203
|
+
`apps/backend/src/${packageName}/database/__init__.py`,
|
|
204
|
+
`apps/backend/src/${packageName}/database/connection.py`,
|
|
205
|
+
`apps/backend/src/${packageName}/database/models.py`,
|
|
206
|
+
`apps/backend/src/${packageName}/database/settings.py`,
|
|
207
|
+
`apps/backend/src/${packageName}/database/vector.py`,
|
|
208
|
+
`apps/backend/src/${packageName}/routes/health_db.py`,
|
|
209
|
+
`apps/backend/src/${packageName}/startup.py`,
|
|
210
|
+
'apps/backend/alembic.ini',
|
|
211
|
+
'apps/backend/migrations/env.py',
|
|
212
|
+
'apps/backend/migrations/script.py.mako',
|
|
213
|
+
'apps/backend/migrations/versions/001_initial.py',
|
|
214
|
+
'apps/backend/tests/conftest_db.py',
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
if (orm === 'prisma') {
|
|
218
|
+
return [
|
|
219
|
+
'prisma/schema.prisma',
|
|
220
|
+
'prisma/seed.ts',
|
|
221
|
+
'src/db/client.ts',
|
|
222
|
+
'src/db/health.ts',
|
|
223
|
+
'src/db/vector.ts',
|
|
224
|
+
'src/db/index.ts',
|
|
225
|
+
];
|
|
226
|
+
}
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/generators/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullstack.d.ts","sourceRoot":"","sources":["../../src/generators/fullstack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fullstack.d.ts","sourceRoot":"","sources":["../../src/generators/fullstack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgCpD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAuBD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAmQ3B;AA6ID;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAqDtE;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1E,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CA0BD"}
|
|
@@ -4,7 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { promises as fs } from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
|
-
import { generateWorkspaceJson,
|
|
7
|
+
import { generateWorkspaceJson, generateRootReadme, generateRootGitignore, generateFrontendReadme, generateBackendReadme, generateUiSpec, generateViteConfigReact, generateTailwindConfig, generatePostcssConfig, generateMainCss, generateMainTsx, generateIndexHtml, generateFrontendPackageJson, generateFrontendTsconfig, generateFrontendTsconfigNode, generateFrontendDockerfile, generateNginxConfig, generateFrontendTest, generateVitestSetup, generateFrontendVitestConfig, generateBackendDockerfile, generateFastAPIRequirements, } from './templates/fullstack.js';
|
|
8
|
+
import { generateAppTsxWithAdmin } from './templates/admin-wizard-react.js';
|
|
9
|
+
import { generateFastAPIMainWithAdmin } from './templates/admin-wizard-python.js';
|
|
10
|
+
import { generateDockerComposeWithDb, generateDbEnvExample } from './templates/database-docker.js';
|
|
11
|
+
import { generatePythonDatabaseLayer } from './database.js';
|
|
12
|
+
import { getDatabaseFiles } from './database.js';
|
|
13
|
+
import { generateAdminWizardLayer, getAdminWizardFiles } from './admin-wizard.js';
|
|
8
14
|
/**
|
|
9
15
|
* Create a directory if it doesn't exist
|
|
10
16
|
*/
|
|
@@ -64,11 +70,11 @@ export async function generateFullstackProject(spec, outputDir) {
|
|
|
64
70
|
// Docker
|
|
65
71
|
{
|
|
66
72
|
path: path.join(projectDir, 'infra', 'docker', 'docker-compose.yml'),
|
|
67
|
-
content:
|
|
73
|
+
content: generateDockerComposeWithDb(projectName),
|
|
68
74
|
},
|
|
69
75
|
{
|
|
70
76
|
path: path.join(projectDir, 'docker-compose.yml'),
|
|
71
|
-
content:
|
|
77
|
+
content: generateDockerComposeWithDb(projectName),
|
|
72
78
|
},
|
|
73
79
|
// Documentation
|
|
74
80
|
{
|
|
@@ -142,7 +148,7 @@ export async function generateFullstackProject(spec, outputDir) {
|
|
|
142
148
|
},
|
|
143
149
|
{
|
|
144
150
|
path: path.join(frontendDir, 'src', 'App.tsx'),
|
|
145
|
-
content:
|
|
151
|
+
content: generateAppTsxWithAdmin(projectName),
|
|
146
152
|
},
|
|
147
153
|
{
|
|
148
154
|
path: path.join(frontendDir, 'src', 'index.css'),
|
|
@@ -178,7 +184,7 @@ export async function generateFullstackProject(spec, outputDir) {
|
|
|
178
184
|
// Environment
|
|
179
185
|
{
|
|
180
186
|
path: path.join(frontendDir, '.env.example'),
|
|
181
|
-
content: 'VITE_API_URL=http://localhost:8000\n',
|
|
187
|
+
content: 'VITE_API_URL=http://localhost:8000\nVITE_ADMIN_TOKEN=change-me-to-a-random-string\n',
|
|
182
188
|
},
|
|
183
189
|
{
|
|
184
190
|
path: path.join(frontendDir, '.gitignore'),
|
|
@@ -213,7 +219,7 @@ export async function generateFullstackProject(spec, outputDir) {
|
|
|
213
219
|
},
|
|
214
220
|
{
|
|
215
221
|
path: path.join(backendDir, 'src', packageName, 'main.py'),
|
|
216
|
-
content:
|
|
222
|
+
content: generateFastAPIMainWithAdmin(projectName, packageName),
|
|
217
223
|
},
|
|
218
224
|
// Test files
|
|
219
225
|
{
|
|
@@ -241,7 +247,7 @@ export async function generateFullstackProject(spec, outputDir) {
|
|
|
241
247
|
// Environment
|
|
242
248
|
{
|
|
243
249
|
path: path.join(backendDir, '.env.example'),
|
|
244
|
-
content:
|
|
250
|
+
content: generateDbEnvExample(projectName),
|
|
245
251
|
},
|
|
246
252
|
{
|
|
247
253
|
path: path.join(backendDir, '.gitignore'),
|
|
@@ -258,6 +264,12 @@ export async function generateFullstackProject(spec, outputDir) {
|
|
|
258
264
|
await writeFile(file.path, file.content);
|
|
259
265
|
filesCreated.push(file.path);
|
|
260
266
|
}
|
|
267
|
+
// Generate database layer (SQLAlchemy + Alembic + pgvector)
|
|
268
|
+
const dbFiles = await generatePythonDatabaseLayer(projectDir, projectName, packageName, { includeVector: true });
|
|
269
|
+
filesCreated.push(...dbFiles);
|
|
270
|
+
// Generate admin wizard layer (middleware + routes + React components)
|
|
271
|
+
const adminFiles = await generateAdminWizardLayer(projectDir, packageName);
|
|
272
|
+
filesCreated.push(...adminFiles);
|
|
261
273
|
return {
|
|
262
274
|
success: true,
|
|
263
275
|
projectDir,
|
|
@@ -461,6 +473,10 @@ export function getFullstackProjectFiles(projectName) {
|
|
|
461
473
|
'apps/backend/.env.example',
|
|
462
474
|
'apps/backend/.gitignore',
|
|
463
475
|
'apps/backend/Makefile',
|
|
476
|
+
// Database layer
|
|
477
|
+
...getDatabaseFiles(packageName, 'sqlalchemy'),
|
|
478
|
+
// Admin wizard layer
|
|
479
|
+
...getAdminWizardFiles(packageName),
|
|
464
480
|
];
|
|
465
481
|
}
|
|
466
482
|
/**
|