@abdul53245/create-dev-stack 1.0.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.
@@ -0,0 +1,180 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ export async function generateORM(config, packagesDir) {
5
+ if (!config.orm || config.orm === 'none' || !config.database || config.database === 'none') {
6
+ return;
7
+ }
8
+ const dbDir = path.join(packagesDir, 'database');
9
+ await fs.ensureDir(dbDir);
10
+ await fs.ensureDir(path.join(dbDir, 'src'));
11
+ switch (config.orm) {
12
+ case 'prisma':
13
+ await setupPrisma(config, dbDir);
14
+ break;
15
+ case 'drizzle':
16
+ await setupDrizzle(config, dbDir);
17
+ break;
18
+ case 'typeorm':
19
+ await setupTypeORM(config, dbDir);
20
+ break;
21
+ }
22
+ }
23
+ async function setupPrisma(config, dbDir) {
24
+ const provider = config.database === 'postgres' ? 'postgresql' : config.database === 'mysql' ? 'mysql' : config.database === 'mongodb' ? 'mongodb' : 'postgresql';
25
+ const packageJson = {
26
+ name: '@app/database',
27
+ version: '1.0.0',
28
+ private: true,
29
+ type: 'module',
30
+ scripts: {
31
+ 'db:generate': 'prisma generate',
32
+ 'db:push': 'prisma db push',
33
+ },
34
+ dependencies: {
35
+ '@prisma/client': '^5.4.1',
36
+ },
37
+ devDependencies: {
38
+ prisma: '^5.4.1',
39
+ tsx: '^4.19.2',
40
+ typescript: '^5.6.3',
41
+ },
42
+ };
43
+ const schema = `generator client {
44
+ provider = "prisma-client-js"
45
+ }
46
+
47
+ datasource db {
48
+ provider = "${provider}"
49
+ url = env("DATABASE_URL")
50
+ }
51
+
52
+ model User {
53
+ id String @id @default(uuid())
54
+ email String @unique
55
+ name String?
56
+ createdAt DateTime @default(now())
57
+ }
58
+ `;
59
+ const indexTs = `import { PrismaClient } from '@prisma/client';
60
+
61
+ export const prisma = new PrismaClient();
62
+ `;
63
+ await fs.writeFile(path.join(dbDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\n');
64
+ await fs.ensureDir(path.join(dbDir, 'prisma'));
65
+ await fs.writeFile(path.join(dbDir, 'prisma', 'schema.prisma'), schema);
66
+ await fs.writeFile(path.join(dbDir, 'src', 'index.ts'), indexTs);
67
+ }
68
+ async function setupDrizzle(config, dbDir) {
69
+ const packageJson = {
70
+ name: '@app/database',
71
+ version: '1.0.0',
72
+ private: true,
73
+ type: 'module',
74
+ scripts: {
75
+ 'db:generate': 'drizzle-kit generate',
76
+ 'db:push': 'drizzle-kit push',
77
+ },
78
+ dependencies: {
79
+ 'drizzle-orm': '^0.36.0',
80
+ },
81
+ devDependencies: {
82
+ 'drizzle-kit': '^0.27.0',
83
+ typescript: '^5.6.3',
84
+ },
85
+ };
86
+ const drizzleConfig = `import { defineConfig } from 'drizzle-kit';
87
+
88
+ export default defineConfig({
89
+ schema: './src/schema.ts',
90
+ out: './drizzle',
91
+ dialect: '${config.database === 'postgres' ? 'postgresql' : 'mysql'}',
92
+ dbCredentials: {
93
+ url: process.env.DATABASE_URL!,
94
+ },
95
+ verbose: true,
96
+ strict: true,
97
+ });
98
+ `;
99
+ const schemaTs = config.database === 'postgres'
100
+ ? `import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
101
+
102
+ export const users = pgTable('users', {
103
+ id: serial('id').primaryKey(),
104
+ name: text('name'),
105
+ email: text('email').notNull().unique(),
106
+ createdAt: timestamp('created_at').defaultNow().notNull(),
107
+ });
108
+ `
109
+ : `import { mysqlTable, serial, varchar, timestamp } from 'drizzle-orm/mysql-core';
110
+
111
+ export const users = mysqlTable('users', {
112
+ id: serial('id').primaryKey(),
113
+ name: varchar('name', { length: 255 }),
114
+ email: varchar('email', { length: 255 }).notNull().unique(),
115
+ createdAt: timestamp('created_at').defaultNow().notNull(),
116
+ });
117
+ `;
118
+ const indexTs = `export * from './schema.js';
119
+ `;
120
+ await fs.writeFile(path.join(dbDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\n');
121
+ await fs.writeFile(path.join(dbDir, 'drizzle.config.ts'), drizzleConfig);
122
+ await fs.writeFile(path.join(dbDir, 'src', 'schema.ts'), schemaTs);
123
+ await fs.writeFile(path.join(dbDir, 'src', 'index.ts'), indexTs);
124
+ }
125
+ async function setupTypeORM(config, dbDir) {
126
+ const packageJson = {
127
+ name: '@app/database',
128
+ version: '1.0.0',
129
+ private: true,
130
+ type: 'module',
131
+ scripts: {
132
+ typeorm: 'typeorm-ts-node-commonjs',
133
+ },
134
+ dependencies: {
135
+ reflect_metadata: '^0.2.1',
136
+ typeorm: '^0.3.9',
137
+ },
138
+ devDependencies: {
139
+ typescript: '^5.6.3',
140
+ },
141
+ };
142
+ const driver = config.database === 'postgres' ? 'postgres' : config.database === 'mysql' ? 'mysql' : 'mongodb';
143
+ const userEntity = `import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm';
144
+
145
+ @Entity()
146
+ export class User {
147
+ @PrimaryGeneratedColumn('uuid')
148
+ id!: string;
149
+
150
+ @Column()
151
+ name!: string;
152
+
153
+ @Column({ unique: true })
154
+ email!: string;
155
+
156
+ @CreateDateColumn()
157
+ createdAt!: Date;
158
+ }
159
+ `;
160
+ const dataSource = `import 'reflect-metadata';
161
+ import { DataSource } from 'typeorm';
162
+ import { User } from './entity/User.js';
163
+
164
+ export const AppDataSource = new DataSource({
165
+ type: '${driver}',
166
+ url: process.env.DATABASE_URL,
167
+ synchronize: true,
168
+ logging: false,
169
+ entities: [User],
170
+ migrations: [],
171
+ subscribers: [],
172
+ });
173
+ `;
174
+ await fs.writeFile(path.join(dbDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\n');
175
+ await fs.ensureDir(path.join(dbDir, 'src', 'entity'));
176
+ await fs.writeFile(path.join(dbDir, 'src', 'entity', 'User.ts'), userEntity);
177
+ await fs.writeFile(path.join(dbDir, 'src', 'data-source.ts'), dataSource);
178
+ await fs.writeFile(path.join(dbDir, 'src', 'index.ts'), "export * from './data-source.js';\n");
179
+ }
180
+ //# sourceMappingURL=orm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orm.js","sourceRoot":"","sources":["../../src/generator/orm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface StackConfig {
2
+ projectName: string;
3
+ frontend: 'nextjs' | 'react' | 'vue' | 'angular' | 'none' | undefined;
4
+ backend: 'nestjs' | 'express' | 'fastify' | 'none' | undefined;
5
+ database: 'postgres' | 'mysql' | 'mongodb' | 'none' | undefined;
6
+ orm: 'prisma' | 'drizzle' | 'typeorm' | 'none' | undefined;
7
+ extras: string[];
8
+ dockerStrategy: 'full' | 'infra-only' | 'none';
9
+ }
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACtE,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/D,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,GAAG,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;CAChD"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@abdul53245/create-dev-stack",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "dist/cli.js",
6
+ "exports": {
7
+ ".": "./dist/cli.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "test": "echo \"Error: no test specified\" && exit 1",
12
+ "build": "tsc",
13
+ "start": "node dist/cli.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "bin": {
17
+ "create-dev-stack": "bin/index.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "bin",
22
+ "README.md"
23
+ ],
24
+ "keywords": [
25
+ "cli",
26
+ "docker",
27
+ "devops",
28
+ "boilerplate",
29
+ "scaffold",
30
+ "nextjs",
31
+ "nestjs",
32
+ "prisma"
33
+ ],
34
+ "author": "Muhammad AbdulRehman Munawar <opabdul636@gmail.com>",
35
+ "license": "ISC",
36
+ "dependencies": {
37
+ "@clack/prompts": "^1.7.0",
38
+ "chalk": "^6.0.0",
39
+ "commander": "^15.0.0",
40
+ "fs-extra": "^11.4.0",
41
+ "handlebars": "^4.7.9"
42
+ },
43
+ "devDependencies": {
44
+ "@types/fs-extra": "^11.0.4",
45
+ "@types/node": "^26.1.2",
46
+ "tsx": "^4.23.1",
47
+ "typescript": "^7.0.2"
48
+ }
49
+ }
package/readme.md ADDED
@@ -0,0 +1,107 @@
1
+ # Create Dev Stack
2
+
3
+ Create Dev Stack is an interactive CLI that scaffolds a modern full-stack development workspace in seconds.
4
+
5
+ It generates a monorepo with:
6
+
7
+ - a frontend app
8
+ - a backend app
9
+ - optional database and ORM setup
10
+ - Docker configuration
11
+ - environment files and starter code
12
+
13
+ [![NPM Version](https://img.shields.io/npm/v/create-dev-stack?style=flat-square&color=blue)](https://www.npmjs.com/package/create-dev-stack)
14
+ [![License: ISC](https://img.shields.io/badge/License-ISC-yellow.svg)](https://opensource.org/licenses/ISC)
15
+ [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
16
+
17
+ ---
18
+
19
+ ## Features
20
+
21
+ - Guided interactive prompts for frontend, backend, database, ORM, and Docker choices
22
+ - Supports Next.js, React, Vue, and Angular for the frontend
23
+ - Supports Express, Fastify, and NestJS for the backend
24
+ - Supports PostgreSQL, MySQL, MongoDB, and optional Redis, Nginx, and Mailpit
25
+ - Generates a workspace layout ready for local development and Docker
26
+
27
+ ---
28
+
29
+ ## Supported stack options
30
+
31
+ | Category | Options |
32
+ | :--- | :--- |
33
+ | Frontend | Next.js, React, Vue, Angular, None |
34
+ | Backend | Express, Fastify, NestJS, None |
35
+ | Database | PostgreSQL, MySQL, MongoDB, None |
36
+ | ORM | Prisma, Drizzle, TypeORM, None |
37
+ | Extras | Redis, Nginx, Mailpit |
38
+ | Docker | Full stack, Infra only, None |
39
+
40
+ ---
41
+
42
+ ## Quick start
43
+
44
+ Run the CLI with npx:
45
+
46
+ ```bash
47
+ npx create-dev-stack
48
+ ```
49
+
50
+ Or install it globally:
51
+
52
+ ```bash
53
+ npm install -g create-dev-stack
54
+ create-dev-stack
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Generated project structure
60
+
61
+ The generator creates a workspace similar to this:
62
+
63
+ ```text
64
+ apps/
65
+ api/
66
+ web/
67
+ packages/
68
+ database/
69
+ infra/
70
+ docker/
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Start the generated app
76
+
77
+ After scaffolding a project, go into the new folder and run:
78
+
79
+ ```bash
80
+ cd <your-project-name>
81
+ npm run api:dev
82
+ npm run web:dev
83
+ ```
84
+
85
+ Or start both together:
86
+
87
+ ```bash
88
+ cd <your-project-name>
89
+ npm run dev
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Development
95
+
96
+ To work on the CLI itself:
97
+
98
+ ```bash
99
+ npm install
100
+ npm run build
101
+ ```
102
+
103
+ ---
104
+
105
+ ## License
106
+
107
+ ISC