@sharangyawali/sg-cli 0.0.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 (79) hide show
  1. package/.prettierignore +1 -0
  2. package/README.md +0 -0
  3. package/bin/cli.js +3 -0
  4. package/package.json +27 -0
  5. package/src/commands/create-new.command.js +52 -0
  6. package/src/commands/generate.command.js +57 -0
  7. package/src/index.js +14 -0
  8. package/src/new-app-generator/app-module.generator.js +15 -0
  9. package/src/new-app-generator/app.generator.js +21 -0
  10. package/src/new-app-generator/application.generator.js +27 -0
  11. package/src/new-app-generator/common.generator.js +27 -0
  12. package/src/new-app-generator/domain.generator.js +34 -0
  13. package/src/new-app-generator/env-example.generator.js +25 -0
  14. package/src/new-app-generator/infra.generator.js +210 -0
  15. package/src/new-app-generator/main.generator.js +16 -0
  16. package/src/new-app-generator/package.generator.js +42 -0
  17. package/src/new-app-generator/tsconfig.generator.js +15 -0
  18. package/src/new-module-handler/controller.handlers.js +70 -0
  19. package/src/new-module-handler/datasources.handlers.js +37 -0
  20. package/src/new-module-handler/entity.handlers.js +75 -0
  21. package/src/new-module-handler/module.handlers.js +17 -0
  22. package/src/new-module-handler/repositories.handlers.js +87 -0
  23. package/src/new-module-handler/service.handlers.js +97 -0
  24. package/src/new-module-handler/usecase.handlers.js +67 -0
  25. package/src/utils/format.js +20 -0
  26. package/src/utils/get-ejs-files.js +9 -0
  27. package/src/utils/get-folders.js +8 -0
  28. package/src/utils/get-relative-path.js +7 -0
  29. package/src/utils/has-directory.js +10 -0
  30. package/src/utils/install-packages.js +19 -0
  31. package/src/utils/update-files.js +194 -0
  32. package/src/utils/write-file.js +12 -0
  33. package/templates/app/env.example.ejs +9 -0
  34. package/templates/app/package.json.ejs +12 -0
  35. package/templates/app/src/app.module.ejs +11 -0
  36. package/templates/app/src/application/application.module.ejs +11 -0
  37. package/templates/app/src/application/dto/index.ejs +0 -0
  38. package/templates/app/src/application/services/index.ejs +1 -0
  39. package/templates/app/src/application/services/service.module.ejs +8 -0
  40. package/templates/app/src/application/usecases/index.ejs +1 -0
  41. package/templates/app/src/application/usecases/usecase.module.ejs +8 -0
  42. package/templates/app/src/common/decorators/index.ejs +0 -0
  43. package/templates/app/src/common/enum/index.ejs +0 -0
  44. package/templates/app/src/common/helpers/index.ejs +0 -0
  45. package/templates/app/src/common/interfaces/index.ejs +0 -0
  46. package/templates/app/src/common/types/condition.d.ejs +3 -0
  47. package/templates/app/src/common/types/index.ejs +4 -0
  48. package/templates/app/src/common/types/pagination.d.ejs +34 -0
  49. package/templates/app/src/common/types/relation.d.ejs +3 -0
  50. package/templates/app/src/common/types/transactional.d.ejs +4 -0
  51. package/templates/app/src/domain/datasource/datasource.ejs +5 -0
  52. package/templates/app/src/domain/datasource/index.ejs +1 -0
  53. package/templates/app/src/domain/entities/base.entity.ejs +18 -0
  54. package/templates/app/src/domain/entities/index.ejs +1 -0
  55. package/templates/app/src/domain/repositories/generic.repository.ejs +25 -0
  56. package/templates/app/src/domain/repositories/index.ejs +1 -0
  57. package/templates/app/src/domain/services/index.ejs +0 -0
  58. package/templates/app/src/domain/usecase/base.usecase.ejs +3 -0
  59. package/templates/app/src/domain/usecase/index.ejs +1 -0
  60. package/templates/app/src/infra/controllers/controller.module.ejs +9 -0
  61. package/templates/app/src/infra/controllers/demo/demo-controller.module.ejs +7 -0
  62. package/templates/app/src/infra/controllers/demo/demo.controller.ejs +9 -0
  63. package/templates/app/src/infra/datasource/[database]/[database].datasource.ejs +15 -0
  64. package/templates/app/src/infra/datasource/[database]/[database].module.ejs +16 -0
  65. package/templates/app/src/infra/datasource/[database]/entities/base.entity.ejs +53 -0
  66. package/templates/app/src/infra/datasource/[database]/entities/index.ejs +1 -0
  67. package/templates/app/src/infra/datasource/[database]/providers/[database].provider.ejs +30 -0
  68. package/templates/app/src/infra/datasource/[database]/providers/index.ejs +1 -0
  69. package/templates/app/src/infra/datasource/[database]/repositories/[database]-generic.repository.ejs +117 -0
  70. package/templates/app/src/infra/datasource/[database]/repositories/index.ejs +1 -0
  71. package/templates/app/src/infra/datasource/datasource.module.ejs +7 -0
  72. package/templates/app/src/infra/infra.module.ejs +13 -0
  73. package/templates/app/src/infra/server/filters/index.ejs +0 -0
  74. package/templates/app/src/infra/server/guard/index.ejs +0 -0
  75. package/templates/app/src/infra/server/interceptor/index.ejs +0 -0
  76. package/templates/app/src/infra/server/middleware/index.ejs +0 -0
  77. package/templates/app/src/infra/server/server.module.ejs +7 -0
  78. package/templates/app/src/main.ejs +10 -0
  79. package/templates/app/tsconfig.json.ejs +31 -0
@@ -0,0 +1 @@
1
+ *.ejs
package/README.md ADDED
File without changes
package/bin/cli.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import "../src/index.js";
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@sharangyawali/sg-cli",
3
+ "version": "0.0.1",
4
+ "main": "index.js",
5
+ "type": "module",
6
+ "bin": {
7
+ "sg-cli": "bin/cli.js"
8
+ },
9
+ "scripts": {
10
+ "test": "echo \"Error: no test specified\" && exit 1"
11
+ },
12
+ "keywords": [],
13
+ "author": "Sharan Gyawali",
14
+ "license": "ISC",
15
+ "description": "SG-APP - Express App In CLEAN ARCHITECTURE",
16
+ "dependencies": {
17
+ "chalk": "^5.6.2",
18
+ "chalk-animation": "^2.0.3",
19
+ "child-process": "^1.0.2",
20
+ "commander": "^14.0.2",
21
+ "ejs": "^3.1.10",
22
+ "fs-extra": "^11.3.3",
23
+ "inquirer": "^13.1.0",
24
+ "prettier": "^3.7.4",
25
+ "ts-morph": "^27.0.2"
26
+ }
27
+ }
@@ -0,0 +1,52 @@
1
+ import chalkAnimation from "chalk-animation";
2
+ import { confirm, select } from "@inquirer/prompts";
3
+ import { generateApp } from "../new-app-generator/app.generator.js";
4
+
5
+ export function create(program) {
6
+ program
7
+ .command("create-new <appName>")
8
+ .description("GENERATES SG-APP IN CLEAN ARCHITECTURE")
9
+ .action(async (appName) => {
10
+ const sleep = (ms = 2000) => new Promise((r) => setTimeout(r, ms));
11
+ const rainbowTitle = chalkAnimation.rainbow(
12
+ "Wants to generate files in clean architecture? \n"
13
+ );
14
+ await sleep();
15
+ rainbowTitle.stop();
16
+ const needTypeOrm = await confirm({
17
+ message: "Do you want to initialize typeorm?",
18
+ default: true,
19
+ });
20
+ let dbName;
21
+ if (needTypeOrm) {
22
+ const database = await select({
23
+ message: "Choose one of the database",
24
+ choices: [
25
+ {
26
+ name: "Postgres",
27
+ value: "postgres",
28
+ },
29
+ {
30
+ name: "MySql",
31
+ value: "mysql",
32
+ },
33
+ {
34
+ name: "Sqlite",
35
+ value: "sqlite",
36
+ },
37
+ {
38
+ name: "MongoDb",
39
+ value: "mongodb",
40
+ },
41
+ ],
42
+ default: "postgres",
43
+ });
44
+ dbName = database;
45
+ }
46
+ const processingMessage = chalkAnimation.rainbow(
47
+ "Generating your application .... \n"
48
+ );
49
+ await generateApp(appName, dbName);
50
+ processingMessage.stop();
51
+ });
52
+ }
@@ -0,0 +1,57 @@
1
+ import inquirer from "inquirer";
2
+ import chalkAnimation from "chalk-animation";
3
+ import { getFolders } from "../utils/get-folders.js";
4
+ import path from "path";
5
+ import { hasDirectory } from "../utils/has-directory.js";
6
+ import { select } from "@inquirer/prompts";
7
+ import { handleModule } from "../new-module-handler/module.handlers.js";
8
+
9
+ export function generate(program) {
10
+ program
11
+ .command("generate")
12
+ .description("GENERATES NEW MODULE")
13
+ .action(async () => {
14
+ const sleep = (ms = 2000) => new Promise((r) => setTimeout(r, ms));
15
+ const rainbowTitle = chalkAnimation.rainbow(
16
+ "Wants to generate new module? \n"
17
+ );
18
+ await sleep();
19
+ rainbowTitle.stop();
20
+ const { fileName, className } = await inquirer.prompt([
21
+ {
22
+ message: "Enter file name to generate",
23
+ type: "input",
24
+ name: "fileName",
25
+ },
26
+ {
27
+ message: "Enter class name to generate",
28
+ type: "input",
29
+ name: "className",
30
+ },
31
+ ]);
32
+ let dbName;
33
+ const datasourcePath = path.join(process.cwd(), "src/infra/datasource");
34
+ const isDirectoryPresent = hasDirectory(datasourcePath);
35
+ if (isDirectoryPresent) {
36
+ const files = await getFolders(datasourcePath);
37
+ if (files.length == 1) dbName = files[0].name;
38
+ else {
39
+ const choices = files.map((f) => {
40
+ return { name: f.name, value: f.name };
41
+ });
42
+ const selectedFolder = await select({
43
+ message:
44
+ "Detected multiple folders inside datasource!! \n Please select one",
45
+ choices: choices,
46
+ default: choices[0].value,
47
+ });
48
+ dbName = selectedFolder;
49
+ }
50
+ }
51
+ const processingMessage = chalkAnimation.rainbow(
52
+ "Generating your module .... \n"
53
+ );
54
+ await handleModule(className, fileName, dbName);
55
+ processingMessage.stop();
56
+ });
57
+ }
package/src/index.js ADDED
@@ -0,0 +1,14 @@
1
+ import { Command } from "commander";
2
+ import { create } from "./commands/create-new.command.js";
3
+ import { generate } from "./commands/generate.command.js";
4
+ const program = new Command();
5
+
6
+ program
7
+ .name("SG-CLI")
8
+ .description("SG-APP - Express App In CLEAN ARCHITECTURE")
9
+ .version("0.0.1");
10
+
11
+ create(program);
12
+ generate(program);
13
+
14
+ program.parse(process.argv);
@@ -0,0 +1,15 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ export async function generateAppModule(appName) {
10
+ const root = path.join(process.cwd(), appName, "src/app.module.ts");
11
+ const contents = await ejs.renderFile(
12
+ path.join(__dirname, "../../templates/app/src/app.module.ejs"),
13
+ );
14
+ await writeFile(root, contents);
15
+ }
@@ -0,0 +1,21 @@
1
+ import { generateAppModule } from "./app-module.generator.js";
2
+ import { generateApplication } from "./application.generator.js";
3
+ import { generateCommon } from "./common.generator.js";
4
+ import { generateDomain } from "./domain.generator.js";
5
+ import { generateEnvExample } from "./env-example.generator.js";
6
+ import { generateInfra } from "./infra.generator.js";
7
+ import { generateMain } from "./main.generator.js";
8
+ import { generatePackageJson } from "./package.generator.js";
9
+ import { generateTsConfig } from "./tsconfig.generator.js";
10
+
11
+ export async function generateApp(appName, dbName) {
12
+ await generatePackageJson(appName, dbName);
13
+ await generateApplication(appName);
14
+ await generateCommon(appName);
15
+ await generateDomain(appName, dbName);
16
+ await generateInfra(appName, dbName);
17
+ await generateAppModule(appName);
18
+ await generateTsConfig(appName);
19
+ await generateMain(appName);
20
+ await generateEnvExample(appName, dbName);
21
+ }
@@ -0,0 +1,27 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { getAllEjsFiles } from "../utils/get-ejs-files.js";
5
+ import { getRelativePath } from "../utils/get-relative-path.js";
6
+ import { fileURLToPath } from "url";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export async function generateApplication(appName) {
12
+ const files = await getAllEjsFiles(
13
+ path.join(__dirname, "../../templates/app/src/application"),
14
+ );
15
+ for (const file of files) {
16
+ const root = path.join(
17
+ process.cwd(),
18
+ appName,
19
+ getRelativePath(file.parentPath),
20
+ file.name.replace(".ejs", ".ts"),
21
+ );
22
+ const contents = await ejs.renderFile(
23
+ path.join(file.parentPath, file.name),
24
+ );
25
+ await writeFile(root, contents);
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { getAllEjsFiles } from "../utils/get-ejs-files.js";
5
+ import { getRelativePath } from "../utils/get-relative-path.js";
6
+ import { fileURLToPath } from "url";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export async function generateCommon(appName) {
12
+ const files = await getAllEjsFiles(
13
+ path.join(__dirname, "../../templates/app/src/common"),
14
+ );
15
+ for (const file of files) {
16
+ const root = path.join(
17
+ process.cwd(),
18
+ appName,
19
+ getRelativePath(file.parentPath),
20
+ file.name.replace(".ejs", ".ts"),
21
+ );
22
+ const contents = await ejs.renderFile(
23
+ path.join(file.parentPath, file.name),
24
+ );
25
+ await writeFile(root, contents);
26
+ }
27
+ }
@@ -0,0 +1,34 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { getAllEjsFiles } from "../utils/get-ejs-files.js";
5
+ import { getRelativePath } from "../utils/get-relative-path.js";
6
+ import { fileURLToPath } from "url";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export async function generateDomain(appName, dbName) {
12
+ const files = await getAllEjsFiles(
13
+ path.join(__dirname, "../../templates/app/src/domain"),
14
+ );
15
+ for (const file of files) {
16
+ if (
17
+ dbName ||
18
+ (!file.parentPath.includes("datasource") &&
19
+ !file.parentPath.includes("entities") &&
20
+ !file.parentPath.includes("repositories"))
21
+ ) {
22
+ const root = path.join(
23
+ process.cwd(),
24
+ appName,
25
+ getRelativePath(file.parentPath),
26
+ file.name.replace(".ejs", ".ts"),
27
+ );
28
+ const contents = await ejs.renderFile(
29
+ path.join(file.parentPath, file.name),
30
+ );
31
+ await writeFile(root, contents);
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,25 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ export async function generateEnvExample(appName, dbName) {
10
+ const root = path.join(process.cwd(), appName, ".env.example");
11
+ let contents;
12
+ if (dbName)
13
+ contents = await ejs.renderFile(
14
+ path.join(__dirname, "../../templates/app/env.example.ejs"),
15
+ {
16
+ DATABASE: dbName.toUpperCase(),
17
+ },
18
+ );
19
+ else
20
+ contents = `
21
+ #APPLICATION
22
+ APP_PORT = "<< APP_PORT HERE >>"
23
+ `;
24
+ await writeFile(root, contents, true);
25
+ }
@@ -0,0 +1,210 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { getAllEjsFiles } from "../utils/get-ejs-files.js";
5
+ import { getRelativePath } from "../utils/get-relative-path.js";
6
+ import { fileURLToPath } from "url";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ async function generateController(appName) {
12
+ const files = await getAllEjsFiles(
13
+ path.join(__dirname, "../../templates/app/src/infra/controllers"),
14
+ );
15
+ for (const file of files) {
16
+ const root = path.join(
17
+ process.cwd(),
18
+ appName,
19
+ getRelativePath(file.parentPath),
20
+ file.name.replace(".ejs", ".ts"),
21
+ );
22
+ const contents = await ejs.renderFile(
23
+ path.join(file.parentPath, file.name),
24
+ );
25
+ await writeFile(root, contents);
26
+ }
27
+ }
28
+
29
+ async function generateServer(appName) {
30
+ const files = await getAllEjsFiles(
31
+ path.join(__dirname, "../../templates/app/src/infra/server"),
32
+ );
33
+ for (const file of files) {
34
+ const root = path.join(
35
+ process.cwd(),
36
+ appName,
37
+ getRelativePath(file.parentPath),
38
+ file.name.replace(".ejs", ".ts"),
39
+ );
40
+ const contents = await ejs.renderFile(
41
+ path.join(file.parentPath, file.name),
42
+ );
43
+ await writeFile(root, contents);
44
+ }
45
+ }
46
+
47
+ async function generateEntities(appName, dbName) {
48
+ const files = await getAllEjsFiles(
49
+ path.join(
50
+ __dirname,
51
+ "../../templates/app/src/infra/datasource/[database]/entities",
52
+ ),
53
+ );
54
+ for (const file of files) {
55
+ const root = path.join(
56
+ process.cwd(),
57
+ appName,
58
+ getRelativePath(file.parentPath),
59
+ file.name.replace(".ejs", ".ts"),
60
+ );
61
+ const contents = await ejs.renderFile(
62
+ path.join(file.parentPath, file.name),
63
+ );
64
+ await writeFile(root.replace(/\[database\]/g, dbName), contents);
65
+ }
66
+ }
67
+
68
+ async function generateProviders(appName, dbName) {
69
+ const files = await getAllEjsFiles(
70
+ path.join(
71
+ __dirname,
72
+ "../../templates/app/src/infra/datasource/[database]/providers",
73
+ ),
74
+ );
75
+ for (const file of files) {
76
+ const root = path.join(
77
+ process.cwd(),
78
+ appName,
79
+ getRelativePath(file.parentPath),
80
+ file.name.replace(".ejs", ".ts"),
81
+ );
82
+ const contents = await ejs.renderFile(
83
+ path.join(file.parentPath, file.name),
84
+ {
85
+ database: dbName,
86
+ DATABASE: dbName.toUpperCase(),
87
+ },
88
+ );
89
+ await writeFile(root.replace(/\[database\]/g, dbName), contents);
90
+ }
91
+ }
92
+
93
+ async function generateRepositories(appName, dbName) {
94
+ const files = await getAllEjsFiles(
95
+ path.join(
96
+ __dirname,
97
+ "../../templates/app/src/infra/datasource/[database]/repositories",
98
+ ),
99
+ );
100
+ for (const file of files) {
101
+ const root = path.join(
102
+ process.cwd(),
103
+ appName,
104
+ getRelativePath(file.parentPath),
105
+ file.name.replace(".ejs", ".ts"),
106
+ );
107
+ root.replace(/\[database\]/g, dbName);
108
+ const contents = await ejs.renderFile(
109
+ path.join(file.parentPath, file.name),
110
+ {
111
+ Database: dbName.charAt(0).toUpperCase() + dbName.slice(1),
112
+ database: dbName,
113
+ },
114
+ );
115
+ await writeFile(root.replace(/\[database\]/g, dbName), contents);
116
+ }
117
+ }
118
+
119
+ async function generateDbDatasource(appName, dbName) {
120
+ const root = path.join(
121
+ process.cwd(),
122
+ appName,
123
+ `src/infra/datasource/${dbName}/${dbName}.datasource.ts`,
124
+ );
125
+ const contents = await ejs.renderFile(
126
+ path.join(
127
+ __dirname,
128
+ "../../templates/app/src/infra/datasource/[database]/[database].datasource.ejs",
129
+ ),
130
+ {
131
+ DATABASE: dbName.toUpperCase(),
132
+ Database: dbName.charAt(0).toUpperCase() + dbName.slice(1),
133
+ },
134
+ );
135
+ await writeFile(root, contents);
136
+ }
137
+
138
+ async function generateDbModule(appName, dbName) {
139
+ const root = path.join(
140
+ process.cwd(),
141
+ appName,
142
+ `src/infra/datasource/${dbName}/${dbName}.module.ts`,
143
+ );
144
+ const contents = await ejs.renderFile(
145
+ path.join(
146
+ __dirname,
147
+ "../../templates/app/src/infra/datasource/[database]/[database].module.ejs",
148
+ ),
149
+ {
150
+ database: dbName,
151
+ Database: dbName.charAt(0).toUpperCase() + dbName.slice(1),
152
+ },
153
+ );
154
+ await writeFile(root, contents);
155
+ }
156
+
157
+ async function generateDatasourceModule(appName, dbName) {
158
+ const root = path.join(
159
+ process.cwd(),
160
+ appName,
161
+ `src/infra/datasource/datasource.module.ts`,
162
+ );
163
+ const contents = await ejs.renderFile(
164
+ path.join(
165
+ __dirname,
166
+ "../../templates/app/src/infra/datasource/datasource.module.ejs",
167
+ ),
168
+ {
169
+ Database: dbName.charAt(0).toUpperCase() + dbName.slice(1),
170
+ database: dbName,
171
+ },
172
+ );
173
+ await writeFile(root, contents);
174
+ }
175
+
176
+ async function generateDataSource(appName, dbName) {
177
+ dbName = dbName.toLowerCase();
178
+ await generateEntities(appName, dbName);
179
+ await generateProviders(appName, dbName);
180
+ await generateRepositories(appName, dbName);
181
+ await generateDbDatasource(appName, dbName);
182
+ await generateDbModule(appName, dbName);
183
+ await generateDatasourceModule(appName, dbName);
184
+ }
185
+
186
+ async function generateInfraModule(appName, dbName) {
187
+ const root = path.join(process.cwd(), appName, "src/infra/infra.module.ts");
188
+ let contents = await ejs.renderFile(
189
+ path.join(__dirname, "../../templates/app/src/infra/infra.module.ejs"),
190
+ );
191
+ if (!dbName) {
192
+ contents = contents
193
+ .replace(
194
+ /^\s*import\s+\{\s*DataSourceModule\s*\}\s+from\s+["'][^"']+["'];\s*\n?/gm,
195
+ "",
196
+ )
197
+ .replace(
198
+ /(\bimports\s*:\s*\[[\s\S]*?)(\s*DataSourceModule\s*,?\s*)([\s\S]*?\])/m,
199
+ "$1$3",
200
+ );
201
+ }
202
+ await writeFile(root, contents);
203
+ }
204
+
205
+ export async function generateInfra(appName, dbName) {
206
+ await generateController(appName);
207
+ await generateServer(appName);
208
+ if (dbName) await generateDataSource(appName, dbName);
209
+ await generateInfraModule(appName, dbName);
210
+ }
@@ -0,0 +1,16 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ export async function generateMain(appName) {
10
+ const root = path.join(process.cwd(), appName, "src/main.ts");
11
+ const contents = await ejs.renderFile(
12
+ path.join(__dirname, "../../templates/app/src/main.ejs"),
13
+ {},
14
+ );
15
+ await writeFile(root, contents);
16
+ }
@@ -0,0 +1,42 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { installPackages } from "../utils/install-packages.js";
5
+ import { fileURLToPath } from "url";
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function generatePackageJson(appName, dbName) {
11
+ const root = path.join(process.cwd(), appName, "package.json");
12
+ const contents = await ejs.renderFile(
13
+ path.join(__dirname, "../../templates/app/package.json.ejs"),
14
+ {
15
+ name: appName,
16
+ },
17
+ );
18
+ await writeFile(root, contents);
19
+ let dbPackage;
20
+ if (dbName) {
21
+ switch (dbName) {
22
+ case "mysql":
23
+ dbPackage = "mysql2";
24
+ break;
25
+ case "sqlite":
26
+ dbPackage = "sqlite3";
27
+ break;
28
+ case "mongodb":
29
+ dbPackage = "mongodb";
30
+ break;
31
+ default:
32
+ dbPackage = "pg";
33
+ break;
34
+ }
35
+ }
36
+ dbPackage
37
+ ? await installPackages(appName, [
38
+ `@sharangyawali/sg-app typeorm ${dbPackage} --save`,
39
+ ])
40
+ : await installPackages(appName, ["@sharangyawali/sg-app --save"]);
41
+ await installPackages(appName, ["typescript ts-node-dev --save-dev"]);
42
+ }
@@ -0,0 +1,15 @@
1
+ import path from "path";
2
+ import ejs from "ejs";
3
+ import { writeFile } from "../utils/write-file.js";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ export async function generateTsConfig(appName) {
10
+ const root = path.join(process.cwd(), appName, "tsconfig.json");
11
+ const contents = await ejs.renderFile(
12
+ path.join(__dirname, "../../templates/app/tsconfig.json.ejs"),
13
+ );
14
+ await writeFile(root, contents);
15
+ }
@@ -0,0 +1,70 @@
1
+ import { updateModulesProviders } from "../utils/update-files.js";
2
+ import path from "path";
3
+ import ejs from "ejs";
4
+ import { writeFile } from "../utils/write-file.js";
5
+
6
+ async function handleControllerFile(className, fileName) {
7
+ const root = path.join(
8
+ process.cwd(),
9
+ "src/infra/controllers",
10
+ fileName,
11
+ `${fileName}.controller.ts`,
12
+ );
13
+ const contents = await ejs.render(
14
+ `
15
+ import { RestController } from "@sharangyawali/sg-app";
16
+
17
+ @RestController("<%= controller %>")
18
+ export class <%= className %>Controller {
19
+ }
20
+ `,
21
+ {
22
+ className: className,
23
+ controller: className.toLowerCase(),
24
+ },
25
+ {
26
+ async: true,
27
+ },
28
+ );
29
+ await writeFile(root, contents);
30
+ }
31
+
32
+ async function handleControllerModule(className, fileName) {
33
+ const root = path.join(
34
+ process.cwd(),
35
+ "src/infra/controllers",
36
+ fileName,
37
+ `${fileName}-controller.module.ts`,
38
+ );
39
+ const contents = await ejs.render(
40
+ `
41
+ import { Module } from "@sharangyawali/sg-app";
42
+ import { <%= className %>Controller } from "./<%= fileName %>.controller";
43
+
44
+ @Module({
45
+ controllers: [<%= className %>Controller],
46
+ })
47
+ export class <%= className %>ControllerModule {}
48
+ `,
49
+ {
50
+ className: className,
51
+ fileName,
52
+ },
53
+ {
54
+ async: true,
55
+ },
56
+ );
57
+ await writeFile(root, contents);
58
+ await updateModulesProviders(
59
+ path.join(process.cwd(), "src/infra/controllers", `controller.module.ts`),
60
+ "ControllerModule",
61
+ `./${fileName}/${fileName}-controller.module`,
62
+ `${className}ControllerModule`,
63
+ true,
64
+ );
65
+ }
66
+
67
+ export async function handleController(className, fileName) {
68
+ await handleControllerFile(className, fileName);
69
+ await handleControllerModule(className, fileName);
70
+ }