@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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -28
  3. package/README.ru.md +223 -0
  4. package/dist/cli.js +87 -9
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/add-method.d.ts +3 -0
  7. package/dist/commands/add-method.d.ts.map +1 -0
  8. package/dist/commands/add-method.js +48 -0
  9. package/dist/commands/add-method.js.map +1 -0
  10. package/dist/commands/create-app.d.ts +2 -0
  11. package/dist/commands/create-app.d.ts.map +1 -0
  12. package/dist/commands/create-app.js +19 -0
  13. package/dist/commands/create-app.js.map +1 -0
  14. package/dist/commands/generate-module.d.ts +2 -1
  15. package/dist/commands/generate-module.d.ts.map +1 -1
  16. package/dist/commands/generate-module.js +35 -25
  17. package/dist/commands/generate-module.js.map +1 -1
  18. package/dist/commands/remove-module.d.ts +4 -0
  19. package/dist/commands/remove-module.d.ts.map +1 -0
  20. package/dist/commands/remove-module.js +48 -0
  21. package/dist/commands/remove-module.js.map +1 -0
  22. package/dist/templates/module.d.ts +2 -1
  23. package/dist/templates/module.d.ts.map +1 -1
  24. package/dist/templates/module.js +19 -17
  25. package/dist/templates/module.js.map +1 -1
  26. package/dist/templates/project.d.ts +2 -0
  27. package/dist/templates/project.d.ts.map +1 -0
  28. package/dist/templates/project.js +205 -0
  29. package/dist/templates/project.js.map +1 -0
  30. package/dist/utils/parts.d.ts +4 -0
  31. package/dist/utils/parts.d.ts.map +1 -0
  32. package/dist/utils/parts.js +9 -0
  33. package/dist/utils/parts.js.map +1 -0
  34. package/dist/utils/patch-index.d.ts +1 -0
  35. package/dist/utils/patch-index.d.ts.map +1 -1
  36. package/dist/utils/patch-index.js +15 -0
  37. package/dist/utils/patch-index.js.map +1 -1
  38. package/dist/utils/patch-method.d.ts +21 -0
  39. package/dist/utils/patch-method.d.ts.map +1 -0
  40. package/dist/utils/patch-method.js +99 -0
  41. package/dist/utils/patch-method.js.map +1 -0
  42. package/package.json +25 -3
