@devbro/pashmak 0.1.57 → 0.1.58
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/cjs/app/console/index.js +213 -7
- package/dist/cjs/app/console/project/CreateProjectCommand.js +213 -7
- package/dist/cjs/bin/pashmak_cli.js +213 -7
- package/dist/cjs/index.js +213 -7
- package/dist/esm/app/console/project/CreateProjectCommand.d.mts +7 -2
- package/dist/esm/app/console/project/CreateProjectCommand.mjs +214 -8
- package/dist/esm/app/console/project/CreateProjectCommand.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { Command } from "clipanion";
|
|
3
|
+
import { Command, Option } from "clipanion";
|
|
4
4
|
import { Case } from "change-case-all";
|
|
5
5
|
import path from "path";
|
|
6
6
|
import * as fs from "fs/promises";
|
|
@@ -26,8 +26,34 @@ class CreateProjectCommand extends Command {
|
|
|
26
26
|
executor = "";
|
|
27
27
|
packageManager = "";
|
|
28
28
|
linter = "";
|
|
29
|
-
validation_library = ""
|
|
30
|
-
|
|
29
|
+
validation_library = Option.String("--validation-library", {
|
|
30
|
+
description: "Validation library to use (yup, zod, none)",
|
|
31
|
+
required: false
|
|
32
|
+
});
|
|
33
|
+
database_type = Option.String("--database-type", {
|
|
34
|
+
description: "Database type to use (postgresql, mysql, sqlite)",
|
|
35
|
+
required: false
|
|
36
|
+
});
|
|
37
|
+
cache_library = Option.String("--cache-library", {
|
|
38
|
+
description: "Cache library to use (redis, memcached, none)",
|
|
39
|
+
required: false
|
|
40
|
+
});
|
|
41
|
+
mailer_library = Option.String("--mailer-library", {
|
|
42
|
+
description: "Mailer library to use (@aws-sdk/client-ses, nodemailer, none)",
|
|
43
|
+
required: false
|
|
44
|
+
});
|
|
45
|
+
queue_library = Option.String("--queue-library", {
|
|
46
|
+
description: "Queue library to use (@aws-sdk/client-sqs, @azure/service-bus, @google-cloud/pubsub, amqplib, redis, none)",
|
|
47
|
+
required: false
|
|
48
|
+
});
|
|
49
|
+
storage_library = Option.String("--storage-library", {
|
|
50
|
+
description: "Storage library to use (@aws-sdk/client-s3, @azure/storage-blob, @google-cloud/storage, basic-ftp, ssh2-sftp-client, none)",
|
|
51
|
+
required: false
|
|
52
|
+
});
|
|
53
|
+
initGit = Option.Boolean("--git", {
|
|
54
|
+
description: "Initialize a git repository (use --no-git to skip)",
|
|
55
|
+
required: false
|
|
56
|
+
});
|
|
31
57
|
async folderExists(folderPath) {
|
|
32
58
|
try {
|
|
33
59
|
const stats = await fs.stat(folderPath);
|
|
@@ -181,7 +207,7 @@ class CreateProjectCommand extends Command {
|
|
|
181
207
|
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
182
208
|
}
|
|
183
209
|
async setupGeneralPackages() {
|
|
184
|
-
this.validation_library = await select({
|
|
210
|
+
this.validation_library = this.validation_library ?? await select({
|
|
185
211
|
message: "Select a package you want for validation",
|
|
186
212
|
choices: [
|
|
187
213
|
{
|
|
@@ -202,8 +228,15 @@ class CreateProjectCommand extends Command {
|
|
|
202
228
|
}
|
|
203
229
|
]
|
|
204
230
|
});
|
|
205
|
-
this.validation_library === "
|
|
206
|
-
|
|
231
|
+
if (this.validation_library === "yup" || this.validation_library === "zod") {
|
|
232
|
+
await this.addPackage(this.validation_library);
|
|
233
|
+
} else if (this.validation_library === "none") {
|
|
234
|
+
} else {
|
|
235
|
+
throw new Error(
|
|
236
|
+
"unexpected validation library: " + this.validation_library + ". Valid options are: yup, zod, none"
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
this.database_type = this.database_type ?? await select({
|
|
207
240
|
message: "Select a database type (you can add more databases later)",
|
|
208
241
|
choices: [
|
|
209
242
|
{
|
|
@@ -229,6 +262,179 @@ class CreateProjectCommand extends Command {
|
|
|
229
262
|
await this.addPackage("mysql2");
|
|
230
263
|
} else if (this.database_type === "sqlite") {
|
|
231
264
|
await this.addPackage("sqlite3");
|
|
265
|
+
} else {
|
|
266
|
+
throw new Error(
|
|
267
|
+
"unexpected database type: " + this.database_type + ". Valid options are: postgresql, mysql, sqlite"
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
this.cache_library = this.cache_library ?? await select({
|
|
271
|
+
message: "Select a cache library",
|
|
272
|
+
choices: [
|
|
273
|
+
{
|
|
274
|
+
name: "Redis",
|
|
275
|
+
value: "redis",
|
|
276
|
+
description: "Redis client for Node.js"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
name: "Memcached",
|
|
280
|
+
value: "memcached",
|
|
281
|
+
description: "Memcached client for Node.js"
|
|
282
|
+
},
|
|
283
|
+
new Separator(),
|
|
284
|
+
{
|
|
285
|
+
name: "None",
|
|
286
|
+
value: "none",
|
|
287
|
+
disabled: false
|
|
288
|
+
}
|
|
289
|
+
]
|
|
290
|
+
});
|
|
291
|
+
if (this.cache_library === "redis") {
|
|
292
|
+
await this.addPackage("redis");
|
|
293
|
+
} else if (this.cache_library === "memcached") {
|
|
294
|
+
await this.addPackage("memcached");
|
|
295
|
+
} else if (this.cache_library === "none") {
|
|
296
|
+
} else {
|
|
297
|
+
throw new Error(
|
|
298
|
+
"unexpected cache library: " + this.cache_library + ". Valid options are: redis, memcached, none"
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
this.mailer_library = this.mailer_library ?? await select({
|
|
302
|
+
message: "Select a mailer library",
|
|
303
|
+
choices: [
|
|
304
|
+
{
|
|
305
|
+
name: "AWS SES",
|
|
306
|
+
value: "@aws-sdk/client-ses",
|
|
307
|
+
description: "AWS SDK for JavaScript v3 - SES client"
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: "Nodemailer",
|
|
311
|
+
value: "nodemailer",
|
|
312
|
+
description: "Send emails with Node.js"
|
|
313
|
+
},
|
|
314
|
+
new Separator(),
|
|
315
|
+
{
|
|
316
|
+
name: "None",
|
|
317
|
+
value: "none",
|
|
318
|
+
disabled: false
|
|
319
|
+
}
|
|
320
|
+
]
|
|
321
|
+
});
|
|
322
|
+
if (this.mailer_library === "@aws-sdk/client-ses") {
|
|
323
|
+
await this.addPackage("@aws-sdk/client-ses");
|
|
324
|
+
} else if (this.mailer_library === "nodemailer") {
|
|
325
|
+
await this.addPackage("nodemailer");
|
|
326
|
+
await this.addPackage("@types/nodemailer", true);
|
|
327
|
+
} else if (this.mailer_library === "none") {
|
|
328
|
+
} else {
|
|
329
|
+
throw new Error(
|
|
330
|
+
"unexpected mailer library: " + this.mailer_library + ". Valid options are: @aws-sdk/client-ses, nodemailer, none"
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
this.queue_library = this.queue_library ?? await select({
|
|
334
|
+
message: "Select a queue library",
|
|
335
|
+
choices: [
|
|
336
|
+
{
|
|
337
|
+
name: "AWS SQS",
|
|
338
|
+
value: "@aws-sdk/client-sqs",
|
|
339
|
+
description: "AWS SDK for JavaScript v3 - SQS client"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
name: "Azure Service Bus",
|
|
343
|
+
value: "@azure/service-bus",
|
|
344
|
+
description: "Azure Service Bus client for Node.js"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
name: "Google Cloud Pub/Sub",
|
|
348
|
+
value: "@google-cloud/pubsub",
|
|
349
|
+
description: "Google Cloud Pub/Sub client for Node.js"
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
name: "RabbitMQ (amqplib)",
|
|
353
|
+
value: "amqplib",
|
|
354
|
+
description: "AMQP 0-9-1 client for Node.js"
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
name: "Redis",
|
|
358
|
+
value: "redis",
|
|
359
|
+
description: "Redis client for Node.js"
|
|
360
|
+
},
|
|
361
|
+
new Separator(),
|
|
362
|
+
{
|
|
363
|
+
name: "None",
|
|
364
|
+
value: "none",
|
|
365
|
+
disabled: false
|
|
366
|
+
}
|
|
367
|
+
]
|
|
368
|
+
});
|
|
369
|
+
if (this.queue_library === "@aws-sdk/client-sqs") {
|
|
370
|
+
await this.addPackage("@aws-sdk/client-sqs");
|
|
371
|
+
} else if (this.queue_library === "@azure/service-bus") {
|
|
372
|
+
await this.addPackage("@azure/service-bus");
|
|
373
|
+
} else if (this.queue_library === "@google-cloud/pubsub") {
|
|
374
|
+
await this.addPackage("@google-cloud/pubsub");
|
|
375
|
+
} else if (this.queue_library === "amqplib") {
|
|
376
|
+
await this.addPackage("amqplib");
|
|
377
|
+
await this.addPackage("@types/amqplib", true);
|
|
378
|
+
} else if (this.queue_library === "redis") {
|
|
379
|
+
await this.addPackage("redis");
|
|
380
|
+
} else if (this.queue_library === "none") {
|
|
381
|
+
} else {
|
|
382
|
+
throw new Error(
|
|
383
|
+
"unexpected queue library: " + this.queue_library + ". Valid options are: @aws-sdk/client-sqs, @azure/service-bus, @google-cloud/pubsub, amqplib, redis, none"
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
this.storage_library = this.storage_library ?? await select({
|
|
387
|
+
message: "Select a storage library",
|
|
388
|
+
choices: [
|
|
389
|
+
{
|
|
390
|
+
name: "@aws-sdk/client-s3",
|
|
391
|
+
value: "@aws-sdk/client-s3",
|
|
392
|
+
description: "AWS SDK for JavaScript v3 - S3 client"
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
name: "@azure/storage-blob",
|
|
396
|
+
value: "@azure/storage-blob",
|
|
397
|
+
description: "Azure Storage Blob client for Node.js"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
name: "@google-cloud/storage",
|
|
401
|
+
value: "@google-cloud/storage",
|
|
402
|
+
description: "Google Cloud Storage client for Node.js"
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
name: "basic-ftp",
|
|
406
|
+
value: "basic-ftp",
|
|
407
|
+
description: "FTP client for Node.js"
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
name: "ssh2-sftp-client",
|
|
411
|
+
value: "ssh2-sftp-client",
|
|
412
|
+
description: "SFTP client for Node.js"
|
|
413
|
+
},
|
|
414
|
+
new Separator(),
|
|
415
|
+
{
|
|
416
|
+
name: "None",
|
|
417
|
+
value: "none",
|
|
418
|
+
disabled: false
|
|
419
|
+
}
|
|
420
|
+
]
|
|
421
|
+
});
|
|
422
|
+
if (this.storage_library === "@aws-sdk/client-s3") {
|
|
423
|
+
await this.addPackage("@aws-sdk/client-s3");
|
|
424
|
+
} else if (this.storage_library === "@azure/storage-blob") {
|
|
425
|
+
await this.addPackage("@azure/storage-blob");
|
|
426
|
+
} else if (this.storage_library === "@google-cloud/storage") {
|
|
427
|
+
await this.addPackage("@google-cloud/storage");
|
|
428
|
+
} else if (this.storage_library === "basic-ftp") {
|
|
429
|
+
await this.addPackage("basic-ftp");
|
|
430
|
+
} else if (this.storage_library === "ssh2-sftp-client") {
|
|
431
|
+
await this.addPackage("ssh2-sftp-client");
|
|
432
|
+
await this.addPackage("@types/ssh2-sftp-client", true);
|
|
433
|
+
} else if (this.storage_library === "none") {
|
|
434
|
+
} else {
|
|
435
|
+
throw new Error(
|
|
436
|
+
"unexpected storage library: " + this.storage_library + " . Valid options are: @aws-sdk/client-s3, @azure/storage-blob, @google-cloud/storage, basic-ftp, ssh2-sftp-client, none"
|
|
437
|
+
);
|
|
232
438
|
}
|
|
233
439
|
await this.addPackage("@devbro/pashmak tsconfig-paths dotenv ");
|
|
234
440
|
await this.addPackage(
|
|
@@ -285,7 +491,7 @@ class CreateProjectCommand extends Command {
|
|
|
285
491
|
});
|
|
286
492
|
}
|
|
287
493
|
async setupGit() {
|
|
288
|
-
|
|
494
|
+
this.initGit = this.initGit ?? await select({
|
|
289
495
|
message: "Initialize a git repository?",
|
|
290
496
|
choices: [
|
|
291
497
|
{
|
|
@@ -300,7 +506,7 @@ class CreateProjectCommand extends Command {
|
|
|
300
506
|
}
|
|
301
507
|
]
|
|
302
508
|
});
|
|
303
|
-
if (initGit) {
|
|
509
|
+
if (this.initGit) {
|
|
304
510
|
const gitignoreContent = [
|
|
305
511
|
"node_modules/",
|
|
306
512
|
"dist/",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/app/console/project/CreateProjectCommand.mts"],"sourcesContent":["import { Command, Option } from \"clipanion\";\nimport { Case } from \"change-case-all\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport handlebars from \"handlebars\";\nimport { execSync } from \"child_process\";\nimport { select, Separator, input } from \"@inquirer/prompts\";\n\nexport class CreateProjectCommand extends Command {\n static paths = [[`create`, `project`]];\n\n static usage = Command.Usage({\n category: `Project`,\n description: `Create a new project`,\n details: `\n This command creates a new project interactively.\n You will be prompted for the project path and other configuration options.\n `,\n examples: [[`Create a new project`, `create project`]],\n });\n\n projectPath: string = \"\";\n executor: string = \"\";\n packageManager: string = \"\";\n linter: string = \"\";\n validation_library: string = \"\";\n database_type: string = \"\";\n\n async folderExists(folderPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(folderPath);\n return stats.isDirectory();\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return false; // Folder does not exist\n }\n throw error; // Other errors (e.g., permission issues)\n }\n }\n\n async execute() {\n //setup project\n await this.setupProjectPath();\n await this.setupGit();\n await this.setupExecutorAndPackageManager();\n await this.setupLinter();\n await this.setupGeneralPackages();\n await this.setupBaseProject();\n await this.installPackages();\n }\n\n async processTplFolder(src: string, dest: string, data: any = {}) {\n const files = await fs.readdir(src, { withFileTypes: true });\n for (const file of files) {\n const srcPath = path.join(src, file.name);\n const destPath =\n file.isFile() && file.name.endsWith(\".tpl\")\n ? path.join(dest, file.name.substring(0, file.name.length - 4))\n : path.join(dest, file.name);\n\n if (file.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await this.processTplFolder(srcPath, destPath, data);\n } else if (file.name.endsWith(\".tpl\")) {\n await this.processTplFile(srcPath, destPath, data);\n } else {\n throw new Error(\n \"unexpected non tpl file: \" + srcPath + \" \" + file.name,\n );\n }\n }\n }\n\n async processTplFile(src: string, dest: string, data: any = {}) {\n handlebars.registerHelper(\"eq\", (a, b) => a === b);\n\n const compiledTemplate = handlebars.compile(\n (await fs.readFile(src)).toString(),\n );\n const template = await compiledTemplate(data);\n await fs.writeFile(dest, template);\n }\n\n async setupProjectPath() {\n // Ask for project path\n const pathInput = await input({\n message: \"Enter project path (leave empty to use current directory):\",\n default: \"\",\n });\n\n // Create the project directory path\n this.projectPath = pathInput.trim()\n ? path.resolve(pathInput.trim())\n : process.cwd();\n\n // Create directory if it doesn't exist\n await fs.mkdir(this.projectPath, { recursive: true });\n\n // Check if directory is empty\n const files = await fs.readdir(this.projectPath);\n if (files.length > 0) {\n throw new Error(\n `Directory ${this.projectPath} is not empty. Please use an empty directory.`,\n );\n }\n }\n\n async setupExecutorAndPackageManager() {\n // ask what executor to use\n this.executor = await select({\n message: \"Select a TypeScript executor\",\n choices: [\n {\n name: \"Bun\",\n value: \"bun\",\n description: \"Fast all-in-one JavaScript runtime\",\n },\n {\n name: \"TSX\",\n value: \"tsx\",\n description:\n \"TypeScript execute (tsx) - Node.js enhanced with esbuild\",\n },\n ],\n });\n\n // ask what package manager to use (skip if executor is bun)\n this.packageManager =\n this.executor === \"bun\"\n ? \"bun\"\n : await select({\n message: \"Select a package manager\",\n choices: [\n {\n name: \"Yarn\",\n value: \"yarn\",\n description: \"Fast, reliable, and secure dependency management\",\n },\n {\n name: \"npm\",\n value: \"npm\",\n description: \"Node package manager (default)\",\n },\n {\n name: \"Bun\",\n value: \"bun\",\n description: \"Ultra-fast package manager built into Bun\",\n },\n ],\n default: \"yarn\",\n });\n\n // use executor as package manager to start a new project\n // run command to init a project with the selected executor and package manager\n execSync(`${this.packageManager} init -y`, {\n stdio: \"inherit\",\n cwd: this.projectPath,\n });\n\n // add commands to package.json based on the selected executor\n const packageJsonPath = path.join(this.projectPath, `package.json`);\n let packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n packageJson.type = \"module\";\n packageJson.scripts = packageJson.scripts || {};\n packageJson.scripts.prepare = \"husky init\";\n packageJson.scripts.clean = \"rm -rf dist\";\n if (this.executor === \"bun\") {\n packageJson.scripts.dev = \"bun run dev\";\n packageJson.scripts.start = \"bun run pdev\";\n packageJson.scripts.build = \"bun run build\";\n packageJson.scripts.test = \"vitest\";\n packageJson.scripts[\"test:watch\"] = \"vitest --watch\";\n packageJson.scripts[\"test:coverage\"] = \"vitest run --coverage\";\n } else if (this.executor === \"tsx\") {\n packageJson.scripts.dev =\n \"tsx --watch -r tsconfig-paths/register src/index.ts start --all | npx pino-pretty\";\n packageJson.scripts.start = \"tsx dist/index.js\";\n packageJson.scripts.build = \"tsc\";\n packageJson.scripts.test = \"vitest\";\n packageJson.scripts[\"test:watch\"] = \"vitest --watch\";\n packageJson.scripts[\"test:coverage\"] = \"vitest run --coverage\";\n }\n //save back to package.json\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n async setupLinter() {\n // ask what linter to use\n this.linter = await select({\n message: \"Select a linter\",\n choices: [\n {\n name: \"Biome\",\n value: \"biome\",\n description:\n \"Fast formatter and linter for JavaScript, TypeScript, and more\",\n },\n {\n name: \"ESLint\",\n value: \"eslint\",\n description: \"Find and fix problems in your JavaScript code\",\n },\n ],\n });\n\n // add linter configuration to package.json based on the selected linter\n const packageJsonPath = path.join(this.projectPath, `package.json`);\n let packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n if (this.linter === \"biome\") {\n packageJson.scripts.lint = \"biome check . --ext .ts,.tsx\";\n packageJson.scripts.format = \"biome format . --ext .ts,.tsx --write\";\n this.addPackage(\"@biomejs/biome\", true);\n } else if (this.linter === \"eslint\") {\n packageJson.scripts.lint = \"eslint . --ext .ts,.tsx\";\n packageJson.scripts.format = \"eslint . --ext .ts,.tsx --fix\";\n this.addPackage(\"eslint\", true);\n }\n //save back to package.json\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n async setupGeneralPackages() {\n // ask what library to use for validation: yup or zod or none\n this.validation_library = await select({\n message: \"Select a package you want for validation\",\n choices: [\n {\n name: \"Yup\",\n value: \"yup\",\n description: \"https://github.com/jquense/yup\",\n },\n {\n name: \"Zod\",\n value: \"zod\",\n description: \"https://zod.dev/\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n });\n\n // run commands to install the selected validation library\n this.validation_library === \"none\" ||\n (await this.addPackage(this.validation_library));\n\n this.database_type = await select({\n message: \"Select a database type (you can add more databases later)\",\n choices: [\n {\n name: \"PostgreSQL\",\n value: \"postgresql\",\n description:\n \"A powerful, open source object-relational database system\",\n },\n {\n name: \"MySQL\",\n value: \"mysql\",\n description: \"The world's most popular open source database\",\n },\n {\n name: \"SQLite\",\n value: \"sqlite\",\n description:\n \"A C library that provides a lightweight disk-based database\",\n },\n ],\n });\n\n if (this.database_type === \"postgresql\") {\n await this.addPackage(\"pg pg-cursor\");\n } else if (this.database_type === \"mysql\") {\n await this.addPackage(\"mysql2\");\n } else if (this.database_type === \"sqlite\") {\n await this.addPackage(\"sqlite3\");\n }\n\n // add other packages\n await this.addPackage(\"@devbro/pashmak tsconfig-paths dotenv \");\n await this.addPackage(\n \"husky vitest supertest @types/supertest pino-pretty typescript tsx\",\n true,\n );\n }\n\n async setupBaseProject() {\n console.log(`Using project directory: ${this.projectPath}`);\n\n const dirname =\n typeof __dirname === \"undefined\"\n ? path.dirname(fileURLToPath(import.meta.url))\n : __dirname;\n\n let basePath = path.join(dirname, `./base_project`);\n if ((await this.folderExists(basePath)) === false) {\n // we are running a compiled code that was bundled and the code is running from ./dist/bin/ folder.\n basePath = path.join(dirname, `../app/console/project/base_project`);\n }\n\n console.log(`Using base project path: ${basePath}`);\n //copy content of ./base_project to the new project directory\n const baseProjectPath = basePath;\n\n await this.processTplFolder(baseProjectPath, this.projectPath, {\n validation_library: this.validation_library,\n executor: this.executor,\n package_manager: this.packageManager,\n linter: this.linter,\n database_type: this.database_type,\n });\n console.log(`Copied base project files to: ${this.projectPath}`);\n\n //modify package.json with foldername\n const packageJsonPath = path.join(this.projectPath, \"package.json\");\n let packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n packageJson.name = Case.snake(path.basename(this.projectPath));\n\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n console.log(`Updated package.json with project name: ${packageJson.name}`);\n }\n\n async addPackage(packageName: string, dev: boolean = false) {\n let install_command = \"\";\n switch (this.packageManager) {\n case \"bun\":\n install_command = `bun add ${packageName}${dev ? \" -d\" : \"\"}`;\n break;\n case \"yarn\":\n install_command = `yarn add ${packageName}${dev ? \" -D\" : \"\"} --no-install`;\n break;\n case \"npm\":\n install_command = `npm install ${packageName}${dev ? \" --save-dev\" : \"\"} --package-lock-only`;\n break;\n }\n\n execSync(install_command, {\n stdio: \"inherit\",\n cwd: this.projectPath,\n });\n }\n\n async installPackages() {\n const install_command =\n this.packageManager === \"bun\"\n ? `bun install`\n : this.packageManager === \"yarn\"\n ? `yarn`\n : `npm install`;\n\n execSync(install_command, {\n stdio: \"inherit\",\n cwd: this.projectPath,\n });\n }\n\n async setupGit() {\n // ask if user wants to initialize git repository\n const initGit = await select({\n message: \"Initialize a git repository?\",\n choices: [\n {\n name: \"Yes\",\n value: true,\n description: \"Initialize git and create first commit\",\n },\n {\n name: \"No\",\n value: false,\n description: \"Skip git initialization\",\n },\n ],\n });\n\n if (initGit) {\n const gitignoreContent =\n [\n \"node_modules/\",\n \"dist/\",\n \".env\",\n \".env.*\",\n \"!.env.example\",\n \"*.log\",\n \"coverage/\",\n \".DS_Store\",\n ].join(\"\\n\") + \"\\n\";\n\n await fs.writeFile(\n path.join(this.projectPath, \".gitignore\"),\n gitignoreContent,\n );\n\n execSync(\n `git init; git add --all; git commit --allow-empty -m \"chore: first commit\"`,\n {\n cwd: this.projectPath,\n },\n );\n }\n }\n\n async catch(error: unknown) {\n if (Error.isError(error)) {\n console.error(error.message);\n } else {\n console.error(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/app/console/project/CreateProjectCommand.mts"],"sourcesContent":["import { Command, Option } from \"clipanion\";\nimport { Case } from \"change-case-all\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport handlebars from \"handlebars\";\nimport { execSync } from \"child_process\";\nimport { select, Separator, input } from \"@inquirer/prompts\";\n\nexport class CreateProjectCommand extends Command {\n static paths = [[`create`, `project`]];\n\n static usage = Command.Usage({\n category: `Project`,\n description: `Create a new project`,\n details: `\n This command creates a new project interactively.\n You will be prompted for the project path and other configuration options.\n `,\n examples: [[`Create a new project`, `create project`]],\n });\n\n projectPath: string = \"\";\n executor: string = \"\";\n packageManager: string = \"\";\n linter: string = \"\";\n validation_library = Option.String(\"--validation-library\", {\n description: \"Validation library to use (yup, zod, none)\",\n required: false,\n });\n database_type = Option.String(\"--database-type\", {\n description: \"Database type to use (postgresql, mysql, sqlite)\",\n required: false,\n });\n cache_library = Option.String(\"--cache-library\", {\n description: \"Cache library to use (redis, memcached, none)\",\n required: false,\n });\n mailer_library = Option.String(\"--mailer-library\", {\n description:\n \"Mailer library to use (@aws-sdk/client-ses, nodemailer, none)\",\n required: false,\n });\n queue_library = Option.String(\"--queue-library\", {\n description:\n \"Queue library to use (@aws-sdk/client-sqs, @azure/service-bus, @google-cloud/pubsub, amqplib, redis, none)\",\n required: false,\n });\n storage_library = Option.String(\"--storage-library\", {\n description:\n \"Storage library to use (@aws-sdk/client-s3, @azure/storage-blob, @google-cloud/storage, basic-ftp, ssh2-sftp-client, none)\",\n required: false,\n });\n initGit = Option.Boolean(\"--git\", {\n description: \"Initialize a git repository (use --no-git to skip)\",\n required: false,\n });\n\n async folderExists(folderPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(folderPath);\n return stats.isDirectory();\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return false; // Folder does not exist\n }\n throw error; // Other errors (e.g., permission issues)\n }\n }\n\n async execute() {\n //setup project\n await this.setupProjectPath();\n await this.setupGit();\n await this.setupExecutorAndPackageManager();\n await this.setupLinter();\n await this.setupGeneralPackages();\n await this.setupBaseProject();\n await this.installPackages();\n }\n\n async processTplFolder(src: string, dest: string, data: any = {}) {\n const files = await fs.readdir(src, { withFileTypes: true });\n for (const file of files) {\n const srcPath = path.join(src, file.name);\n const destPath =\n file.isFile() && file.name.endsWith(\".tpl\")\n ? path.join(dest, file.name.substring(0, file.name.length - 4))\n : path.join(dest, file.name);\n\n if (file.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await this.processTplFolder(srcPath, destPath, data);\n } else if (file.name.endsWith(\".tpl\")) {\n await this.processTplFile(srcPath, destPath, data);\n } else {\n throw new Error(\n \"unexpected non tpl file: \" + srcPath + \" \" + file.name,\n );\n }\n }\n }\n\n async processTplFile(src: string, dest: string, data: any = {}) {\n handlebars.registerHelper(\"eq\", (a, b) => a === b);\n\n const compiledTemplate = handlebars.compile(\n (await fs.readFile(src)).toString(),\n );\n const template = await compiledTemplate(data);\n await fs.writeFile(dest, template);\n }\n\n async setupProjectPath() {\n // Ask for project path\n const pathInput = await input({\n message: \"Enter project path (leave empty to use current directory):\",\n default: \"\",\n });\n\n // Create the project directory path\n this.projectPath = pathInput.trim()\n ? path.resolve(pathInput.trim())\n : process.cwd();\n\n // Create directory if it doesn't exist\n await fs.mkdir(this.projectPath, { recursive: true });\n\n // Check if directory is empty\n const files = await fs.readdir(this.projectPath);\n if (files.length > 0) {\n throw new Error(\n `Directory ${this.projectPath} is not empty. Please use an empty directory.`,\n );\n }\n }\n\n async setupExecutorAndPackageManager() {\n // ask what executor to use\n this.executor = await select({\n message: \"Select a TypeScript executor\",\n choices: [\n {\n name: \"Bun\",\n value: \"bun\",\n description: \"Fast all-in-one JavaScript runtime\",\n },\n {\n name: \"TSX\",\n value: \"tsx\",\n description:\n \"TypeScript execute (tsx) - Node.js enhanced with esbuild\",\n },\n ],\n });\n\n // ask what package manager to use (skip if executor is bun)\n this.packageManager =\n this.executor === \"bun\"\n ? \"bun\"\n : await select({\n message: \"Select a package manager\",\n choices: [\n {\n name: \"Yarn\",\n value: \"yarn\",\n description: \"Fast, reliable, and secure dependency management\",\n },\n {\n name: \"npm\",\n value: \"npm\",\n description: \"Node package manager (default)\",\n },\n {\n name: \"Bun\",\n value: \"bun\",\n description: \"Ultra-fast package manager built into Bun\",\n },\n ],\n default: \"yarn\",\n });\n\n // use executor as package manager to start a new project\n // run command to init a project with the selected executor and package manager\n execSync(`${this.packageManager} init -y`, {\n stdio: \"inherit\",\n cwd: this.projectPath,\n });\n\n // add commands to package.json based on the selected executor\n const packageJsonPath = path.join(this.projectPath, `package.json`);\n let packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n packageJson.type = \"module\";\n packageJson.scripts = packageJson.scripts || {};\n packageJson.scripts.prepare = \"husky init\";\n packageJson.scripts.clean = \"rm -rf dist\";\n if (this.executor === \"bun\") {\n packageJson.scripts.dev = \"bun run dev\";\n packageJson.scripts.start = \"bun run pdev\";\n packageJson.scripts.build = \"bun run build\";\n packageJson.scripts.test = \"vitest\";\n packageJson.scripts[\"test:watch\"] = \"vitest --watch\";\n packageJson.scripts[\"test:coverage\"] = \"vitest run --coverage\";\n } else if (this.executor === \"tsx\") {\n packageJson.scripts.dev =\n \"tsx --watch -r tsconfig-paths/register src/index.ts start --all | npx pino-pretty\";\n packageJson.scripts.start = \"tsx dist/index.js\";\n packageJson.scripts.build = \"tsc\";\n packageJson.scripts.test = \"vitest\";\n packageJson.scripts[\"test:watch\"] = \"vitest --watch\";\n packageJson.scripts[\"test:coverage\"] = \"vitest run --coverage\";\n }\n //save back to package.json\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n async setupLinter() {\n // ask what linter to use\n this.linter = await select({\n message: \"Select a linter\",\n choices: [\n {\n name: \"Biome\",\n value: \"biome\",\n description:\n \"Fast formatter and linter for JavaScript, TypeScript, and more\",\n },\n {\n name: \"ESLint\",\n value: \"eslint\",\n description: \"Find and fix problems in your JavaScript code\",\n },\n ],\n });\n\n // add linter configuration to package.json based on the selected linter\n const packageJsonPath = path.join(this.projectPath, `package.json`);\n let packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n if (this.linter === \"biome\") {\n packageJson.scripts.lint = \"biome check . --ext .ts,.tsx\";\n packageJson.scripts.format = \"biome format . --ext .ts,.tsx --write\";\n this.addPackage(\"@biomejs/biome\", true);\n } else if (this.linter === \"eslint\") {\n packageJson.scripts.lint = \"eslint . --ext .ts,.tsx\";\n packageJson.scripts.format = \"eslint . --ext .ts,.tsx --fix\";\n this.addPackage(\"eslint\", true);\n }\n //save back to package.json\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n async setupGeneralPackages() {\n // ask what library to use for validation: yup or zod or none\n this.validation_library =\n this.validation_library ??\n (await select({\n message: \"Select a package you want for validation\",\n choices: [\n {\n name: \"Yup\",\n value: \"yup\",\n description: \"https://github.com/jquense/yup\",\n },\n {\n name: \"Zod\",\n value: \"zod\",\n description: \"https://zod.dev/\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n }));\n\n // run commands to install the selected validation library\n if (\n this.validation_library === \"yup\" ||\n this.validation_library === \"zod\"\n ) {\n await this.addPackage(this.validation_library);\n } else if (this.validation_library === \"none\") {\n } else {\n throw new Error(\n \"unexpected validation library: \" +\n this.validation_library +\n \". Valid options are: yup, zod, none\",\n );\n }\n\n this.database_type =\n this.database_type ??\n (await select({\n message: \"Select a database type (you can add more databases later)\",\n choices: [\n {\n name: \"PostgreSQL\",\n value: \"postgresql\",\n description:\n \"A powerful, open source object-relational database system\",\n },\n {\n name: \"MySQL\",\n value: \"mysql\",\n description: \"The world's most popular open source database\",\n },\n {\n name: \"SQLite\",\n value: \"sqlite\",\n description:\n \"A C library that provides a lightweight disk-based database\",\n },\n ],\n }));\n\n if (this.database_type === \"postgresql\") {\n await this.addPackage(\"pg pg-cursor\");\n } else if (this.database_type === \"mysql\") {\n await this.addPackage(\"mysql2\");\n } else if (this.database_type === \"sqlite\") {\n await this.addPackage(\"sqlite3\");\n } else {\n throw new Error(\n \"unexpected database type: \" +\n this.database_type +\n \". Valid options are: postgresql, mysql, sqlite\",\n );\n }\n\n // ask for cache library to use\n this.cache_library =\n this.cache_library ??\n (await select({\n message: \"Select a cache library\",\n choices: [\n {\n name: \"Redis\",\n value: \"redis\",\n description: \"Redis client for Node.js\",\n },\n {\n name: \"Memcached\",\n value: \"memcached\",\n description: \"Memcached client for Node.js\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n }));\n\n if (this.cache_library === \"redis\") {\n await this.addPackage(\"redis\");\n } else if (this.cache_library === \"memcached\") {\n await this.addPackage(\"memcached\");\n } else if (this.cache_library === \"none\") {\n } else {\n throw new Error(\n \"unexpected cache library: \" +\n this.cache_library +\n \". Valid options are: redis, memcached, none\",\n );\n }\n\n // ask for mailer library to use\n this.mailer_library =\n this.mailer_library ??\n (await select({\n message: \"Select a mailer library\",\n choices: [\n {\n name: \"AWS SES\",\n value: \"@aws-sdk/client-ses\",\n description: \"AWS SDK for JavaScript v3 - SES client\",\n },\n {\n name: \"Nodemailer\",\n value: \"nodemailer\",\n description: \"Send emails with Node.js\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n }));\n\n if (this.mailer_library === \"@aws-sdk/client-ses\") {\n await this.addPackage(\"@aws-sdk/client-ses\");\n } else if (this.mailer_library === \"nodemailer\") {\n await this.addPackage(\"nodemailer\");\n await this.addPackage(\"@types/nodemailer\", true);\n } else if (this.mailer_library === \"none\") {\n } else {\n throw new Error(\n \"unexpected mailer library: \" +\n this.mailer_library +\n \". Valid options are: @aws-sdk/client-ses, nodemailer, none\",\n );\n }\n\n // ask for queue library to use\n this.queue_library =\n this.queue_library ??\n (await select({\n message: \"Select a queue library\",\n choices: [\n {\n name: \"AWS SQS\",\n value: \"@aws-sdk/client-sqs\",\n description: \"AWS SDK for JavaScript v3 - SQS client\",\n },\n {\n name: \"Azure Service Bus\",\n value: \"@azure/service-bus\",\n description: \"Azure Service Bus client for Node.js\",\n },\n {\n name: \"Google Cloud Pub/Sub\",\n value: \"@google-cloud/pubsub\",\n description: \"Google Cloud Pub/Sub client for Node.js\",\n },\n {\n name: \"RabbitMQ (amqplib)\",\n value: \"amqplib\",\n description: \"AMQP 0-9-1 client for Node.js\",\n },\n {\n name: \"Redis\",\n value: \"redis\",\n description: \"Redis client for Node.js\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n }));\n\n if (this.queue_library === \"@aws-sdk/client-sqs\") {\n await this.addPackage(\"@aws-sdk/client-sqs\");\n } else if (this.queue_library === \"@azure/service-bus\") {\n await this.addPackage(\"@azure/service-bus\");\n } else if (this.queue_library === \"@google-cloud/pubsub\") {\n await this.addPackage(\"@google-cloud/pubsub\");\n } else if (this.queue_library === \"amqplib\") {\n await this.addPackage(\"amqplib\");\n await this.addPackage(\"@types/amqplib\", true);\n } else if (this.queue_library === \"redis\") {\n await this.addPackage(\"redis\");\n } else if (this.queue_library === \"none\") {\n } else {\n throw new Error(\n \"unexpected queue library: \" +\n this.queue_library +\n \". Valid options are: @aws-sdk/client-sqs, @azure/service-bus, @google-cloud/pubsub, amqplib, redis, none\",\n );\n }\n\n // ask for storage library to use\n this.storage_library =\n this.storage_library ??\n (await select({\n message: \"Select a storage library\",\n choices: [\n {\n name: \"@aws-sdk/client-s3\",\n value: \"@aws-sdk/client-s3\",\n description: \"AWS SDK for JavaScript v3 - S3 client\",\n },\n {\n name: \"@azure/storage-blob\",\n value: \"@azure/storage-blob\",\n description: \"Azure Storage Blob client for Node.js\",\n },\n {\n name: \"@google-cloud/storage\",\n value: \"@google-cloud/storage\",\n description: \"Google Cloud Storage client for Node.js\",\n },\n {\n name: \"basic-ftp\",\n value: \"basic-ftp\",\n description: \"FTP client for Node.js\",\n },\n {\n name: \"ssh2-sftp-client\",\n value: \"ssh2-sftp-client\",\n description: \"SFTP client for Node.js\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n }));\n\n if (this.storage_library === \"@aws-sdk/client-s3\") {\n await this.addPackage(\"@aws-sdk/client-s3\");\n } else if (this.storage_library === \"@azure/storage-blob\") {\n await this.addPackage(\"@azure/storage-blob\");\n } else if (this.storage_library === \"@google-cloud/storage\") {\n await this.addPackage(\"@google-cloud/storage\");\n } else if (this.storage_library === \"basic-ftp\") {\n await this.addPackage(\"basic-ftp\");\n } else if (this.storage_library === \"ssh2-sftp-client\") {\n await this.addPackage(\"ssh2-sftp-client\");\n await this.addPackage(\"@types/ssh2-sftp-client\", true);\n } else if (this.storage_library === \"none\") {\n } else {\n throw new Error(\n \"unexpected storage library: \" +\n this.storage_library +\n \" . Valid options are: @aws-sdk/client-s3, @azure/storage-blob, @google-cloud/storage, basic-ftp, ssh2-sftp-client, none\",\n );\n }\n\n // add other packages\n await this.addPackage(\"@devbro/pashmak tsconfig-paths dotenv \");\n await this.addPackage(\n \"husky vitest supertest @types/supertest pino-pretty typescript tsx\",\n true,\n );\n }\n\n async setupBaseProject() {\n console.log(`Using project directory: ${this.projectPath}`);\n\n const dirname =\n typeof __dirname === \"undefined\"\n ? path.dirname(fileURLToPath(import.meta.url))\n : __dirname;\n\n let basePath = path.join(dirname, `./base_project`);\n if ((await this.folderExists(basePath)) === false) {\n // we are running a compiled code that was bundled and the code is running from ./dist/bin/ folder.\n basePath = path.join(dirname, `../app/console/project/base_project`);\n }\n\n console.log(`Using base project path: ${basePath}`);\n //copy content of ./base_project to the new project directory\n const baseProjectPath = basePath;\n\n await this.processTplFolder(baseProjectPath, this.projectPath, {\n validation_library: this.validation_library,\n executor: this.executor,\n package_manager: this.packageManager,\n linter: this.linter,\n database_type: this.database_type,\n });\n console.log(`Copied base project files to: ${this.projectPath}`);\n\n //modify package.json with foldername\n const packageJsonPath = path.join(this.projectPath, \"package.json\");\n let packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n packageJson.name = Case.snake(path.basename(this.projectPath));\n\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n console.log(`Updated package.json with project name: ${packageJson.name}`);\n }\n\n async addPackage(packageName: string, dev: boolean = false) {\n let install_command = \"\";\n switch (this.packageManager) {\n case \"bun\":\n install_command = `bun add ${packageName}${dev ? \" -d\" : \"\"}`;\n break;\n case \"yarn\":\n install_command = `yarn add ${packageName}${dev ? \" -D\" : \"\"} --no-install`;\n break;\n case \"npm\":\n install_command = `npm install ${packageName}${dev ? \" --save-dev\" : \"\"} --package-lock-only`;\n break;\n }\n\n execSync(install_command, {\n stdio: \"inherit\",\n cwd: this.projectPath,\n });\n }\n\n async installPackages() {\n const install_command =\n this.packageManager === \"bun\"\n ? `bun install`\n : this.packageManager === \"yarn\"\n ? `yarn`\n : `npm install`;\n\n execSync(install_command, {\n stdio: \"inherit\",\n cwd: this.projectPath,\n });\n }\n\n async setupGit() {\n // ask if user wants to initialize git repository\n this.initGit =\n this.initGit ??\n (await select({\n message: \"Initialize a git repository?\",\n choices: [\n {\n name: \"Yes\",\n value: true,\n description: \"Initialize git and create first commit\",\n },\n {\n name: \"No\",\n value: false,\n description: \"Skip git initialization\",\n },\n ],\n }));\n\n if (this.initGit) {\n const gitignoreContent =\n [\n \"node_modules/\",\n \"dist/\",\n \".env\",\n \".env.*\",\n \"!.env.example\",\n \"*.log\",\n \"coverage/\",\n \".DS_Store\",\n ].join(\"\\n\") + \"\\n\";\n\n await fs.writeFile(\n path.join(this.projectPath, \".gitignore\"),\n gitignoreContent,\n );\n\n execSync(\n `git init; git add --all; git commit --allow-empty -m \"chore: first commit\"`,\n {\n cwd: this.projectPath,\n },\n );\n }\n }\n\n async catch(error: unknown) {\n if (Error.isError(error)) {\n console.error(error.message);\n } else {\n console.error(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED