forgestack-os-cli 0.1.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.
Files changed (82) hide show
  1. package/dist/commands/create.d.ts +1 -0
  2. package/dist/commands/create.d.ts.map +1 -0
  3. package/dist/commands/create.js +78 -0
  4. package/dist/commands/create.js.map +1 -0
  5. package/dist/generators/api.d.ts +3 -0
  6. package/dist/generators/api.d.ts.map +1 -0
  7. package/dist/generators/api.js +346 -0
  8. package/dist/generators/api.js.map +1 -0
  9. package/dist/generators/auth.d.ts +2 -0
  10. package/dist/generators/auth.d.ts.map +1 -0
  11. package/dist/generators/auth.js +371 -0
  12. package/dist/generators/auth.js.map +1 -0
  13. package/dist/generators/backend.d.ts +2 -0
  14. package/dist/generators/backend.d.ts.map +1 -0
  15. package/dist/generators/backend.js +875 -0
  16. package/dist/generators/backend.js.map +1 -0
  17. package/dist/generators/common.d.ts +2 -0
  18. package/dist/generators/common.d.ts.map +1 -0
  19. package/dist/generators/common.js +354 -0
  20. package/dist/generators/common.js.map +1 -0
  21. package/dist/generators/database.d.ts +2 -0
  22. package/dist/generators/database.d.ts.map +1 -0
  23. package/dist/generators/database.js +157 -0
  24. package/dist/generators/database.js.map +1 -0
  25. package/dist/generators/docker.d.ts +2 -0
  26. package/dist/generators/docker.d.ts.map +1 -0
  27. package/dist/generators/docker.js +181 -0
  28. package/dist/generators/docker.js.map +1 -0
  29. package/dist/generators/frontend-helpers.d.ts +3 -0
  30. package/dist/generators/frontend-helpers.d.ts.map +1 -0
  31. package/dist/generators/frontend-helpers.js +23 -0
  32. package/dist/generators/frontend-helpers.js.map +1 -0
  33. package/dist/generators/frontend.d.ts +2 -0
  34. package/dist/generators/frontend.d.ts.map +1 -0
  35. package/dist/generators/frontend.js +735 -0
  36. package/dist/generators/frontend.js.map +1 -0
  37. package/dist/generators/index.d.ts +2 -0
  38. package/dist/generators/index.d.ts.map +1 -0
  39. package/dist/generators/index.js +59 -0
  40. package/dist/generators/index.js.map +1 -0
  41. package/dist/generators/nextjs-helpers.d.ts +6 -0
  42. package/dist/generators/nextjs-helpers.d.ts.map +1 -0
  43. package/dist/generators/nextjs-helpers.js +216 -0
  44. package/dist/generators/nextjs-helpers.js.map +1 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +24 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/types.d.ts +15 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +3 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/utils/logger.d.ts +9 -0
  54. package/dist/utils/logger.d.ts.map +1 -0
  55. package/dist/utils/logger.js +32 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/prompts.d.ts +2 -0
  58. package/dist/utils/prompts.d.ts.map +1 -0
  59. package/dist/utils/prompts.js +107 -0
  60. package/dist/utils/prompts.js.map +1 -0
  61. package/dist/utils/validators.d.ts +2 -0
  62. package/dist/utils/validators.d.ts.map +1 -0
  63. package/dist/utils/validators.js +48 -0
  64. package/dist/utils/validators.js.map +1 -0
  65. package/package.json +49 -0
  66. package/src/commands/create.ts +82 -0
  67. package/src/generators/api.ts +353 -0
  68. package/src/generators/auth.ts +406 -0
  69. package/src/generators/backend.ts +927 -0
  70. package/src/generators/common.ts +377 -0
  71. package/src/generators/database.ts +165 -0
  72. package/src/generators/docker.ts +185 -0
  73. package/src/generators/frontend.ts +783 -0
  74. package/src/generators/index.ts +64 -0
  75. package/src/index.ts +27 -0
  76. package/src/types.ts +16 -0
  77. package/src/utils/logger.ts +31 -0
  78. package/src/utils/prompts.ts +105 -0
  79. package/src/utils/validators.ts +50 -0
  80. package/tests/validators.test.ts +69 -0
  81. package/tsc_output.txt +0 -0
  82. package/tsconfig.json +21 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateDocker = generateDocker;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ async function generateDocker(config, targetDir) {
10
+ const dockerDir = path_1.default.join(targetDir, 'docker');
11
+ await fs_extra_1.default.ensureDir(dockerDir);
12
+ // Frontend Dockerfile
13
+ const frontendDockerfile = `FROM node:20-alpine AS builder
14
+
15
+ WORKDIR /app
16
+
17
+ COPY package*.json ./
18
+ RUN npm install
19
+
20
+ COPY . .
21
+ RUN npm run build
22
+
23
+ FROM nginx:alpine
24
+
25
+ COPY --from=builder /app/dist /usr/share/nginx/html
26
+ COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
27
+
28
+ EXPOSE 80
29
+
30
+ CMD ["nginx", "-g", "daemon off;"]
31
+ `;
32
+ await fs_extra_1.default.writeFile(path_1.default.join(dockerDir, 'frontend.Dockerfile'), frontendDockerfile);
33
+ // Backend Dockerfile
34
+ const backendDockerfile = `FROM node:20-alpine
35
+
36
+ WORKDIR /app
37
+
38
+ COPY package*.json ./
39
+ RUN npm install --only=production
40
+
41
+ COPY . .
42
+ RUN npm run build
43
+
44
+ EXPOSE 3000
45
+
46
+ CMD ["node", "dist/index.js"]
47
+ `;
48
+ await fs_extra_1.default.writeFile(path_1.default.join(dockerDir, 'backend.Dockerfile'), backendDockerfile);
49
+ // Nginx config for frontend
50
+ const nginxConf = `server {
51
+ listen 80;
52
+ server_name localhost;
53
+ root /usr/share/nginx/html;
54
+ index index.html;
55
+
56
+ location / {
57
+ try_files $uri $uri/ /index.html;
58
+ }
59
+
60
+ location /api {
61
+ proxy_pass http://backend:3000;
62
+ proxy_http_version 1.1;
63
+ proxy_set_header Upgrade $http_upgrade;
64
+ proxy_set_header Connection 'upgrade';
65
+ proxy_set_header Host $host;
66
+ proxy_cache_bypass $http_upgrade;
67
+ }
68
+ }
69
+ `;
70
+ await fs_extra_1.default.writeFile(path_1.default.join(dockerDir, 'nginx.conf'), nginxConf);
71
+ // Docker Compose
72
+ const dockerCompose = getDockerCompose(config);
73
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'docker-compose.yml'), dockerCompose);
74
+ // .dockerignore
75
+ const dockerignore = `node_modules
76
+ npm-debug.log
77
+ .env
78
+ .env.local
79
+ .git
80
+ .gitignore
81
+ README.md
82
+ .vscode
83
+ .idea
84
+ dist
85
+ build
86
+ coverage
87
+ `;
88
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, '.dockerignore'), dockerignore);
89
+ }
90
+ function getDockerCompose(config) {
91
+ let services = `version: '3.8'
92
+
93
+ services:
94
+ frontend:
95
+ build:
96
+ context: ./frontend
97
+ dockerfile: ../docker/frontend.Dockerfile
98
+ ports:
99
+ - "80:80"
100
+ depends_on:
101
+ - backend
102
+ environment:
103
+ - VITE_API_URL=http://localhost:3000/api
104
+
105
+ backend:
106
+ build:
107
+ context: ./backend
108
+ dockerfile: ../docker/backend.Dockerfile
109
+ ports:
110
+ - "3000:3000"
111
+ environment:
112
+ - NODE_ENV=production
113
+ - PORT=3000
114
+ - DATABASE_URL=${config.database === 'postgresql' ? `postgresql://postgres:postgres@postgres:5432/${config.projectName}` : config.database === 'mongodb' ? `mongodb://mongo:mongo@mongodb:27017/${config.projectName}` : config.database === 'mysql' ? `mysql://root:mysql@mysql:3306/${config.projectName}` : '${DATABASE_URL}'}
115
+ - JWT_SECRET=\${JWT_SECRET}
116
+ depends_on:
117
+ `;
118
+ // Add database service
119
+ if (config.database === 'postgresql') {
120
+ services += ` - postgres
121
+
122
+ postgres:
123
+ image: postgres:16-alpine
124
+ ports:
125
+ - "5432:5432"
126
+ environment:
127
+ - POSTGRES_USER=postgres
128
+ - POSTGRES_PASSWORD=postgres
129
+ - POSTGRES_DB=${config.projectName}
130
+ volumes:
131
+ - postgres_data:/var/lib/postgresql/data
132
+
133
+ volumes:
134
+ postgres_data:
135
+ `;
136
+ }
137
+ else if (config.database === 'mongodb') {
138
+ services += ` - mongodb
139
+
140
+ mongodb:
141
+ image: mongo:7
142
+ ports:
143
+ - "27017:27017"
144
+ environment:
145
+ - MONGO_INITDB_ROOT_USERNAME=mongo
146
+ - MONGO_INITDB_ROOT_PASSWORD=mongo
147
+ - MONGO_INITDB_DATABASE=${config.projectName}
148
+ volumes:
149
+ - mongodb_data:/data/db
150
+
151
+ volumes:
152
+ mongodb_data:
153
+ `;
154
+ }
155
+ else if (config.database === 'mysql') {
156
+ services += ` - mysql
157
+
158
+ mysql:
159
+ image: mysql:8
160
+ ports:
161
+ - "3306:3306"
162
+ environment:
163
+ - MYSQL_ROOT_PASSWORD=mysql
164
+ - MYSQL_DATABASE=${config.projectName}
165
+ volumes:
166
+ - mysql_data:/var/lib/mysql
167
+
168
+ volumes:
169
+ mysql_data:
170
+ `;
171
+ }
172
+ else {
173
+ services += ` # Add your database service here
174
+
175
+ volumes:
176
+ data:
177
+ `;
178
+ }
179
+ return services;
180
+ }
181
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":";;;;;AAIA,wCAyFC;AA7FD,gDAAwB;AACxB,wDAA0B;AAGnB,KAAK,UAAU,cAAc,CAAC,MAAmB,EAAE,SAAiB;IACzE,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAE9B,sBAAsB;IACtB,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;CAkB5B,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAEpF,qBAAqB;IACrB,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;CAa3B,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAElF,4BAA4B;IAC5B,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;IAElE,iBAAiB;IACjB,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,aAAa,CAAC,CAAC;IAE9E,gBAAgB;IAChB,MAAM,YAAY,GAAG;;;;;;;;;;;;CAYtB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,YAAY,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAmB;IAC3C,IAAI,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;uBAuBM,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,gDAAgD,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,uCAAuC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iCAAiC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,iBAAiB;;;CAGrU,CAAC;IAEA,uBAAuB;IACvB,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,QAAQ,IAAI;;;;;;;;;sBASM,MAAM,CAAC,WAAW;;;;;;CAMvC,CAAC;IACA,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,QAAQ,IAAI;;;;;;;;;gCASgB,MAAM,CAAC,WAAW;;;;;;CAMjD,CAAC;IACA,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvC,QAAQ,IAAI;;;;;;;;yBAQS,MAAM,CAAC,WAAW;;;;;;CAM1C,CAAC;IACA,CAAC;SAAM,CAAC;QACN,QAAQ,IAAI;;;;CAIf,CAAC;IACA,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { StackConfig } from '../types';
2
+ export declare function generateFrontend(config: StackConfig, frontendDir: string): Promise<void>;
3
+ //# sourceMappingURL=frontend-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-helpers.d.ts","sourceRoot":"","sources":["../../src/generators/frontend-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAiB9E"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateFrontend = generateFrontend;
4
+ async function generateFrontend(config, frontendDir) {
5
+ switch (config.frontend) {
6
+ case 'react-vite':
7
+ await generateReactVite(config, frontendDir);
8
+ break;
9
+ case 'nextjs':
10
+ await generateNextJS(config, frontendDir);
11
+ break;
12
+ case 'vue-vite':
13
+ await generateVueVite(config, frontendDir);
14
+ break;
15
+ case 'sveltekit':
16
+ await generateSvelteKit(config, frontendDir);
17
+ break;
18
+ default:
19
+ throw new Error(`Unsupported frontend: ${config.frontend}`);
20
+ }
21
+ }
22
+ // React + Vite generator (existing code continues...)
23
+ //# sourceMappingURL=frontend-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-helpers.js","sourceRoot":"","sources":["../../src/generators/frontend-helpers.ts"],"names":[],"mappings":";;AAIA,4CAiBC;AAjBM,KAAK,UAAU,gBAAgB,CAAC,MAAmB,EAAE,WAAmB;IAC3E,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,YAAY;YACb,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM;QACV,KAAK,QAAQ;YACT,MAAM,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1C,MAAM;QACV,KAAK,UAAU;YACX,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM;QACV,KAAK,WAAW;YACZ,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM;QACV;YACI,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;AACL,CAAC;AAED,sDAAsD"}
@@ -0,0 +1,2 @@
1
+ import { StackConfig } from '../types';
2
+ export declare function generateFrontend(config: StackConfig, frontendDir: string): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.d.ts","sourceRoot":"","sources":["../../src/generators/frontend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAoB9E"}