@@ -0,0 +1,21 @@
1
+ import { MethodSpec } from "../interfaces";
2
+ export declare function parseMethodSpec(raw: string): MethodSpec;
3
+ export declare function patchControllerMethod(content: string, ctx: {
4
+ names: {
5
+ pascal: string;
6
+ };
7
+ }, method: MethodSpec): string;
8
+ export declare function patchServiceMethod(content: string, ctx: {
9
+ names: {
10
+ kebab: string;
11
+ pascal: string;
12
+ };
13
+ }, method: MethodSpec): string;
14
+ export declare function patchDtoMethod(content: string, _ctx: unknown, method: MethodSpec): string;
15
+ export declare function patchValidatorMethod(content: string, _ctx: unknown, method: MethodSpec): string;
16
+ export declare function patchRoutesMethod(content: string, ctx: {
17
+ names: {
18
+ kebab: string;
19
+ };
20
+ }, method: MethodSpec): string;
21
+ //# sourceMappingURL=patch-method.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-method.d.ts","sourceRoot":"","sources":["../../src/utils/patch-method.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CASvD;AAgBD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAqBrH;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACjD,MAAM,EAAE,UAAU,GACjB,MAAM,CAsBR;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CASzF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAY/F;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACjC,MAAM,EAAE,UAAU,GACjB,MAAM,CAoBR"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseMethodSpec = parseMethodSpec;
4
+ exports.patchControllerMethod = patchControllerMethod;
5
+ exports.patchServiceMethod = patchServiceMethod;
6
+ exports.patchDtoMethod = patchDtoMethod;
7
+ exports.patchValidatorMethod = patchValidatorMethod;
8
+ exports.patchRoutesMethod = patchRoutesMethod;
9
+ const naming_1 = require("./naming");
10
+ function parseMethodSpec(raw) {
11
+ const [name, route] = raw.split(":");
12
+ if (!name || !/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {
13
+ throw new Error(`Invalid method name: "${raw}". Use camelCase, e.g. getList or getList:/custom-path`);
14
+ }
15
+ return {
16
+ name,
17
+ route: route ? (0, naming_1.methodToRoutePath)(name, route) : undefined,
18
+ };
19
+ }
20
+ function addImportSymbol(content, importPattern, symbol) {
21
+ const match = content.match(importPattern);
22
+ if (!match) {
23
+ return content;
24
+ }
25
+ const symbols = match[1].split(",").map(value => value.trim()).filter(Boolean);
26
+ if (symbols.includes(symbol)) {
27
+ return content;
28
+ }
29
+ return content.replace(match[0], match[0].replace(match[1], `${match[1]}, ${symbol}`));
30
+ }
31
+ function patchControllerMethod(content, ctx, method) {
32
+ if (new RegExp(`async ${method.name}\\(`).test(content)) {
33
+ throw new Error(`Method "${method.name}" already exists in controller`);
34
+ }
35
+ const snippet = `
36
+ async ${method.name}(req: e.Request, res: e.Response) {
37
+ try {
38
+ const result = await ${ctx.names.pascal}Service.${method.name}(req.body);
39
+ return res.success(result);
40
+ } catch (error) {
41
+ return res.error(error);
42
+ }
43
+ }`;
44
+ const updated = content.replace(/(\n}\n\nexport default new .+Controller\(\);)/, `${snippet}$1`);
45
+ if (updated === content) {
46
+ throw new Error("Could not patch controller file");
47
+ }
48
+ return updated;
49
+ }
50
+ function patchServiceMethod(content, ctx, method) {
51
+ if (new RegExp(`async ${method.name}\\(`).test(content)) {
52
+ throw new Error(`Method "${method.name}" already exists in service`);
53
+ }
54
+ let updated = addImportSymbol(content, new RegExp(`import \\{ (.+) \\} from "\\./${ctx.names.kebab}\\.dto";`), `${method.name}DTO`);
55
+ const snippet = `
56
+ async ${method.name}(body: ${method.name}DTO) {
57
+ throw new Error("${ctx.names.pascal}Service.${method.name} is not implemented");
58
+ }`;
59
+ updated = updated.replace(/(\n}\n\nexport default new .+Service\(\);)/, `${snippet}$1`);
60
+ if (updated === content) {
61
+ throw new Error("Could not patch service file");
62
+ }
63
+ return updated;
64
+ }
65
+ function patchDtoMethod(content, _ctx, method) {
66
+ if (new RegExp(`interface ${method.name}DTO`).test(content)) {
67
+ throw new Error(`Method "${method.name}" already exists in dto`);
68
+ }
69
+ return `${content.trimEnd()}\nexport interface ${method.name}DTO {
70
+ // TODO: define fields
71
+ }
72
+ `;
73
+ }
74
+ function patchValidatorMethod(content, _ctx, method) {
75
+ if (new RegExp(`export const ${method.name} =`).test(content)) {
76
+ throw new Error(`Method "${method.name}" already exists in validator`);
77
+ }
78
+ return `${content.trimEnd()}
79
+ export const ${method.name} = z.object({
80
+ body: z.object({
81
+ // TODO: define validation schema
82
+ }),
83
+ });
84
+ `;
85
+ }
86
+ function patchRoutesMethod(content, ctx, method) {
87
+ if (content.includes(`controller.${method.name}(`)) {
88
+ throw new Error(`Method "${method.name}" already exists in routes`);
89
+ }
90
+ let updated = addImportSymbol(content, new RegExp(`import \\{ (.+) \\} from "\\./${ctx.names.kebab}\\.validator";`), method.name);
91
+ const routePath = (0, naming_1.methodToRoutePath)(method.name, method.route);
92
+ const snippet = `router.post("${routePath}", validate(${method.name}), (req: Request, res: Response) => controller.${method.name}(req, res));`;
93
+ updated = updated.replace(/(\n\nexport default router;\n?)$/, `\n${snippet}$1`);
94
+ if (updated === content) {
95
+ throw new Error("Could not patch routes file");
96
+ }
97
+ return updated;
98
+ }
99
+ //# sourceMappingURL=patch-method.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-method.js","sourceRoot":"","sources":["../../src/utils/patch-method.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,33 @@
1
1
  {
2
2
  "name": "@bogomolcompany/bogo",
3
+ "version": "0.1.2",
4
+ "description": "CLI to scaffold Express + TypeScript API projects and generate modules (controller, service, dto, routes, validator)",
5
+ "license": "MIT",
6
+ "author": "bogomolcompany",
7
+ "keywords": [
8
+ "express",
9
+ "typescript",
10
+ "cli",
11
+ "scaffold",
12
+ "generator",
13
+ "api",
14
+ "boilerplate",
15
+ "rest-api",
16
+ "express-generator",
17
+ "zod",
18
+ "backend"
19
+ ],
20
+ "homepage": "https://github.com/bogomolcomp/bogo#readme",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/bogomolcomp/bogo.git"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/bogomolcomp/bogo/issues"
27
+ },
3
28
  "publishConfig": {
4
29
  "access": "public"
5
30
  },
6
- "version": "0.1.0",
7
- "description": "CLI generator for Express API modules",
8
- "license": "MIT",
9
31
  "bin": {
10
32
  "bogo": "./dist/cli.js"
11
33
  },