@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.
- package/bin/index.js +6 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +107 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator/backend.d.ts +3 -0
- package/dist/generator/backend.d.ts.map +1 -0
- package/dist/generator/backend.js +211 -0
- package/dist/generator/backend.js.map +1 -0
- package/dist/generator/docker.d.ts +3 -0
- package/dist/generator/docker.d.ts.map +1 -0
- package/dist/generator/docker.js +199 -0
- package/dist/generator/docker.js.map +1 -0
- package/dist/generator/env.d.ts +3 -0
- package/dist/generator/env.d.ts.map +1 -0
- package/dist/generator/env.js +49 -0
- package/dist/generator/env.js.map +1 -0
- package/dist/generator/frontend.d.ts +3 -0
- package/dist/generator/frontend.d.ts.map +1 -0
- package/dist/generator/frontend.js +423 -0
- package/dist/generator/frontend.js.map +1 -0
- package/dist/generator/index.d.ts +3 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +54 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/orm.d.ts +3 -0
- package/dist/generator/orm.d.ts.map +1 -0
- package/dist/generator/orm.js +180 -0
- package/dist/generator/orm.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
- package/readme.md +107 -0
|
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAmB,EAAE,WAAmB;IACxE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC3F,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAE5C,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM;IACV,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAmB,EAAE,KAAa;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAClK,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,aAAa,EAAE,iBAAiB;YAChC,SAAS,EAAE,gBAAgB;SAC5B;QACD,YAAY,EAAE;YACZ,gBAAgB,EAAE,QAAQ;SAC3B;QACD,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,SAAS;YACd,UAAU,EAAE,QAAQ;SACrB;KACF,CAAC;IAEF,MAAM,MAAM,GAAG;;;;;gBAKD,QAAQ;;;;;;;;;;CAUvB,CAAC;IAEA,MAAM,OAAO,GAAG;;;CAGjB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IACxE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAmB,EAAE,KAAa;IAC5D,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,aAAa,EAAE,sBAAsB;YACrC,SAAS,EAAE,kBAAkB;SAC9B;QACD,YAAY,EAAE;YACZ,aAAa,EAAE,SAAS;SACzB;QACD,eAAe,EAAE;YACf,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,QAAQ;SACrB;KACF,CAAC;IAEF,MAAM,aAAa,GAAG;;;;;cAKV,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;;;;;;;CAOpE,CAAC;IAEA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,UAAU;QAC7C,CAAC,CAAC;;;;;;;;CAQL;QACG,CAAC,CAAC;;;;;;;;CAQL,CAAC;IAEA,MAAM,OAAO,GAAG;CACjB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,EAAE,aAAa,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAmB,EAAE,KAAa;IAC5D,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,OAAO,EAAE,0BAA0B;SACpC;QACD,YAAY,EAAE;YACZ,gBAAgB,EAAE,QAAQ;YAC1B,OAAO,EAAE,QAAQ;SAClB;QACD,eAAe,EAAE;YACf,UAAU,EAAE,QAAQ;SACrB;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;CAgBpB,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;WAKV,MAAM;;;;;;;;CAQhB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,qCAAqC,CAAC,CAAC;AACjG,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
[](https://www.npmjs.com/package/create-dev-stack)
|
|
14
|
+
[](https://opensource.org/licenses/ISC)
|
|
15
|
+
[](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
|