@bogomolcompany/bogo 0.1.0 → 0.1.2
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/LICENSE +21 -0
- package/README.md +162 -28
- package/README.ru.md +223 -0
- package/dist/cli.js +87 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/add-method.d.ts +3 -0
- package/dist/commands/add-method.d.ts.map +1 -0
- package/dist/commands/add-method.js +48 -0
- package/dist/commands/add-method.js.map +1 -0
- package/dist/commands/create-app.d.ts +2 -0
- package/dist/commands/create-app.d.ts.map +1 -0
- package/dist/commands/create-app.js +19 -0
- package/dist/commands/create-app.js.map +1 -0
- package/dist/commands/generate-module.d.ts +2 -1
- package/dist/commands/generate-module.d.ts.map +1 -1
- package/dist/commands/generate-module.js +35 -25
- package/dist/commands/generate-module.js.map +1 -1
- package/dist/commands/remove-module.d.ts +4 -0
- package/dist/commands/remove-module.d.ts.map +1 -0
- package/dist/commands/remove-module.js +48 -0
- package/dist/commands/remove-module.js.map +1 -0
- package/dist/templates/module.d.ts +2 -1
- package/dist/templates/module.d.ts.map +1 -1
- package/dist/templates/module.js +19 -17
- package/dist/templates/module.js.map +1 -1
- package/dist/templates/project.d.ts +2 -0
- package/dist/templates/project.d.ts.map +1 -0
- package/dist/templates/project.js +205 -0
- package/dist/templates/project.js.map +1 -0
- package/dist/utils/parts.d.ts +4 -0
- package/dist/utils/parts.d.ts.map +1 -0
- package/dist/utils/parts.js +9 -0
- package/dist/utils/parts.js.map +1 -0
- package/dist/utils/patch-index.d.ts +1 -0
- package/dist/utils/patch-index.d.ts.map +1 -1
- package/dist/utils/patch-index.js +15 -0
- package/dist/utils/patch-index.js.map +1 -1
- package/dist/utils/patch-method.d.ts +21 -0
- package/dist/utils/patch-method.d.ts.map +1 -0
- package/dist/utils/patch-method.js +99 -0
- package/dist/utils/patch-method.js.map +1 -0
- package/package.json +25 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-method.js","sourceRoot":"","sources":["../../src/commands/add-method.ts"],"names":[],"mappings":";;AA0BA,oCAoCC;AA9DD,2BAA6D;AAC7D,+BAA4B;AAE5B,4CAA6C;AAC7C,4CAAqD;AACrD,wDAO+B;AAC/B,0CAA8C;AAE9C,MAAM,QAAQ,GAGV;IACF,UAAU,EAAE,oCAAqB;IACjC,OAAO,EAAE,iCAAkB;IAC3B,GAAG,EAAE,6BAAc;IACnB,SAAS,EAAE,mCAAoB;IAC/B,MAAM,EAAE,gCAAiB;CAC1B,CAAC;AAEF,SAAgB,YAAY,CAAC,GAAW,EAAE,UAAkB,EAAE,OAAyB;IACrF,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,8BAAe,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAY,CAAC;IACtE,MAAM,GAAG,GAA0B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,IAAA,kBAAa,EAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../../src/commands/create-app.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAelE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCreateApp = runCreateApp;
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const project_1 = require("../templates/project");
|
|
6
|
+
function runCreateApp(cwd, targetPath) {
|
|
7
|
+
const targetDir = (0, path_1.resolve)(cwd, targetPath);
|
|
8
|
+
const projectName = (0, path_1.basename)(targetDir).replace(/[^a-z0-9-]/gi, "-").toLowerCase() || "express-api";
|
|
9
|
+
const written = (0, project_1.writeProjectFiles)(targetDir, projectName);
|
|
10
|
+
console.log(`Express API project created at ${targetDir}:\n`);
|
|
11
|
+
for (const file of written) {
|
|
12
|
+
console.log(` ${file}`);
|
|
13
|
+
}
|
|
14
|
+
const cdStep = targetPath === "." ? "" : ` cd ${targetPath}\n`;
|
|
15
|
+
console.log(`\nNext steps:\n${cdStep} copy .env.example .env
|
|
16
|
+
npm install
|
|
17
|
+
npm run dev`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=create-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-app.js","sourceRoot":"","sources":["../../src/commands/create-app.ts"],"names":[],"mappings":";;AAGA,oCAeC;AAlBD,+BAA+C;AAC/C,kDAAyD;AAEzD,SAAgB,YAAY,CAAC,GAAW,EAAE,UAAkB;IAC1D,MAAM,SAAS,GAAG,IAAA,cAAO,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAA,eAAQ,EAAC,SAAS,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,aAAa,CAAC;IACpG,MAAM,OAAO,GAAG,IAAA,2BAAiB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,kCAAkC,SAAS,KAAK,CAAC,CAAC;IAC9D,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,UAAU,IAAI,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM;;cAExB,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { GenerateModuleOptions } from "../interfaces";
|
|
1
|
+
import { GenerateModuleOptions, ModulePart } from "../interfaces";
|
|
2
2
|
export declare function runInit(cwd: string): void;
|
|
3
3
|
export declare function runGenerateModule(cwd: string, moduleName: string, options: GenerateModuleOptions): void;
|
|
4
|
+
export declare function runGeneratePart(cwd: string, part: ModulePart, moduleName: string, options: GenerateModuleOptions): void;
|
|
4
5
|
//# sourceMappingURL=generate-module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-module.d.ts","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"generate-module.d.ts","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAyB,MAAM,eAAe,CAAC;AAqCzF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUzC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAiBvG;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CASN"}
|
|
@@ -2,21 +2,35 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.runInit = runInit;
|
|
4
4
|
exports.runGenerateModule = runGenerateModule;
|
|
5
|
+
exports.runGeneratePart = runGeneratePart;
|
|
5
6
|
const fs_1 = require("fs");
|
|
6
7
|
const path_1 = require("path");
|
|
7
8
|
const module_1 = require("../templates/module");
|
|
8
9
|
const config_1 = require("../utils/config");
|
|
9
10
|
const naming_1 = require("../utils/naming");
|
|
11
|
+
const patch_method_1 = require("../utils/patch-method");
|
|
10
12
|
const patch_index_1 = require("../utils/patch-index");
|
|
11
|
-
function
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
function buildContext(moduleName, options) {
|
|
14
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
15
|
+
const methods = options.methods.length > 0 ? options.methods.map(patch_method_1.parseMethodSpec) : [{ name: "execute" }];
|
|
16
|
+
return { names, methods };
|
|
17
|
+
}
|
|
18
|
+
function patchIndexIfNeeded(cwd, ctx, skipIndex, part) {
|
|
19
|
+
if (skipIndex || (part && part !== "routes")) {
|
|
20
|
+
if (skipIndex) {
|
|
21
|
+
console.log(`\nSkipped index patch (--skip-index)`);
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
26
|
+
const indexPath = (0, path_1.join)(cwd, config.indexFile);
|
|
27
|
+
const patched = (0, patch_index_1.patchIndexFile)(indexPath, ctx.names, config.routePrefix);
|
|
28
|
+
if (patched) {
|
|
29
|
+
console.log(`\nUpdated ${indexPath}`);
|
|
30
|
+
}
|
|
31
|
+
else if (!part) {
|
|
32
|
+
console.log(`\n${(0, patch_index_1.suggestIndexPatch)(ctx.names, config.routePrefix)}`);
|
|
15
33
|
}
|
|
16
|
-
return {
|
|
17
|
-
name,
|
|
18
|
-
route: route ? (0, naming_1.methodToRoutePath)(name, route) : undefined,
|
|
19
|
-
};
|
|
20
34
|
}
|
|
21
35
|
function runInit(cwd) {
|
|
22
36
|
const configPath = (0, path_1.join)(cwd, ".bogorc.json");
|
|
@@ -29,28 +43,24 @@ function runInit(cwd) {
|
|
|
29
43
|
}
|
|
30
44
|
function runGenerateModule(cwd, moduleName, options) {
|
|
31
45
|
const config = (0, config_1.loadConfig)(cwd);
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const targetDir = (0, path_1.join)(cwd, config.apiDir, names.kebab);
|
|
35
|
-
const indexPath = (0, path_1.join)(cwd, config.indexFile);
|
|
46
|
+
const ctx = buildContext(moduleName, options);
|
|
47
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, ctx.names.kebab);
|
|
36
48
|
if ((0, fs_1.existsSync)(targetDir)) {
|
|
37
49
|
throw new Error(`Module directory already exists: ${targetDir}`);
|
|
38
50
|
}
|
|
39
|
-
const written = (0, module_1.writeModuleFiles)(targetDir,
|
|
40
|
-
console.log(`Module "${names.kebab}" created:\n`);
|
|
51
|
+
const written = (0, module_1.writeModuleFiles)(targetDir, ctx);
|
|
52
|
+
console.log(`Module "${ctx.names.kebab}" created:\n`);
|
|
41
53
|
for (const file of written) {
|
|
42
54
|
console.log(` ${file}`);
|
|
43
55
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
console.log(`\n${(0, patch_index_1.suggestIndexPatch)(names, config.routePrefix)}`);
|
|
54
|
-
}
|
|
56
|
+
patchIndexIfNeeded(cwd, ctx, options.skipIndex);
|
|
57
|
+
}
|
|
58
|
+
function runGeneratePart(cwd, part, moduleName, options) {
|
|
59
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
60
|
+
const ctx = buildContext(moduleName, options);
|
|
61
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, ctx.names.kebab);
|
|
62
|
+
const written = (0, module_1.writePartFile)(targetDir, part, ctx);
|
|
63
|
+
console.log(`${part} for "${ctx.names.kebab}" created:\n ${written}`);
|
|
64
|
+
patchIndexIfNeeded(cwd, ctx, options.skipIndex, part);
|
|
55
65
|
}
|
|
56
66
|
//# sourceMappingURL=generate-module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-module.js","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generate-module.js","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":";;AAuCA,0BAUC;AAED,8CAiBC;AAED,0CAcC;AApFD,2BAA+C;AAC/C,+BAA4B;AAE5B,gDAAsE;AACtE,4CAAsE;AACtE,4CAAqD;AACrD,wDAAwD;AACxD,sDAAyE;AAEzE,SAAS,YAAY,CAAC,UAAkB,EAAE,OAA8B;IACtE,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,8BAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1G,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,kBAAkB,CACzB,GAAW,EACX,GAA0B,EAC1B,SAAkB,EAClB,IAAiB;IAEjB,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC7C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAA,4BAAc,EAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzE,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,+BAAiB,EAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAE7C,IAAI,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAA,gCAAuB,GAAE,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAW,EAAE,UAAkB,EAAE,OAA8B;IAC/F,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE5D,IAAI,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,yBAAgB,EAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,eAAe,CAC7B,GAAW,EACX,IAAgB,EAChB,UAAkB,EAClB,OAA8B;IAE9B,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAA,sBAAa,EAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK,iBAAiB,OAAO,EAAE,CAAC,CAAC;IAEvE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ModulePart, RemoveModuleOptions } from "../interfaces";
|
|
2
|
+
export declare function runRemoveModule(cwd: string, moduleName: string, options: RemoveModuleOptions): void;
|
|
3
|
+
export declare function runRemovePart(cwd: string, part: ModulePart, moduleName: string, options: RemoveModuleOptions): void;
|
|
4
|
+
//# sourceMappingURL=remove-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-module.d.ts","sourceRoot":"","sources":["../../src/commands/remove-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AA8BhE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAanG;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,IAAI,CAaN"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runRemoveModule = runRemoveModule;
|
|
4
|
+
exports.runRemovePart = runRemovePart;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const config_1 = require("../utils/config");
|
|
8
|
+
const naming_1 = require("../utils/naming");
|
|
9
|
+
const patch_index_1 = require("../utils/patch-index");
|
|
10
|
+
function unpatchIndexIfNeeded(cwd, moduleName, skipIndex, part) {
|
|
11
|
+
if (skipIndex) {
|
|
12
|
+
console.log(`\nSkipped index patch (--skip-index)`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (part && part !== "routes") {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
19
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
20
|
+
const indexPath = (0, path_1.join)(cwd, config.indexFile);
|
|
21
|
+
const unpatchd = (0, patch_index_1.unpatchIndexFile)(indexPath, names, config.routePrefix);
|
|
22
|
+
if (unpatchd) {
|
|
23
|
+
console.log(`\nUpdated ${indexPath}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function runRemoveModule(cwd, moduleName, options) {
|
|
27
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
28
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
29
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, names.kebab);
|
|
30
|
+
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
31
|
+
throw new Error(`Module directory not found: ${targetDir}`);
|
|
32
|
+
}
|
|
33
|
+
(0, fs_1.rmSync)(targetDir, { recursive: true, force: true });
|
|
34
|
+
console.log(`Module "${names.kebab}" removed:\n ${targetDir}`);
|
|
35
|
+
unpatchIndexIfNeeded(cwd, moduleName, options.skipIndex);
|
|
36
|
+
}
|
|
37
|
+
function runRemovePart(cwd, part, moduleName, options) {
|
|
38
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
39
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
40
|
+
const filePath = (0, path_1.join)(cwd, config.apiDir, names.kebab, `${names.kebab}.${part}.ts`);
|
|
41
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
42
|
+
throw new Error(`File not found: ${filePath}`);
|
|
43
|
+
}
|
|
44
|
+
(0, fs_1.rmSync)(filePath);
|
|
45
|
+
console.log(`${part} for "${names.kebab}" removed:\n ${filePath}`);
|
|
46
|
+
unpatchIndexIfNeeded(cwd, moduleName, options.skipIndex, part);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=remove-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-module.js","sourceRoot":"","sources":["../../src/commands/remove-module.ts"],"names":[],"mappings":";;AAgCA,0CAaC;AAED,sCAkBC;AAjED,2BAAwC;AACxC,+BAA4B;AAE5B,4CAA6C;AAC7C,4CAAqD;AACrD,sDAAwD;AAExD,SAAS,oBAAoB,CAC3B,GAAW,EACX,UAAkB,EAClB,SAAkB,EAClB,IAAiB;IAEjB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAA,8BAAgB,EAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAExE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,GAAW,EAAE,UAAkB,EAAE,OAA4B;IAC3F,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAA,WAAM,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,iBAAiB,SAAS,EAAE,CAAC,CAAC;IAEhE,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,aAAa,CAC3B,GAAW,EACX,IAAgB,EAChB,UAAkB,EAClB,OAA4B;IAE5B,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;IAEpF,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAA,WAAM,EAAC,QAAQ,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,KAAK,CAAC,KAAK,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAEpE,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ModuleTemplateContext } from "../interfaces";
|
|
1
|
+
import { ModulePart, ModuleTemplateContext } from "../interfaces";
|
|
2
2
|
export declare function renderController(ctx: ModuleTemplateContext): string;
|
|
3
3
|
export declare function renderService(ctx: ModuleTemplateContext): string;
|
|
4
4
|
export declare function renderDto(ctx: ModuleTemplateContext): string;
|
|
5
5
|
export declare function renderValidator(ctx: ModuleTemplateContext): string;
|
|
6
6
|
export declare function renderRoutes(ctx: ModuleTemplateContext): string;
|
|
7
|
+
export declare function writePartFile(targetDir: string, part: ModulePart, ctx: ModuleTemplateContext): string;
|
|
7
8
|
export declare function writeModuleFiles(targetDir: string, ctx: ModuleTemplateContext): string[];
|
|
8
9
|
//# sourceMappingURL=module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGlE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAwBnE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAsBhE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAS5D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAalE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAsB/D;AAUD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAcrG;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAGxF"}
|
package/dist/templates/module.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.renderService = renderService;
|
|
|
5
5
|
exports.renderDto = renderDto;
|
|
6
6
|
exports.renderValidator = renderValidator;
|
|
7
7
|
exports.renderRoutes = renderRoutes;
|
|
8
|
+
exports.writePartFile = writePartFile;
|
|
8
9
|
exports.writeModuleFiles = writeModuleFiles;
|
|
9
10
|
const fs_1 = require("fs");
|
|
10
11
|
const path_1 = require("path");
|
|
@@ -89,26 +90,27 @@ ${routes}
|
|
|
89
90
|
export default router;
|
|
90
91
|
`;
|
|
91
92
|
}
|
|
92
|
-
|
|
93
|
+
const PART_RENDERERS = {
|
|
94
|
+
controller: renderController,
|
|
95
|
+
service: renderService,
|
|
96
|
+
dto: renderDto,
|
|
97
|
+
validator: renderValidator,
|
|
98
|
+
routes: renderRoutes,
|
|
99
|
+
};
|
|
100
|
+
function writePartFile(targetDir, part, ctx) {
|
|
93
101
|
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
94
102
|
(0, fs_1.mkdirSync)(targetDir, { recursive: true });
|
|
95
103
|
}
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
[`${ctx.names.kebab}.validator.ts`, renderValidator(ctx)],
|
|
101
|
-
[`${ctx.names.kebab}.routes.ts`, renderRoutes(ctx)],
|
|
102
|
-
];
|
|
103
|
-
const written = [];
|
|
104
|
-
for (const [fileName, content] of files) {
|
|
105
|
-
const filePath = (0, path_1.join)(targetDir, fileName);
|
|
106
|
-
if ((0, fs_1.existsSync)(filePath)) {
|
|
107
|
-
throw new Error(`File already exists: ${filePath}`);
|
|
108
|
-
}
|
|
109
|
-
(0, fs_1.writeFileSync)(filePath, content, "utf-8");
|
|
110
|
-
written.push(filePath);
|
|
104
|
+
const fileName = `${ctx.names.kebab}.${part}.ts`;
|
|
105
|
+
const filePath = (0, path_1.join)(targetDir, fileName);
|
|
106
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
107
|
+
throw new Error(`File already exists: ${filePath}`);
|
|
111
108
|
}
|
|
112
|
-
|
|
109
|
+
(0, fs_1.writeFileSync)(filePath, PART_RENDERERS[part](ctx), "utf-8");
|
|
110
|
+
return filePath;
|
|
111
|
+
}
|
|
112
|
+
function writeModuleFiles(targetDir, ctx) {
|
|
113
|
+
const parts = ["controller", "service", "dto", "validator", "routes"];
|
|
114
|
+
return parts.map(part => writePartFile(targetDir, part, ctx));
|
|
113
115
|
}
|
|
114
116
|
//# sourceMappingURL=module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":";;AAKA,4CAwBC;AAED,sCAsBC;AAED,8BASC;AAED,0CAaC;AAED,oCAsBC;AAED,
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/templates/project.ts"],"names":[],"mappings":"AAqLA,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BlF"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeProjectFiles = writeProjectFiles;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const config_1 = require("../utils/config");
|
|
7
|
+
const PROJECT_FILES = {
|
|
8
|
+
"package.json": `{
|
|
9
|
+
"name": "express-api",
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"private": true,
|
|
12
|
+
"scripts": {
|
|
13
|
+
"dev": "ts-node src/index.ts",
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"start": "node dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"body-parser": "^1.20.3",
|
|
19
|
+
"dotenv": "^16.4.5",
|
|
20
|
+
"express": "^4.21.0",
|
|
21
|
+
"express-ipfilter": "^1.3.2",
|
|
22
|
+
"log-timestamp": "^0.3.0",
|
|
23
|
+
"zod": "^3.23.8"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/body-parser": "^1.19.5",
|
|
27
|
+
"@types/express": "^4.17.21",
|
|
28
|
+
"@types/node": "^22.5.0",
|
|
29
|
+
"ts-node": "^10.9.2",
|
|
30
|
+
"typescript": "^5.5.4"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`,
|
|
37
|
+
"tsconfig.json": `{
|
|
38
|
+
"compilerOptions": {
|
|
39
|
+
"target": "ES2022",
|
|
40
|
+
"module": "CommonJS",
|
|
41
|
+
"lib": ["ES2022"],
|
|
42
|
+
"outDir": "./dist",
|
|
43
|
+
"rootDir": "./src",
|
|
44
|
+
"strict": true,
|
|
45
|
+
"esModuleInterop": true,
|
|
46
|
+
"skipLibCheck": true,
|
|
47
|
+
"resolveJsonModule": true
|
|
48
|
+
},
|
|
49
|
+
"include": ["src/**/*"],
|
|
50
|
+
"exclude": ["node_modules", "dist"]
|
|
51
|
+
}
|
|
52
|
+
`,
|
|
53
|
+
".env.example": `PORT=3000
|
|
54
|
+
ALLOWED_IPS=
|
|
55
|
+
`,
|
|
56
|
+
".gitignore": `node_modules/
|
|
57
|
+
dist/
|
|
58
|
+
.env
|
|
59
|
+
*.log
|
|
60
|
+
.DS_Store
|
|
61
|
+
`,
|
|
62
|
+
"src/index.ts": `import bodyParser from "body-parser";
|
|
63
|
+
import config from "dotenv";
|
|
64
|
+
import express, { NextFunction, Request, Response } from "express";
|
|
65
|
+
import { IpDeniedError, IpFilter } from "express-ipfilter";
|
|
66
|
+
import "log-timestamp";
|
|
67
|
+
import { formatResponse } from "./middlewares/formatResponse";
|
|
68
|
+
import { logger } from "./middlewares/logger";
|
|
69
|
+
import { getAllowedIps } from "./utils/getAllowedIps";
|
|
70
|
+
|
|
71
|
+
config.config();
|
|
72
|
+
|
|
73
|
+
const app = express();
|
|
74
|
+
|
|
75
|
+
app.use(logger);
|
|
76
|
+
app.use(bodyParser.json());
|
|
77
|
+
app.use(bodyParser.urlencoded({ extended: true }));
|
|
78
|
+
app.use(formatResponse());
|
|
79
|
+
|
|
80
|
+
if (process.env.ALLOWED_IPS) {
|
|
81
|
+
const ipsInWhiteList = getAllowedIps(process.env.ALLOWED_IPS);
|
|
82
|
+
console.log("[INFO]: ALLOWED IPS:", ipsInWhiteList);
|
|
83
|
+
|
|
84
|
+
app.use((req: Request, _res: Response, next: NextFunction) => {
|
|
85
|
+
const clientIp = req.ip || req.connection.remoteAddress || "unknown";
|
|
86
|
+
console.log(\`[ACCESS ATTEMPT] IP: \${clientIp} | Method: \${req.method} | URL: \${req.originalUrl}\`);
|
|
87
|
+
next();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
app.use(IpFilter(ipsInWhiteList, { mode: "allow" }));
|
|
91
|
+
app.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
92
|
+
if (err instanceof IpDeniedError) {
|
|
93
|
+
return res.error(err, "401", 401);
|
|
94
|
+
}
|
|
95
|
+
next(err);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
app.get("/health", (_req, res) => res.success({ status: "ok" }));
|
|
100
|
+
|
|
101
|
+
app.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
102
|
+
console.log("[Global Error Handler] Unhandled error:", err);
|
|
103
|
+
if (!res.headersSent) {
|
|
104
|
+
return res.error(err, "INTERNAL_ERROR", 500);
|
|
105
|
+
}
|
|
106
|
+
next(err);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const port = process.env.PORT || 3000;
|
|
110
|
+
|
|
111
|
+
app.listen(port, () => {
|
|
112
|
+
console.log(\`[INFO]: Server started on port: \${port}\`);
|
|
113
|
+
});
|
|
114
|
+
`,
|
|
115
|
+
"src/types/express.d.ts": `declare global {
|
|
116
|
+
namespace Express {
|
|
117
|
+
interface Response {
|
|
118
|
+
success(data: unknown, statusCode?: number): Response;
|
|
119
|
+
error(error: unknown, code?: string, statusCode?: number): Response;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export {};
|
|
125
|
+
`,
|
|
126
|
+
"src/middlewares/logger.ts": `import { NextFunction, Request, Response } from "express";
|
|
127
|
+
|
|
128
|
+
export function logger(req: Request, res: Response, next: NextFunction) {
|
|
129
|
+
const start = Date.now();
|
|
130
|
+
res.on("finish", () => {
|
|
131
|
+
const duration = Date.now() - start;
|
|
132
|
+
console.log(\`[\${req.method}] \${req.originalUrl} \${res.statusCode} - \${duration}ms\`);
|
|
133
|
+
});
|
|
134
|
+
next();
|
|
135
|
+
}
|
|
136
|
+
`,
|
|
137
|
+
"src/middlewares/formatResponse.ts": `import { NextFunction, Request, Response } from "express";
|
|
138
|
+
|
|
139
|
+
export function formatResponse() {
|
|
140
|
+
return (_req: Request, res: Response, next: NextFunction) => {
|
|
141
|
+
res.success = (data, statusCode = 200) => {
|
|
142
|
+
return res.status(statusCode).json({ success: true, data });
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
res.error = (error, code = "ERROR", statusCode = 500) => {
|
|
146
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
147
|
+
return res.status(statusCode).json({ success: false, error: { code, message } });
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
next();
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
`,
|
|
154
|
+
"src/middlewares/validate.ts": `import { NextFunction, Request, Response } from "express";
|
|
155
|
+
import { ZodSchema } from "zod";
|
|
156
|
+
|
|
157
|
+
export function validate(schema: ZodSchema) {
|
|
158
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
159
|
+
const result = schema.safeParse({
|
|
160
|
+
body: req.body,
|
|
161
|
+
query: req.query,
|
|
162
|
+
params: req.params,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (!result.success) {
|
|
166
|
+
return res.error(result.error.flatten(), "VALIDATION_ERROR", 400);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
next();
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
`,
|
|
173
|
+
"src/utils/getAllowedIps.ts": `export function getAllowedIps(raw: string): string[] {
|
|
174
|
+
return raw.split(",").map(ip => ip.trim()).filter(Boolean);
|
|
175
|
+
}
|
|
176
|
+
`,
|
|
177
|
+
};
|
|
178
|
+
function renderPackageJson(projectName) {
|
|
179
|
+
const content = PROJECT_FILES["package.json"];
|
|
180
|
+
return content.replace('"name": "express-api"', `"name": "${projectName}"`);
|
|
181
|
+
}
|
|
182
|
+
function writeProjectFiles(targetDir, projectName) {
|
|
183
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(targetDir, "package.json"))) {
|
|
184
|
+
throw new Error(`Directory already contains package.json: ${targetDir}`);
|
|
185
|
+
}
|
|
186
|
+
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
187
|
+
(0, fs_1.mkdirSync)(targetDir, { recursive: true });
|
|
188
|
+
}
|
|
189
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(targetDir, "src", "api"), { recursive: true });
|
|
190
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(targetDir, "src", "middlewares"), { recursive: true });
|
|
191
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(targetDir, "src", "utils"), { recursive: true });
|
|
192
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(targetDir, "src", "types"), { recursive: true });
|
|
193
|
+
const written = [];
|
|
194
|
+
for (const [relativePath, content] of Object.entries(PROJECT_FILES)) {
|
|
195
|
+
const filePath = (0, path_1.join)(targetDir, relativePath);
|
|
196
|
+
const fileContent = relativePath === "package.json" ? renderPackageJson(projectName) : content;
|
|
197
|
+
(0, fs_1.writeFileSync)(filePath, fileContent, "utf-8");
|
|
198
|
+
written.push(filePath);
|
|
199
|
+
}
|
|
200
|
+
const configPath = (0, path_1.join)(targetDir, ".bogorc.json");
|
|
201
|
+
(0, fs_1.writeFileSync)(configPath, (0, config_1.getDefaultConfigContent)(), "utf-8");
|
|
202
|
+
written.push(configPath);
|
|
203
|
+
return written;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/templates/project.ts"],"names":[],"mappings":";;AAqLA,8CA4BC;AAjND,2BAA0D;AAC1D,+BAA4B;AAC5B,4CAA0D;AAE1D,MAAM,aAAa,GAA2B;IAC5C,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjB;IACC,eAAe,EAAE;;;;;;;;;;;;;;;CAelB;IACC,cAAc,EAAE;;CAEjB;IACC,YAAY,EAAE;;;;;CAKf;IACC,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDjB;IACC,wBAAwB,EAAE;;;;;;;;;;CAU3B;IACC,2BAA2B,EAAE;;;;;;;;;;CAU9B;IACC,mCAAmC,EAAE;;;;;;;;;;;;;;;;CAgBtC;IACC,6BAA6B,EAAE;;;;;;;;;;;;;;;;;;CAkBhC;IACC,4BAA4B,EAAE;;;CAG/B;CACA,CAAC;AAEF,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,YAAY,WAAW,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,WAAmB;IACtE,IAAI,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,YAAY,KAAK,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC/F,IAAA,kBAAa,EAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACnD,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAA,gCAAuB,GAAE,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEzB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/utils/parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,eAAO,MAAM,YAAY,EAAE,UAAU,EAA4D,CAAC;AAElG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MODULE_PARTS = void 0;
|
|
4
|
+
exports.isModulePart = isModulePart;
|
|
5
|
+
exports.MODULE_PARTS = ["controller", "service", "dto", "validator", "routes"];
|
|
6
|
+
function isModulePart(value) {
|
|
7
|
+
return exports.MODULE_PARTS.includes(value);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/utils/parts.ts"],"names":[],"mappings":";;;AAIA,oCAEC;AAJY,QAAA,YAAY,GAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAElG,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO,oBAAY,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ModuleNames } from "../interfaces";
|
|
2
2
|
export declare function patchIndexFile(indexPath: string, names: ModuleNames, routePrefix: string): boolean;
|
|
3
3
|
export declare function suggestIndexPatch(names: ModuleNames, routePrefix: string): string;
|
|
4
|
+
export declare function unpatchIndexFile(indexPath: string, names: ModuleNames, routePrefix: string): boolean;
|
|
4
5
|
//# sourceMappingURL=patch-index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch-index.d.ts","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiDlG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjF"}
|
|
1
|
+
{"version":3,"file":"patch-index.d.ts","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiDlG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiBpG"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.patchIndexFile = patchIndexFile;
|
|
4
4
|
exports.suggestIndexPatch = suggestIndexPatch;
|
|
5
|
+
exports.unpatchIndexFile = unpatchIndexFile;
|
|
5
6
|
const fs_1 = require("fs");
|
|
6
7
|
function patchIndexFile(indexPath, names, routePrefix) {
|
|
7
8
|
if (!(0, fs_1.existsSync)(indexPath)) {
|
|
@@ -55,4 +56,18 @@ function suggestIndexPatch(names, routePrefix) {
|
|
|
55
56
|
import ${names.pascal}Routes from "./api/${names.kebab}/${names.kebab}.routes";
|
|
56
57
|
app.use("${routePrefix}/${names.kebab}", ${names.pascal}Routes);`;
|
|
57
58
|
}
|
|
59
|
+
function unpatchIndexFile(indexPath, names, routePrefix) {
|
|
60
|
+
if (!(0, fs_1.existsSync)(indexPath)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const importLine = `import ${names.pascal}Routes from "./api/${names.kebab}/${names.kebab}.routes";`;
|
|
64
|
+
const useLine = `app.use("${routePrefix}/${names.kebab}", ${names.pascal}Routes);`;
|
|
65
|
+
const lines = (0, fs_1.readFileSync)(indexPath, "utf-8").split("\n");
|
|
66
|
+
const filtered = lines.filter(line => line !== importLine && line !== useLine);
|
|
67
|
+
if (filtered.length === lines.length) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
(0, fs_1.writeFileSync)(indexPath, filtered.join("\n"), "utf-8");
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
58
73
|
//# sourceMappingURL=patch-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch-index.js","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":";;AAIA,wCAiDC;AAED,8CAKC;
|
|
1
|
+
{"version":3,"file":"patch-index.js","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":"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"}
|