@quanticjs/create-app 0.1.1
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/deps.d.ts +4 -0
- package/dist/deps.js +97 -0
- package/dist/deps.js.map +1 -0
- package/dist/generators/backend.d.ts +2 -0
- package/dist/generators/backend.js +20 -0
- package/dist/generators/backend.js.map +1 -0
- package/dist/generators/bff.d.ts +2 -0
- package/dist/generators/bff.js +9 -0
- package/dist/generators/bff.js.map +1 -0
- package/dist/generators/claude.d.ts +2 -0
- package/dist/generators/claude.js +45 -0
- package/dist/generators/claude.js.map +1 -0
- package/dist/generators/docker.d.ts +2 -0
- package/dist/generators/docker.js +10 -0
- package/dist/generators/docker.js.map +1 -0
- package/dist/generators/e2e.d.ts +2 -0
- package/dist/generators/e2e.js +8 -0
- package/dist/generators/e2e.js.map +1 -0
- package/dist/generators/frontend.d.ts +2 -0
- package/dist/generators/frontend.js +28 -0
- package/dist/generators/frontend.js.map +1 -0
- package/dist/generators/module.d.ts +2 -0
- package/dist/generators/module.js +35 -0
- package/dist/generators/module.js.map +1 -0
- package/dist/generators/root.d.ts +2 -0
- package/dist/generators/root.js +7 -0
- package/dist/generators/root.js.map +1 -0
- package/dist/generators/scripts.d.ts +2 -0
- package/dist/generators/scripts.js +10 -0
- package/dist/generators/scripts.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +8 -0
- package/dist/prompts.js +53 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scaffold.d.ts +2 -0
- package/dist/scaffold.js +79 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/utils/exec.d.ts +2 -0
- package/dist/utils/exec.js +14 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/template.d.ts +10 -0
- package/dist/utils/template.js +20 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/validate.d.ts +4 -0
- package/dist/utils/validate.js +27 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +50 -0
- package/templates/backend/app.module.ts.ejs +61 -0
- package/templates/backend/bff.controller.ts.ejs +60 -0
- package/templates/backend/bff.module.ts.ejs +10 -0
- package/templates/backend/bff.service.ts.ejs +6 -0
- package/templates/backend/create-schema.migration.ts.ejs +15 -0
- package/templates/backend/data-source.ts.ejs +13 -0
- package/templates/backend/env.example.ejs +30 -0
- package/templates/backend/main.ts.ejs +43 -0
- package/templates/backend/module.ts.ejs +14 -0
- package/templates/backend/nest-cli.json.ejs +8 -0
- package/templates/backend/package.json.ejs +23 -0
- package/templates/backend/tsconfig.build.json.ejs +4 -0
- package/templates/backend/tsconfig.json.ejs +24 -0
- package/templates/claude/CLAUDE.md.ejs +86 -0
- package/templates/claude/hooks/auto-format.sh +22 -0
- package/templates/claude/hooks/check-secrets.sh +49 -0
- package/templates/claude/hooks/guard-destructive.sh +42 -0
- package/templates/claude/hooks/on-compaction.sh +29 -0
- package/templates/claude/mcp.json +10 -0
- package/templates/claude/rules/api-patterns.md +86 -0
- package/templates/claude/rules/auth-patterns.md +109 -0
- package/templates/claude/rules/backend-patterns.md +421 -0
- package/templates/claude/rules/database-patterns.md +96 -0
- package/templates/claude/rules/docker-patterns.md +86 -0
- package/templates/claude/rules/frontend-patterns.md +262 -0
- package/templates/claude/rules/observability-backend.md +132 -0
- package/templates/claude/rules/observability-frontend.md +49 -0
- package/templates/claude/rules/playwright-mcp.md +80 -0
- package/templates/claude/rules/resilience-ops.md +103 -0
- package/templates/claude/rules/testing-e2e-ui.md +190 -0
- package/templates/claude/rules/testing-patterns.md +94 -0
- package/templates/claude/rules/workflow-backend.md +64 -0
- package/templates/claude/rules/workflow-frontend.md +60 -0
- package/templates/claude/settings.json +68 -0
- package/templates/claude/skills/add-api-endpoint/SKILL.md +59 -0
- package/templates/claude/skills/add-auth-endpoint/SKILL.md +68 -0
- package/templates/claude/skills/add-entity/SKILL.md +56 -0
- package/templates/claude/skills/add-event/SKILL.md +127 -0
- package/templates/claude/skills/add-feature/SKILL.md +20 -0
- package/templates/claude/skills/add-frontend-page/SKILL.md +75 -0
- package/templates/claude/skills/add-handler/SKILL.md +105 -0
- package/templates/claude/skills/add-integration/SKILL.md +176 -0
- package/templates/claude/skills/add-migration/SKILL.md +20 -0
- package/templates/claude/skills/add-module/SKILL.md +89 -0
- package/templates/claude/skills/add-realtime/SKILL.md +119 -0
- package/templates/claude/skills/audit-rules/SKILL.md +120 -0
- package/templates/claude/skills/debugging/SKILL.md +105 -0
- package/templates/claude/skills/docker-dev/SKILL.md +86 -0
- package/templates/claude/skills/e2e-audit/SKILL.md +85 -0
- package/templates/claude/skills/e2e-full/SKILL.md +132 -0
- package/templates/claude/skills/e2e-scan/SKILL.md +171 -0
- package/templates/claude/skills/e2e-verify/SKILL.md +145 -0
- package/templates/claude/skills/fix-bug/SKILL.md +33 -0
- package/templates/claude/skills/implement-spec/SKILL.md +98 -0
- package/templates/claude/skills/review-code/SKILL.md +109 -0
- package/templates/claude/skills/review-spec/SKILL.md +216 -0
- package/templates/claude/skills/run-tests/SKILL.md +37 -0
- package/templates/claude/skills/specify/SKILL.md +87 -0
- package/templates/claude/skills/write-backend-tests/SKILL.md +182 -0
- package/templates/claude/skills/write-ui-tests/SKILL.md +118 -0
- package/templates/docker/Dockerfile.client.ejs +14 -0
- package/templates/docker/Dockerfile.ejs +28 -0
- package/templates/docker/docker-compose.test.yml.ejs +54 -0
- package/templates/docker/docker-compose.yml.ejs +76 -0
- package/templates/docker/nginx.conf.ejs +21 -0
- package/templates/frontend/App.tsx.ejs +64 -0
- package/templates/frontend/DashboardPage.tsx.ejs +37 -0
- package/templates/frontend/LoginPage.tsx.ejs +20 -0
- package/templates/frontend/NotFoundPage.tsx.ejs +15 -0
- package/templates/frontend/api-client.ts.ejs +15 -0
- package/templates/frontend/index.css.ejs +57 -0
- package/templates/frontend/index.html.ejs +13 -0
- package/templates/frontend/main.tsx.ejs +10 -0
- package/templates/frontend/package.json.ejs +16 -0
- package/templates/frontend/playwright.config.ts.ejs +20 -0
- package/templates/frontend/postcss.config.js.ejs +3 -0
- package/templates/frontend/smoke.spec.ts.ejs +37 -0
- package/templates/frontend/tailwind.config.ts.ejs +56 -0
- package/templates/frontend/tsconfig.json.ejs +25 -0
- package/templates/frontend/tsconfig.node.json.ejs +15 -0
- package/templates/frontend/utils.ts.ejs +6 -0
- package/templates/frontend/vite-env.d.ts.ejs +1 -0
- package/templates/frontend/vite.config.ts.ejs +20 -0
- package/templates/root/gitignore.ejs +9 -0
- package/templates/root/prettierrc.ejs +7 -0
- package/templates/scripts/init-db.sh.ejs +8 -0
- package/templates/scripts/save-auth-state.ts.ejs +24 -0
package/dist/deps.d.ts
ADDED
package/dist/deps.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export const BACKEND_DEPS = {
|
|
2
|
+
'@nestjs/core': '^10.4.0',
|
|
3
|
+
'@nestjs/common': '^10.4.0',
|
|
4
|
+
'@nestjs/platform-express': '^10.4.0',
|
|
5
|
+
'@nestjs/config': '^3.2.0',
|
|
6
|
+
'@nestjs/cqrs': '^10.2.0',
|
|
7
|
+
'@nestjs/typeorm': '^10.0.0',
|
|
8
|
+
'@nestjs/passport': '^10.0.0',
|
|
9
|
+
'@nestjs/swagger': '^7.4.0',
|
|
10
|
+
'@nestjs/schedule': '^4.1.0',
|
|
11
|
+
'@nestjs-cqrs/quanticjs': '^1.0.0',
|
|
12
|
+
'@quanticjs/core': '^1.0.0',
|
|
13
|
+
typeorm: '^0.3.20',
|
|
14
|
+
pg: '^8.12.0',
|
|
15
|
+
ioredis: '^5.4.0',
|
|
16
|
+
'@nestjs-modules/ioredis': '^2.0.0',
|
|
17
|
+
passport: '^0.7.0',
|
|
18
|
+
'passport-jwt': '^4.0.1',
|
|
19
|
+
'cookie-parser': '^1.4.6',
|
|
20
|
+
'class-validator': '^0.14.1',
|
|
21
|
+
'class-transformer': '^0.5.1',
|
|
22
|
+
zod: '^3.23.0',
|
|
23
|
+
'nestjs-pino': '^4.1.0',
|
|
24
|
+
'pino-http': '^10.2.0',
|
|
25
|
+
'@sentry/node': '^8.0.0',
|
|
26
|
+
'@sentry/tracing': '^7.0.0',
|
|
27
|
+
'prom-client': '^15.1.0',
|
|
28
|
+
rxjs: '^7.8.0',
|
|
29
|
+
'reflect-metadata': '^0.2.2',
|
|
30
|
+
};
|
|
31
|
+
export const BACKEND_DEV_DEPS = {
|
|
32
|
+
'@types/node': '^20.14.0',
|
|
33
|
+
'@types/express': '^4.17.0',
|
|
34
|
+
'@types/passport-jwt': '^4.0.0',
|
|
35
|
+
'@types/cookie-parser': '^1.4.0',
|
|
36
|
+
typescript: '^5.5.0',
|
|
37
|
+
'ts-node': '^10.9.0',
|
|
38
|
+
'tsconfig-paths': '^4.2.0',
|
|
39
|
+
'@nestjs/cli': '^10.4.0',
|
|
40
|
+
'@nestjs/schematics': '^10.1.0',
|
|
41
|
+
'@nestjs/testing': '^10.4.0',
|
|
42
|
+
'pino-pretty': '^11.2.0',
|
|
43
|
+
jest: '^29.7.0',
|
|
44
|
+
'ts-jest': '^29.2.0',
|
|
45
|
+
'@types/jest': '^29.5.0',
|
|
46
|
+
supertest: '^7.0.0',
|
|
47
|
+
'@types/supertest': '^6.0.0',
|
|
48
|
+
};
|
|
49
|
+
export const FRONTEND_DEPS = {
|
|
50
|
+
react: '^18.3.0',
|
|
51
|
+
'react-dom': '^18.3.0',
|
|
52
|
+
'react-router-dom': '^6.26.0',
|
|
53
|
+
'@tanstack/react-query': '^5.51.0',
|
|
54
|
+
zustand: '^4.5.0',
|
|
55
|
+
zod: '^3.23.0',
|
|
56
|
+
'@quanticjs/react-core': '^1.0.0',
|
|
57
|
+
'@quanticjs/react-query': '^1.0.0',
|
|
58
|
+
'@quanticjs/react-forms': '^1.0.0',
|
|
59
|
+
'@quanticjs/react-ui': '^1.0.0',
|
|
60
|
+
'@quanticjs/workflow-ui': '^1.0.0',
|
|
61
|
+
'@radix-ui/react-dialog': '^1.1.0',
|
|
62
|
+
'@radix-ui/react-dropdown-menu': '^2.1.0',
|
|
63
|
+
'@radix-ui/react-label': '^2.1.0',
|
|
64
|
+
'@radix-ui/react-select': '^2.1.0',
|
|
65
|
+
'@radix-ui/react-slot': '^1.1.0',
|
|
66
|
+
'@radix-ui/react-tabs': '^1.1.0',
|
|
67
|
+
'@radix-ui/react-toast': '^1.2.0',
|
|
68
|
+
'@radix-ui/react-tooltip': '^1.1.0',
|
|
69
|
+
'@radix-ui/react-avatar': '^1.1.0',
|
|
70
|
+
'@radix-ui/react-checkbox': '^1.1.0',
|
|
71
|
+
'@radix-ui/react-popover': '^1.1.0',
|
|
72
|
+
'@radix-ui/react-separator': '^1.1.0',
|
|
73
|
+
'@radix-ui/react-switch': '^1.1.0',
|
|
74
|
+
'lucide-react': '^0.400.0',
|
|
75
|
+
'class-variance-authority': '^0.7.0',
|
|
76
|
+
clsx: '^2.1.0',
|
|
77
|
+
'tailwind-merge': '^2.4.0',
|
|
78
|
+
'@sentry/react': '^8.0.0',
|
|
79
|
+
};
|
|
80
|
+
export const FRONTEND_DEV_DEPS = {
|
|
81
|
+
vite: '^5.4.0',
|
|
82
|
+
'@vitejs/plugin-react': '^4.3.0',
|
|
83
|
+
typescript: '^5.5.0',
|
|
84
|
+
'@types/react': '^18.3.0',
|
|
85
|
+
'@types/react-dom': '^18.3.0',
|
|
86
|
+
tailwindcss: '^4.0.0',
|
|
87
|
+
'@tailwindcss/vite': '^4.0.0',
|
|
88
|
+
'@tanstack/react-query-devtools': '^5.51.0',
|
|
89
|
+
vitest: '^2.0.0',
|
|
90
|
+
'@testing-library/react': '^16.0.0',
|
|
91
|
+
'@testing-library/jest-dom': '^6.4.0',
|
|
92
|
+
'@testing-library/user-event': '^14.5.0',
|
|
93
|
+
jsdom: '^24.1.0',
|
|
94
|
+
'@vitest/coverage-v8': '^2.0.0',
|
|
95
|
+
'@playwright/test': '^1.45.0',
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=deps.js.map
|
package/dist/deps.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderAndWrite, renderTemplate, writeFile } from '../utils/template.js';
|
|
3
|
+
import { toPascalCase } from '../utils/validate.js';
|
|
4
|
+
import { BACKEND_DEPS, BACKEND_DEV_DEPS } from '../deps.js';
|
|
5
|
+
export function generateBackend(projectDir, ctx) {
|
|
6
|
+
const rendered = renderTemplate('backend/package.json.ejs', ctx);
|
|
7
|
+
const pkgJson = JSON.parse(rendered);
|
|
8
|
+
pkgJson.dependencies = BACKEND_DEPS;
|
|
9
|
+
pkgJson.devDependencies = BACKEND_DEV_DEPS;
|
|
10
|
+
writeFile(join(projectDir, 'package.json'), JSON.stringify(pkgJson, null, 2) + '\n');
|
|
11
|
+
renderAndWrite('backend/tsconfig.json.ejs', join(projectDir, 'tsconfig.json'), ctx);
|
|
12
|
+
renderAndWrite('backend/tsconfig.build.json.ejs', join(projectDir, 'tsconfig.build.json'), ctx);
|
|
13
|
+
renderAndWrite('backend/nest-cli.json.ejs', join(projectDir, 'nest-cli.json'), ctx);
|
|
14
|
+
renderAndWrite('backend/env.example.ejs', join(projectDir, '.env.example'), ctx);
|
|
15
|
+
const extendedCtx = { ...ctx, toPascalCase };
|
|
16
|
+
renderAndWrite('backend/main.ts.ejs', join(projectDir, 'src', 'main.ts'), extendedCtx);
|
|
17
|
+
renderAndWrite('backend/app.module.ts.ejs', join(projectDir, 'src', 'app.module.ts'), extendedCtx);
|
|
18
|
+
renderAndWrite('backend/data-source.ts.ejs', join(projectDir, 'src', 'data-source.ts'), ctx);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/generators/backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAwB,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,GAAoB;IACtE,MAAM,QAAQ,GAAG,cAAc,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;IACpC,OAAO,CAAC,eAAe,GAAG,gBAAgB,CAAC;IAC3C,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErF,cAAc,CAAC,2BAA2B,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IACpF,cAAc,CAAC,iCAAiC,EAAE,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,EAAE,GAAG,CAAC,CAAC;IAChG,cAAc,CAAC,2BAA2B,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IACpF,cAAc,CAAC,yBAAyB,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,GAAG,CAAC,CAAC;IAEjF,MAAM,WAAW,GAAG,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,CAAC;IAC7C,cAAc,CAAC,qBAAqB,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IACvF,cAAc,CAAC,2BAA2B,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;IACnG,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderAndWrite } from '../utils/template.js';
|
|
3
|
+
export function generateBff(projectDir, ctx) {
|
|
4
|
+
const bffDir = join(projectDir, 'src', 'bff');
|
|
5
|
+
renderAndWrite('backend/bff.module.ts.ejs', join(bffDir, 'bff.module.ts'), ctx);
|
|
6
|
+
renderAndWrite('backend/bff.controller.ts.ejs', join(bffDir, 'bff.controller.ts'), ctx);
|
|
7
|
+
renderAndWrite('backend/bff.service.ts.ejs', join(bffDir, 'bff.service.ts'), ctx);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=bff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bff.js","sourceRoot":"","sources":["../../src/generators/bff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,GAAoB;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,cAAc,CAAC,2BAA2B,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IAChF,cAAc,CAAC,+BAA+B,EAAE,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC;IACxF,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { join, relative } from 'node:path';
|
|
2
|
+
import { readdirSync, readFileSync, chmodSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import ejs from 'ejs';
|
|
6
|
+
import { writeFile } from '../utils/template.js';
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const CLAUDE_TEMPLATES_DIR = join(__dirname, '..', '..', 'templates', 'claude');
|
|
9
|
+
function walkDir(dir) {
|
|
10
|
+
const files = [];
|
|
11
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
12
|
+
const fullPath = join(dir, entry.name);
|
|
13
|
+
if (entry.isDirectory()) {
|
|
14
|
+
files.push(...walkDir(fullPath));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
files.push(fullPath);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return files;
|
|
21
|
+
}
|
|
22
|
+
export function generateClaude(projectDir, ctx) {
|
|
23
|
+
const allFiles = walkDir(CLAUDE_TEMPLATES_DIR);
|
|
24
|
+
for (const srcPath of allFiles) {
|
|
25
|
+
const relPath = relative(CLAUDE_TEMPLATES_DIR, srcPath);
|
|
26
|
+
if (relPath.endsWith('.ejs')) {
|
|
27
|
+
const outputRelPath = relPath.replace(/\.ejs$/, '');
|
|
28
|
+
const outputPath = relPath === 'CLAUDE.md.ejs'
|
|
29
|
+
? join(projectDir, 'CLAUDE.md')
|
|
30
|
+
: join(projectDir, '.claude', outputRelPath);
|
|
31
|
+
const template = readFileSync(srcPath, 'utf-8');
|
|
32
|
+
const content = ejs.render(template, ctx);
|
|
33
|
+
writeFile(outputPath, content);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const outputPath = join(projectDir, '.claude', relPath);
|
|
37
|
+
const content = readFileSync(srcPath, 'utf-8');
|
|
38
|
+
writeFile(outputPath, content);
|
|
39
|
+
if (relPath.startsWith('hooks/') && relPath.endsWith('.sh')) {
|
|
40
|
+
chmodSync(outputPath, 0o755);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/generators/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAY,SAAS,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAwB,MAAM,sBAAsB,CAAC;AAEvE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAEhF,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,GAAoB;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAExD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,OAAO,KAAK,eAAe;gBAC5C,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;YAE/C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1C,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE/B,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderAndWrite } from '../utils/template.js';
|
|
3
|
+
export function generateDocker(projectDir, ctx) {
|
|
4
|
+
renderAndWrite('docker/Dockerfile.ejs', join(projectDir, 'Dockerfile'), ctx);
|
|
5
|
+
renderAndWrite('docker/Dockerfile.client.ejs', join(projectDir, 'client', 'Dockerfile'), ctx);
|
|
6
|
+
renderAndWrite('docker/docker-compose.yml.ejs', join(projectDir, 'docker-compose.yml'), ctx);
|
|
7
|
+
renderAndWrite('docker/docker-compose.test.yml.ejs', join(projectDir, 'docker-compose.test.yml'), ctx);
|
|
8
|
+
renderAndWrite('docker/nginx.conf.ejs', join(projectDir, 'client', 'nginx.conf'), ctx);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,GAAoB;IACrE,cAAc,CAAC,uBAAuB,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7E,cAAc,CAAC,8BAA8B,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F,cAAc,CAAC,+BAA+B,EAAE,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7F,cAAc,CAAC,oCAAoC,EAAE,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,EAAE,GAAG,CAAC,CAAC;IACvG,cAAc,CAAC,uBAAuB,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderAndWrite, writeFile } from '../utils/template.js';
|
|
3
|
+
export function generateE2e(projectDir, ctx) {
|
|
4
|
+
const e2eDir = join(projectDir, 'client', 'e2e');
|
|
5
|
+
writeFile(join(e2eDir, 'auth', '.gitkeep'), '');
|
|
6
|
+
renderAndWrite('frontend/smoke.spec.ts.ejs', join(e2eDir, 'smoke.spec.ts'), ctx);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=e2e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.js","sourceRoot":"","sources":["../../src/generators/e2e.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAwB,MAAM,sBAAsB,CAAC;AAEvF,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,GAAoB;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderAndWrite, renderTemplate, writeFile } from '../utils/template.js';
|
|
3
|
+
import { FRONTEND_DEPS, FRONTEND_DEV_DEPS } from '../deps.js';
|
|
4
|
+
export function generateFrontend(projectDir, ctx) {
|
|
5
|
+
const clientDir = join(projectDir, 'client');
|
|
6
|
+
const rendered = renderTemplate('frontend/package.json.ejs', ctx);
|
|
7
|
+
const pkgJson = JSON.parse(rendered);
|
|
8
|
+
pkgJson.dependencies = FRONTEND_DEPS;
|
|
9
|
+
pkgJson.devDependencies = FRONTEND_DEV_DEPS;
|
|
10
|
+
writeFile(join(clientDir, 'package.json'), JSON.stringify(pkgJson, null, 2) + '\n');
|
|
11
|
+
renderAndWrite('frontend/vite.config.ts.ejs', join(clientDir, 'vite.config.ts'), ctx);
|
|
12
|
+
renderAndWrite('frontend/tsconfig.json.ejs', join(clientDir, 'tsconfig.json'), ctx);
|
|
13
|
+
renderAndWrite('frontend/tsconfig.node.json.ejs', join(clientDir, 'tsconfig.node.json'), ctx);
|
|
14
|
+
renderAndWrite('frontend/postcss.config.js.ejs', join(clientDir, 'postcss.config.js'), ctx);
|
|
15
|
+
renderAndWrite('frontend/tailwind.config.ts.ejs', join(clientDir, 'tailwind.config.ts'), ctx);
|
|
16
|
+
renderAndWrite('frontend/playwright.config.ts.ejs', join(clientDir, 'playwright.config.ts'), ctx);
|
|
17
|
+
renderAndWrite('frontend/index.html.ejs', join(clientDir, 'index.html'), ctx);
|
|
18
|
+
renderAndWrite('frontend/main.tsx.ejs', join(clientDir, 'src', 'main.tsx'), ctx);
|
|
19
|
+
renderAndWrite('frontend/App.tsx.ejs', join(clientDir, 'src', 'App.tsx'), ctx);
|
|
20
|
+
renderAndWrite('frontend/index.css.ejs', join(clientDir, 'src', 'index.css'), ctx);
|
|
21
|
+
renderAndWrite('frontend/vite-env.d.ts.ejs', join(clientDir, 'src', 'vite-env.d.ts'), ctx);
|
|
22
|
+
renderAndWrite('frontend/api-client.ts.ejs', join(clientDir, 'src', 'lib', 'api-client.ts'), ctx);
|
|
23
|
+
renderAndWrite('frontend/utils.ts.ejs', join(clientDir, 'src', 'lib', 'utils.ts'), ctx);
|
|
24
|
+
renderAndWrite('frontend/LoginPage.tsx.ejs', join(clientDir, 'src', 'pages', 'LoginPage.tsx'), ctx);
|
|
25
|
+
renderAndWrite('frontend/DashboardPage.tsx.ejs', join(clientDir, 'src', 'pages', 'DashboardPage.tsx'), ctx);
|
|
26
|
+
renderAndWrite('frontend/NotFoundPage.tsx.ejs', join(clientDir, 'src', 'pages', 'NotFoundPage.tsx'), ctx);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=frontend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../src/generators/frontend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAwB,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,GAAoB;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,cAAc,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC;IACrC,OAAO,CAAC,eAAe,GAAG,iBAAiB,CAAC;IAC5C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpF,cAAc,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC;IACtF,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IACpF,cAAc,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F,cAAc,CAAC,gCAAgC,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5F,cAAc,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F,cAAc,CAAC,mCAAmC,EAAE,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAE,GAAG,CAAC,CAAC;IAClG,cAAc,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IAE9E,cAAc,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IACjF,cAAc,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/E,cAAc,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IACnF,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3F,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IAClG,cAAc,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IAExF,cAAc,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;IACpG,cAAc,CAAC,gCAAgC,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5G,cAAc,CAAC,+BAA+B,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5G,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import ejs from 'ejs';
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { dirname } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { writeFile } from '../utils/template.js';
|
|
8
|
+
import { toPascalCase } from '../utils/validate.js';
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const TEMPLATES_DIR = join(__dirname, '..', '..', 'templates');
|
|
11
|
+
export function generateModules(projectDir, ctx) {
|
|
12
|
+
for (const mod of ctx.modules) {
|
|
13
|
+
const modDir = join(projectDir, 'src', mod);
|
|
14
|
+
mkdirSync(join(modDir, 'commands'), { recursive: true });
|
|
15
|
+
mkdirSync(join(modDir, 'queries'), { recursive: true });
|
|
16
|
+
mkdirSync(join(modDir, 'entities'), { recursive: true });
|
|
17
|
+
mkdirSync(join(modDir, 'dtos'), { recursive: true });
|
|
18
|
+
mkdirSync(join(modDir, 'controllers'), { recursive: true });
|
|
19
|
+
const modulePascal = toPascalCase(mod);
|
|
20
|
+
const template = readFileSync(join(TEMPLATES_DIR, 'backend', 'module.ts.ejs'), 'utf-8');
|
|
21
|
+
const content = ejs.render(template, { modulePascal });
|
|
22
|
+
writeFile(join(modDir, `${mod}.module.ts`), content);
|
|
23
|
+
for (const dir of ['commands', 'queries', 'entities', 'dtos', 'controllers']) {
|
|
24
|
+
writeFile(join(modDir, dir, '.gitkeep'), '');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const timestamp = Date.now().toString();
|
|
28
|
+
const migrationTemplate = readFileSync(join(TEMPLATES_DIR, 'backend', 'create-schema.migration.ts.ejs'), 'utf-8');
|
|
29
|
+
const migrationContent = ejs.render(migrationTemplate, {
|
|
30
|
+
modules: ctx.modules,
|
|
31
|
+
timestamp,
|
|
32
|
+
});
|
|
33
|
+
writeFile(join(projectDir, 'src', 'migrations', `${timestamp}-CreateSchemas.ts`), migrationContent);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/generators/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAwB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE/D,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,GAAoB;IACtE,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAErD,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YAC7E,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACxC,MAAM,iBAAiB,GAAG,YAAY,CACpC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,gCAAgC,CAAC,EAChE,OAAO,CACR,CAAC;IACF,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAAE;QACrD,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS;KACV,CAAC,CAAC;IACH,SAAS,CACP,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,mBAAmB,CAAC,EACtE,gBAAgB,CACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderAndWrite } from '../utils/template.js';
|
|
3
|
+
export function generateRoot(projectDir, ctx) {
|
|
4
|
+
renderAndWrite('root/gitignore.ejs', join(projectDir, '.gitignore'), ctx);
|
|
5
|
+
renderAndWrite('root/prettierrc.ejs', join(projectDir, '.prettierrc'), ctx);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/generators/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,GAAoB;IACnE,cAAc,CAAC,oBAAoB,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1E,cAAc,CAAC,qBAAqB,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { chmodSync } from 'node:fs';
|
|
3
|
+
import { renderAndWrite } from '../utils/template.js';
|
|
4
|
+
export function generateScripts(projectDir, ctx) {
|
|
5
|
+
const initDbPath = join(projectDir, 'scripts', 'init-db.sh');
|
|
6
|
+
renderAndWrite('scripts/init-db.sh.ejs', initDbPath, ctx);
|
|
7
|
+
chmodSync(initDbPath, 0o755);
|
|
8
|
+
renderAndWrite('scripts/save-auth-state.ts.ejs', join(projectDir, 'scripts', 'save-auth-state.ts'), ctx);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/generators/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,GAAoB;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC7D,cAAc,CAAC,wBAAwB,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1D,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE7B,cAAc,CACZ,gCAAgC,EAChC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,oBAAoB,CAAC,EACjD,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { promptForOptions } from './prompts.js';
|
|
4
|
+
import { scaffold } from './scaffold.js';
|
|
5
|
+
const program = new Command();
|
|
6
|
+
program
|
|
7
|
+
.name('create-quanticjs-app')
|
|
8
|
+
.description('Scaffold a QuanticJS project — NestJS + React + Docker')
|
|
9
|
+
.version('0.1.0')
|
|
10
|
+
.argument('[project-name]', 'Project name (kebab-case)')
|
|
11
|
+
.option('-d, --description <desc>', 'Project description')
|
|
12
|
+
.option('-m, --modules <modules>', 'Comma-separated module names')
|
|
13
|
+
.option('--no-install', 'Skip npm install')
|
|
14
|
+
.option('--no-git', 'Skip git init')
|
|
15
|
+
.option('--dry-run', 'Print what would be created without writing')
|
|
16
|
+
.action(async (nameArg, opts) => {
|
|
17
|
+
try {
|
|
18
|
+
const cliModules = opts.modules
|
|
19
|
+
? opts.modules.split(',').map((m) => m.trim()).filter(Boolean)
|
|
20
|
+
: undefined;
|
|
21
|
+
const options = await promptForOptions(nameArg, {
|
|
22
|
+
projectDescription: opts.description,
|
|
23
|
+
modules: cliModules,
|
|
24
|
+
skipInstall: !opts.install,
|
|
25
|
+
skipGit: !opts.git,
|
|
26
|
+
});
|
|
27
|
+
if (opts.dryRun) {
|
|
28
|
+
console.log('Dry run — would create project with:');
|
|
29
|
+
console.log(JSON.stringify(options, null, 2));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
await scaffold(options, process.cwd());
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error(err instanceof Error ? err.message : err);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
program.parse();
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;KACvD,MAAM,CAAC,0BAA0B,EAAE,qBAAqB,CAAC;KACzD,MAAM,CAAC,yBAAyB,EAAE,8BAA8B,CAAC;KACjE,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;KAC1C,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC;KACnC,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,IAAI,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO;YAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACtE,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;YAC9C,kBAAkB,EAAE,IAAI,CAAC,WAAW;YACpC,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO;YAC1B,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG;SACnB,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ProjectOptions {
|
|
2
|
+
projectName: string;
|
|
3
|
+
projectDescription: string;
|
|
4
|
+
modules: string[];
|
|
5
|
+
skipInstall: boolean;
|
|
6
|
+
skipGit: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function promptForOptions(nameArg?: string, cliOpts?: Partial<ProjectOptions>): Promise<ProjectOptions>;
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { validateProjectName, validateModuleName } from './utils/validate.js';
|
|
3
|
+
export async function promptForOptions(nameArg, cliOpts) {
|
|
4
|
+
const answers = await inquirer.prompt([
|
|
5
|
+
{
|
|
6
|
+
type: 'input',
|
|
7
|
+
name: 'projectName',
|
|
8
|
+
message: 'Project name (kebab-case):',
|
|
9
|
+
default: nameArg,
|
|
10
|
+
when: !nameArg,
|
|
11
|
+
validate: validateProjectName,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
type: 'input',
|
|
15
|
+
name: 'projectDescription',
|
|
16
|
+
message: 'Project description:',
|
|
17
|
+
default: 'A QuanticJS application',
|
|
18
|
+
when: !cliOpts?.projectDescription,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
type: 'input',
|
|
22
|
+
name: 'modulesRaw',
|
|
23
|
+
message: 'Initial modules (comma-separated, e.g. change-request,estimation):',
|
|
24
|
+
when: !cliOpts?.modules,
|
|
25
|
+
validate: (input) => {
|
|
26
|
+
if (!input.trim())
|
|
27
|
+
return 'At least one module is required';
|
|
28
|
+
const mods = input.split(',').map((m) => m.trim());
|
|
29
|
+
for (const mod of mods) {
|
|
30
|
+
const result = validateModuleName(mod);
|
|
31
|
+
if (result !== true)
|
|
32
|
+
return `Module "${mod}": ${result}`;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
]);
|
|
38
|
+
const projectName = nameArg ?? answers.projectName;
|
|
39
|
+
const projectDescription = cliOpts?.projectDescription ?? answers.projectDescription ?? 'A QuanticJS application';
|
|
40
|
+
const modules = cliOpts?.modules ??
|
|
41
|
+
answers.modulesRaw
|
|
42
|
+
.split(',')
|
|
43
|
+
.map((m) => m.trim())
|
|
44
|
+
.filter(Boolean);
|
|
45
|
+
return {
|
|
46
|
+
projectName,
|
|
47
|
+
projectDescription,
|
|
48
|
+
modules,
|
|
49
|
+
skipInstall: cliOpts?.skipInstall ?? false,
|
|
50
|
+
skipGit: cliOpts?.skipGit ?? false,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAU9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgB,EAChB,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,CAAC,OAAO;YACd,QAAQ,EAAE,mBAAmB;SAC9B;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,yBAAyB;YAClC,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB;SACnC;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,oEAAoE;YAC7E,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO;YACvB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;oBAAE,OAAO,iCAAiC,CAAC;gBAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;oBACvC,IAAI,MAAM,KAAK,IAAI;wBAAE,OAAO,WAAW,GAAG,MAAM,MAAM,EAAE,CAAC;gBAC3D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF;KACF,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IACnD,MAAM,kBAAkB,GACtB,OAAO,EAAE,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,IAAI,yBAAyB,CAAC;IACzF,MAAM,OAAO,GACX,OAAO,EAAE,OAAO;QACf,OAAO,CAAC,UAAqB;aAC3B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO;QACL,WAAW;QACX,kBAAkB;QAClB,OAAO;QACP,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,KAAK;QAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK;KACnC,CAAC;AACJ,CAAC"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { toUnderscored, toPascalCase } from './utils/validate.js';
|
|
5
|
+
import { run } from './utils/exec.js';
|
|
6
|
+
import { generateRoot } from './generators/root.js';
|
|
7
|
+
import { generateBackend } from './generators/backend.js';
|
|
8
|
+
import { generateBff } from './generators/bff.js';
|
|
9
|
+
import { generateModules } from './generators/module.js';
|
|
10
|
+
import { generateFrontend } from './generators/frontend.js';
|
|
11
|
+
import { generateDocker } from './generators/docker.js';
|
|
12
|
+
import { generateScripts } from './generators/scripts.js';
|
|
13
|
+
import { generateE2e } from './generators/e2e.js';
|
|
14
|
+
import { generateClaude } from './generators/claude.js';
|
|
15
|
+
export async function scaffold(options, outputDir) {
|
|
16
|
+
const projectDir = join(outputDir, options.projectName);
|
|
17
|
+
if (existsSync(projectDir)) {
|
|
18
|
+
throw new Error(`Directory "${projectDir}" already exists`);
|
|
19
|
+
}
|
|
20
|
+
const ctx = {
|
|
21
|
+
projectName: options.projectName,
|
|
22
|
+
projectDescription: options.projectDescription,
|
|
23
|
+
projectNameUnderscored: toUnderscored(options.projectName),
|
|
24
|
+
projectNamePascal: toPascalCase(options.projectName),
|
|
25
|
+
modules: options.modules,
|
|
26
|
+
};
|
|
27
|
+
const spinner = ora();
|
|
28
|
+
spinner.start('Generating root files');
|
|
29
|
+
generateRoot(projectDir, ctx);
|
|
30
|
+
spinner.succeed();
|
|
31
|
+
spinner.start('Generating backend');
|
|
32
|
+
generateBackend(projectDir, ctx);
|
|
33
|
+
spinner.succeed();
|
|
34
|
+
spinner.start('Generating BFF auth module');
|
|
35
|
+
generateBff(projectDir, ctx);
|
|
36
|
+
spinner.succeed();
|
|
37
|
+
spinner.start(`Generating modules: ${options.modules.join(', ')}`);
|
|
38
|
+
generateModules(projectDir, ctx);
|
|
39
|
+
spinner.succeed();
|
|
40
|
+
spinner.start('Generating frontend');
|
|
41
|
+
generateFrontend(projectDir, ctx);
|
|
42
|
+
spinner.succeed();
|
|
43
|
+
spinner.start('Generating Docker files');
|
|
44
|
+
generateDocker(projectDir, ctx);
|
|
45
|
+
spinner.succeed();
|
|
46
|
+
spinner.start('Generating scripts');
|
|
47
|
+
generateScripts(projectDir, ctx);
|
|
48
|
+
spinner.succeed();
|
|
49
|
+
spinner.start('Generating E2E setup');
|
|
50
|
+
generateE2e(projectDir, ctx);
|
|
51
|
+
spinner.succeed();
|
|
52
|
+
spinner.start('Generating .claude config (rules, skills, hooks)');
|
|
53
|
+
generateClaude(projectDir, ctx);
|
|
54
|
+
spinner.succeed();
|
|
55
|
+
if (!options.skipInstall) {
|
|
56
|
+
spinner.start('Installing backend dependencies');
|
|
57
|
+
run('npm install', projectDir);
|
|
58
|
+
spinner.succeed();
|
|
59
|
+
spinner.start('Installing frontend dependencies');
|
|
60
|
+
run('npm install', join(projectDir, 'client'));
|
|
61
|
+
spinner.succeed();
|
|
62
|
+
}
|
|
63
|
+
if (!options.skipGit) {
|
|
64
|
+
spinner.start('Initializing git repository');
|
|
65
|
+
run('git init', projectDir);
|
|
66
|
+
run('git add -A', projectDir);
|
|
67
|
+
run('git commit -m "chore: scaffold QuanticJS project"', projectDir);
|
|
68
|
+
spinner.succeed();
|
|
69
|
+
}
|
|
70
|
+
console.log('');
|
|
71
|
+
console.log(` Project created at ${projectDir}`);
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(' Next steps:');
|
|
74
|
+
console.log(` cd ${options.projectName}`);
|
|
75
|
+
console.log(' docker compose up # Start infrastructure');
|
|
76
|
+
console.log(' cd client && npm run dev # Start frontend');
|
|
77
|
+
console.log('');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
export function run(cmd, cwd) {
|
|
3
|
+
execSync(cmd, { cwd, stdio: 'pipe' });
|
|
4
|
+
}
|
|
5
|
+
export function tryRun(cmd, cwd) {
|
|
6
|
+
try {
|
|
7
|
+
run(cmd, cwd);
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW;IAC1C,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,GAAW;IAC7C,IAAI,CAAC;QACH,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|