@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.
Files changed (136) hide show
  1. package/dist/deps.d.ts +4 -0
  2. package/dist/deps.js +97 -0
  3. package/dist/deps.js.map +1 -0
  4. package/dist/generators/backend.d.ts +2 -0
  5. package/dist/generators/backend.js +20 -0
  6. package/dist/generators/backend.js.map +1 -0
  7. package/dist/generators/bff.d.ts +2 -0
  8. package/dist/generators/bff.js +9 -0
  9. package/dist/generators/bff.js.map +1 -0
  10. package/dist/generators/claude.d.ts +2 -0
  11. package/dist/generators/claude.js +45 -0
  12. package/dist/generators/claude.js.map +1 -0
  13. package/dist/generators/docker.d.ts +2 -0
  14. package/dist/generators/docker.js +10 -0
  15. package/dist/generators/docker.js.map +1 -0
  16. package/dist/generators/e2e.d.ts +2 -0
  17. package/dist/generators/e2e.js +8 -0
  18. package/dist/generators/e2e.js.map +1 -0
  19. package/dist/generators/frontend.d.ts +2 -0
  20. package/dist/generators/frontend.js +28 -0
  21. package/dist/generators/frontend.js.map +1 -0
  22. package/dist/generators/module.d.ts +2 -0
  23. package/dist/generators/module.js +35 -0
  24. package/dist/generators/module.js.map +1 -0
  25. package/dist/generators/root.d.ts +2 -0
  26. package/dist/generators/root.js +7 -0
  27. package/dist/generators/root.js.map +1 -0
  28. package/dist/generators/scripts.d.ts +2 -0
  29. package/dist/generators/scripts.js +10 -0
  30. package/dist/generators/scripts.js.map +1 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +40 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/prompts.d.ts +8 -0
  35. package/dist/prompts.js +53 -0
  36. package/dist/prompts.js.map +1 -0
  37. package/dist/scaffold.d.ts +2 -0
  38. package/dist/scaffold.js +79 -0
  39. package/dist/scaffold.js.map +1 -0
  40. package/dist/utils/exec.d.ts +2 -0
  41. package/dist/utils/exec.js +14 -0
  42. package/dist/utils/exec.js.map +1 -0
  43. package/dist/utils/template.d.ts +10 -0
  44. package/dist/utils/template.js +20 -0
  45. package/dist/utils/template.js.map +1 -0
  46. package/dist/utils/validate.d.ts +4 -0
  47. package/dist/utils/validate.js +27 -0
  48. package/dist/utils/validate.js.map +1 -0
  49. package/package.json +50 -0
  50. package/templates/backend/app.module.ts.ejs +61 -0
  51. package/templates/backend/bff.controller.ts.ejs +60 -0
  52. package/templates/backend/bff.module.ts.ejs +10 -0
  53. package/templates/backend/bff.service.ts.ejs +6 -0
  54. package/templates/backend/create-schema.migration.ts.ejs +15 -0
  55. package/templates/backend/data-source.ts.ejs +13 -0
  56. package/templates/backend/env.example.ejs +30 -0
  57. package/templates/backend/main.ts.ejs +43 -0
  58. package/templates/backend/module.ts.ejs +14 -0
  59. package/templates/backend/nest-cli.json.ejs +8 -0
  60. package/templates/backend/package.json.ejs +23 -0
  61. package/templates/backend/tsconfig.build.json.ejs +4 -0
  62. package/templates/backend/tsconfig.json.ejs +24 -0
  63. package/templates/claude/CLAUDE.md.ejs +86 -0
  64. package/templates/claude/hooks/auto-format.sh +22 -0
  65. package/templates/claude/hooks/check-secrets.sh +49 -0
  66. package/templates/claude/hooks/guard-destructive.sh +42 -0
  67. package/templates/claude/hooks/on-compaction.sh +29 -0
  68. package/templates/claude/mcp.json +10 -0
  69. package/templates/claude/rules/api-patterns.md +86 -0
  70. package/templates/claude/rules/auth-patterns.md +109 -0
  71. package/templates/claude/rules/backend-patterns.md +421 -0
  72. package/templates/claude/rules/database-patterns.md +96 -0
  73. package/templates/claude/rules/docker-patterns.md +86 -0
  74. package/templates/claude/rules/frontend-patterns.md +262 -0
  75. package/templates/claude/rules/observability-backend.md +132 -0
  76. package/templates/claude/rules/observability-frontend.md +49 -0
  77. package/templates/claude/rules/playwright-mcp.md +80 -0
  78. package/templates/claude/rules/resilience-ops.md +103 -0
  79. package/templates/claude/rules/testing-e2e-ui.md +190 -0
  80. package/templates/claude/rules/testing-patterns.md +94 -0
  81. package/templates/claude/rules/workflow-backend.md +64 -0
  82. package/templates/claude/rules/workflow-frontend.md +60 -0
  83. package/templates/claude/settings.json +68 -0
  84. package/templates/claude/skills/add-api-endpoint/SKILL.md +59 -0
  85. package/templates/claude/skills/add-auth-endpoint/SKILL.md +68 -0
  86. package/templates/claude/skills/add-entity/SKILL.md +56 -0
  87. package/templates/claude/skills/add-event/SKILL.md +127 -0
  88. package/templates/claude/skills/add-feature/SKILL.md +20 -0
  89. package/templates/claude/skills/add-frontend-page/SKILL.md +75 -0
  90. package/templates/claude/skills/add-handler/SKILL.md +105 -0
  91. package/templates/claude/skills/add-integration/SKILL.md +176 -0
  92. package/templates/claude/skills/add-migration/SKILL.md +20 -0
  93. package/templates/claude/skills/add-module/SKILL.md +89 -0
  94. package/templates/claude/skills/add-realtime/SKILL.md +119 -0
  95. package/templates/claude/skills/audit-rules/SKILL.md +120 -0
  96. package/templates/claude/skills/debugging/SKILL.md +105 -0
  97. package/templates/claude/skills/docker-dev/SKILL.md +86 -0
  98. package/templates/claude/skills/e2e-audit/SKILL.md +85 -0
  99. package/templates/claude/skills/e2e-full/SKILL.md +132 -0
  100. package/templates/claude/skills/e2e-scan/SKILL.md +171 -0
  101. package/templates/claude/skills/e2e-verify/SKILL.md +145 -0
  102. package/templates/claude/skills/fix-bug/SKILL.md +33 -0
  103. package/templates/claude/skills/implement-spec/SKILL.md +98 -0
  104. package/templates/claude/skills/review-code/SKILL.md +109 -0
  105. package/templates/claude/skills/review-spec/SKILL.md +216 -0
  106. package/templates/claude/skills/run-tests/SKILL.md +37 -0
  107. package/templates/claude/skills/specify/SKILL.md +87 -0
  108. package/templates/claude/skills/write-backend-tests/SKILL.md +182 -0
  109. package/templates/claude/skills/write-ui-tests/SKILL.md +118 -0
  110. package/templates/docker/Dockerfile.client.ejs +14 -0
  111. package/templates/docker/Dockerfile.ejs +28 -0
  112. package/templates/docker/docker-compose.test.yml.ejs +54 -0
  113. package/templates/docker/docker-compose.yml.ejs +76 -0
  114. package/templates/docker/nginx.conf.ejs +21 -0
  115. package/templates/frontend/App.tsx.ejs +64 -0
  116. package/templates/frontend/DashboardPage.tsx.ejs +37 -0
  117. package/templates/frontend/LoginPage.tsx.ejs +20 -0
  118. package/templates/frontend/NotFoundPage.tsx.ejs +15 -0
  119. package/templates/frontend/api-client.ts.ejs +15 -0
  120. package/templates/frontend/index.css.ejs +57 -0
  121. package/templates/frontend/index.html.ejs +13 -0
  122. package/templates/frontend/main.tsx.ejs +10 -0
  123. package/templates/frontend/package.json.ejs +16 -0
  124. package/templates/frontend/playwright.config.ts.ejs +20 -0
  125. package/templates/frontend/postcss.config.js.ejs +3 -0
  126. package/templates/frontend/smoke.spec.ts.ejs +37 -0
  127. package/templates/frontend/tailwind.config.ts.ejs +56 -0
  128. package/templates/frontend/tsconfig.json.ejs +25 -0
  129. package/templates/frontend/tsconfig.node.json.ejs +15 -0
  130. package/templates/frontend/utils.ts.ejs +6 -0
  131. package/templates/frontend/vite-env.d.ts.ejs +1 -0
  132. package/templates/frontend/vite.config.ts.ejs +20 -0
  133. package/templates/root/gitignore.ejs +9 -0
  134. package/templates/root/prettierrc.ejs +7 -0
  135. package/templates/scripts/init-db.sh.ejs +8 -0
  136. package/templates/scripts/save-auth-state.ts.ejs +24 -0
package/dist/deps.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare const BACKEND_DEPS: Record<string, string>;
2
+ export declare const BACKEND_DEV_DEPS: Record<string, string>;
3
+ export declare const FRONTEND_DEPS: Record<string, string>;
4
+ export declare const FRONTEND_DEV_DEPS: Record<string, string>;
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateBackend(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateBff(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateClaude(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateDocker(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateE2e(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateFrontend(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateModules(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateRoot(projectDir: string, ctx: TemplateContext): void;
@@ -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,2 @@
1
+ import { type TemplateContext } from '../utils/template.js';
2
+ export declare function generateScripts(projectDir: string, ctx: TemplateContext): void;
@@ -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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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>;
@@ -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"}
@@ -0,0 +1,2 @@
1
+ import type { ProjectOptions } from './prompts.js';
2
+ export declare function scaffold(options: ProjectOptions, outputDir: string): Promise<void>;
@@ -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,2 @@
1
+ export declare function run(cmd: string, cwd: string): void;
2
+ export declare function tryRun(cmd: string, cwd: string): boolean;
@@ -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"}