create-charcole 2.2.0 → 2.2.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 (72) hide show
  1. package/.github/workflows/release.yml +26 -26
  2. package/CHANGELOG.md +301 -301
  3. package/LICENSE +21 -21
  4. package/README.md +354 -354
  5. package/bin/index.js +444 -444
  6. package/bin/lib/pkgManager.js +49 -49
  7. package/bin/lib/templateHandler.js +33 -33
  8. package/package.json +42 -27
  9. package/packages/swagger/package-lock.json +1715 -1715
  10. package/packages/swagger/package.json +57 -44
  11. package/packages/swagger/src/index.d.ts +126 -126
  12. package/packages/swagger/src/index.js +12 -12
  13. package/packages/swagger/src/setup.js +100 -100
  14. package/template/js/.env.example +15 -15
  15. package/template/js/README.md +978 -978
  16. package/template/js/basePackage.json +26 -26
  17. package/template/js/src/app.js +81 -81
  18. package/template/js/src/config/constants.js +20 -20
  19. package/template/js/src/config/env.js +26 -26
  20. package/template/js/src/config/swagger.config.js +15 -15
  21. package/template/js/src/middlewares/errorHandler.js +180 -180
  22. package/template/js/src/middlewares/requestLogger.js +33 -33
  23. package/template/js/src/middlewares/validateRequest.js +42 -42
  24. package/template/js/src/modules/auth/auth.constants.js +3 -3
  25. package/template/js/src/modules/auth/auth.controller.js +29 -29
  26. package/template/js/src/modules/auth/auth.middlewares.js +19 -19
  27. package/template/js/src/modules/auth/auth.routes.js +131 -131
  28. package/template/js/src/modules/auth/auth.schemas.js +60 -60
  29. package/template/js/src/modules/auth/auth.service.js +67 -67
  30. package/template/js/src/modules/auth/package.json +6 -6
  31. package/template/js/src/modules/health/controller.js +151 -151
  32. package/template/js/src/modules/swagger/package.json +5 -5
  33. package/template/js/src/repositories/user.repo.js +19 -19
  34. package/template/js/src/routes/index.js +25 -25
  35. package/template/js/src/routes/protected.js +57 -57
  36. package/template/js/src/server.js +38 -38
  37. package/template/js/src/utils/AppError.js +182 -182
  38. package/template/js/src/utils/logger.js +73 -73
  39. package/template/js/src/utils/response.js +51 -51
  40. package/template/ts/.env.example +15 -15
  41. package/template/ts/README.md +978 -978
  42. package/template/ts/basePackage.json +36 -36
  43. package/template/ts/build.js +46 -46
  44. package/template/ts/src/app.ts +71 -71
  45. package/template/ts/src/config/constants.ts +27 -27
  46. package/template/ts/src/config/env.ts +40 -40
  47. package/template/ts/src/config/swagger.config.ts +30 -30
  48. package/template/ts/src/middlewares/errorHandler.ts +201 -201
  49. package/template/ts/src/middlewares/requestLogger.ts +38 -38
  50. package/template/ts/src/middlewares/validateRequest.ts +46 -46
  51. package/template/ts/src/modules/auth/auth.constants.ts +6 -6
  52. package/template/ts/src/modules/auth/auth.controller.ts +32 -32
  53. package/template/ts/src/modules/auth/auth.middlewares.ts +46 -46
  54. package/template/ts/src/modules/auth/auth.routes.ts +52 -52
  55. package/template/ts/src/modules/auth/auth.schemas.ts +73 -73
  56. package/template/ts/src/modules/auth/auth.service.ts +106 -106
  57. package/template/ts/src/modules/auth/package.json +10 -10
  58. package/template/ts/src/modules/health/controller.ts +80 -80
  59. package/template/ts/src/modules/swagger/package.json +5 -5
  60. package/template/ts/src/repositories/user.repo.ts +33 -33
  61. package/template/ts/src/routes/index.ts +24 -24
  62. package/template/ts/src/routes/protected.ts +46 -46
  63. package/template/ts/src/server.ts +41 -41
  64. package/template/ts/src/types/express.d.ts +9 -9
  65. package/template/ts/src/utils/AppError.ts +220 -220
  66. package/template/ts/src/utils/logger.ts +55 -55
  67. package/template/ts/src/utils/response.ts +100 -100
  68. package/template/ts/tsconfig.json +26 -26
  69. package/tmpclaude-1049-cwd +0 -1
  70. package/tmpclaude-3e37-cwd +0 -1
  71. package/tmpclaude-4d73-cwd +0 -1
  72. package/tmpclaude-8a8e-cwd +0 -1
@@ -1,44 +1,57 @@
1
- {
2
- "name": "@charcoles/swagger",
3
- "version": "1.0.0",
4
- "description": "Auto-generated Swagger documentation for Charcole APIs",
5
- "main": "src/index.js",
6
- "types": "src/index.d.ts",
7
- "type": "module",
8
- "exports": {
9
- ".": {
10
- "types": "./src/index.d.ts",
11
- "default": "./src/index.js"
12
- }
13
- },
14
- "scripts": {
15
- "test": "echo \"No tests yet\" && exit 0",
16
- "prepare": "echo 'Ready for npm link'"
17
- },
18
- "dependencies": {
19
- "swagger-ui-express": "^4.6.3",
20
- "swagger-jsdoc": "^6.2.8",
21
- "glob": "^10.3.10",
22
- "zod-to-json-schema": "^3.22.4"
23
- },
24
- "peerDependencies": {
25
- "zod": "^3.0.0"
26
- },
27
- "peerDependenciesMeta": {
28
- "zod": {
29
- "optional": true
30
- }
31
- },
32
- "keywords": [
33
- "charcole",
34
- "swagger",
35
- "openapi",
36
- "documentation",
37
- "express"
38
- ],
39
- "author": "Sheraz Manzoor",
40
- "license": "ISC",
41
- "publishConfig": {
42
- "access": "public"
43
- }
44
- }
1
+ {
2
+ "name": "@charcoles/swagger",
3
+ "version": "1.0.0",
4
+ "description": "Auto-generated Swagger documentation for Charcole APIs",
5
+ "main": "src/index.js",
6
+ "types": "src/index.d.ts",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./src/index.d.ts",
11
+ "default": "./src/index.js"
12
+ }
13
+ },
14
+ "author": {
15
+ "name": "Sheraz Manzoor",
16
+ "email": "sheraz.dev121@gmail.com"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/sheraz4196/create-charcole.git",
21
+ "directory": "packages/swagger"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/sheraz4196/create-charcole/issues"
25
+ },
26
+ "homepage": "https://www.charcole.site/guides/swagger/introduction",
27
+ "scripts": {
28
+ "test": "echo \"No tests yet\" && exit 0",
29
+ "prepare": "echo 'Ready for npm link'"
30
+ },
31
+ "dependencies": {
32
+ "swagger-ui-express": "^4.6.3",
33
+ "swagger-jsdoc": "^6.2.8",
34
+ "glob": "^10.3.10",
35
+ "zod-to-json-schema": "^3.22.4"
36
+ },
37
+ "peerDependencies": {
38
+ "zod": "^3.0.0"
39
+ },
40
+ "peerDependenciesMeta": {
41
+ "zod": {
42
+ "optional": true
43
+ }
44
+ },
45
+ "keywords": [
46
+ "charcole",
47
+ "swagger",
48
+ "openapi",
49
+ "documentation",
50
+ "express",
51
+ "charcole swagger"
52
+ ],
53
+ "license": "ISC",
54
+ "publishConfig": {
55
+ "access": "public"
56
+ }
57
+ }
@@ -1,126 +1,126 @@
1
- import { Application } from "express";
2
- import { ZodType, ZodSchema } from "zod";
3
-
4
- export interface SwaggerServer {
5
- url: string;
6
- description: string;
7
- }
8
-
9
- export interface SwaggerOptions {
10
- title?: string;
11
- version?: string;
12
- description?: string;
13
- path?: string;
14
- servers?: SwaggerServer[];
15
- // NEW: Auto-register Zod schemas
16
- schemas?: Record<string, ZodType<any>>;
17
- // NEW: Include common response templates (default: true)
18
- includeCommonResponses?: boolean;
19
- // NEW: Custom response schemas
20
- customResponses?: Record<string, any>;
21
- }
22
-
23
- export interface OpenAPISpec {
24
- openapi: string;
25
- info: {
26
- title: string;
27
- version: string;
28
- description: string;
29
- };
30
- servers: SwaggerServer[];
31
- components: {
32
- securitySchemes: {
33
- bearerAuth: {
34
- type: string;
35
- scheme: string;
36
- bearerFormat: string;
37
- description: string;
38
- };
39
- };
40
- schemas?: Record<string, any>;
41
- responses?: Record<string, any>;
42
- };
43
- paths?: Record<string, any>;
44
- }
45
-
46
- export function setupSwagger(
47
- app: Application,
48
- options?: SwaggerOptions,
49
- ): OpenAPISpec;
50
-
51
- // Helper functions
52
- export interface EndpointParameter {
53
- in: "path" | "query" | "header";
54
- name: string;
55
- required?: boolean;
56
- type?: string;
57
- description?: string;
58
- }
59
-
60
- export interface EndpointOptions {
61
- summary: string;
62
- description?: string;
63
- tags?: string[];
64
- schema?: string;
65
- responseSchema?: string;
66
- security?: boolean;
67
- params?: EndpointParameter[];
68
- }
69
-
70
- export interface SwaggerDocOptions {
71
- method: string;
72
- path: string;
73
- summary: string;
74
- description?: string;
75
- tags?: string[];
76
- requestSchema?: string;
77
- responseSchemaName?: string;
78
- security?: boolean;
79
- parameters?: EndpointParameter[];
80
- }
81
-
82
- /**
83
- * Convert Zod schema to OpenAPI JSON Schema
84
- */
85
- export function convertZodToOpenAPI(
86
- zodSchema: ZodType<any>,
87
- name: string,
88
- ): object | null;
89
-
90
- /**
91
- * Extract body schema from a Zod schema that has a .body property
92
- */
93
- export function extractBodySchema(schema: ZodType<any>): ZodType<any> | null;
94
-
95
- /**
96
- * Get common response schemas (Success, ValidationError, Unauthorized, etc.)
97
- */
98
- export function getCommonResponses(): Record<string, any>;
99
-
100
- /**
101
- * Detect security requirements from middleware chain
102
- */
103
- export function detectSecurity(
104
- middlewares: Function[],
105
- ): Array<{ bearerAuth: [] }>;
106
-
107
- /**
108
- * Create a Swagger documentation comment block
109
- */
110
- export function createSwaggerDoc(options: SwaggerDocOptions): string;
111
-
112
- /**
113
- * Register Zod schemas for auto-documentation
114
- */
115
- export function registerSchemas(
116
- schemas: Record<string, ZodType<any>>,
117
- ): Record<string, any>;
118
-
119
- /**
120
- * Simplified API for quick endpoint documentation
121
- */
122
- export function endpoint(
123
- method: string,
124
- path: string,
125
- options?: EndpointOptions,
126
- ): Record<string, any>;
1
+ import { Application } from "express";
2
+ import { ZodType, ZodSchema } from "zod";
3
+
4
+ export interface SwaggerServer {
5
+ url: string;
6
+ description: string;
7
+ }
8
+
9
+ export interface SwaggerOptions {
10
+ title?: string;
11
+ version?: string;
12
+ description?: string;
13
+ path?: string;
14
+ servers?: SwaggerServer[];
15
+ // NEW: Auto-register Zod schemas
16
+ schemas?: Record<string, ZodType<any>>;
17
+ // NEW: Include common response templates (default: true)
18
+ includeCommonResponses?: boolean;
19
+ // NEW: Custom response schemas
20
+ customResponses?: Record<string, any>;
21
+ }
22
+
23
+ export interface OpenAPISpec {
24
+ openapi: string;
25
+ info: {
26
+ title: string;
27
+ version: string;
28
+ description: string;
29
+ };
30
+ servers: SwaggerServer[];
31
+ components: {
32
+ securitySchemes: {
33
+ bearerAuth: {
34
+ type: string;
35
+ scheme: string;
36
+ bearerFormat: string;
37
+ description: string;
38
+ };
39
+ };
40
+ schemas?: Record<string, any>;
41
+ responses?: Record<string, any>;
42
+ };
43
+ paths?: Record<string, any>;
44
+ }
45
+
46
+ export function setupSwagger(
47
+ app: Application,
48
+ options?: SwaggerOptions,
49
+ ): OpenAPISpec;
50
+
51
+ // Helper functions
52
+ export interface EndpointParameter {
53
+ in: "path" | "query" | "header";
54
+ name: string;
55
+ required?: boolean;
56
+ type?: string;
57
+ description?: string;
58
+ }
59
+
60
+ export interface EndpointOptions {
61
+ summary: string;
62
+ description?: string;
63
+ tags?: string[];
64
+ schema?: string;
65
+ responseSchema?: string;
66
+ security?: boolean;
67
+ params?: EndpointParameter[];
68
+ }
69
+
70
+ export interface SwaggerDocOptions {
71
+ method: string;
72
+ path: string;
73
+ summary: string;
74
+ description?: string;
75
+ tags?: string[];
76
+ requestSchema?: string;
77
+ responseSchemaName?: string;
78
+ security?: boolean;
79
+ parameters?: EndpointParameter[];
80
+ }
81
+
82
+ /**
83
+ * Convert Zod schema to OpenAPI JSON Schema
84
+ */
85
+ export function convertZodToOpenAPI(
86
+ zodSchema: ZodType<any>,
87
+ name: string,
88
+ ): object | null;
89
+
90
+ /**
91
+ * Extract body schema from a Zod schema that has a .body property
92
+ */
93
+ export function extractBodySchema(schema: ZodType<any>): ZodType<any> | null;
94
+
95
+ /**
96
+ * Get common response schemas (Success, ValidationError, Unauthorized, etc.)
97
+ */
98
+ export function getCommonResponses(): Record<string, any>;
99
+
100
+ /**
101
+ * Detect security requirements from middleware chain
102
+ */
103
+ export function detectSecurity(
104
+ middlewares: Function[],
105
+ ): Array<{ bearerAuth: [] }>;
106
+
107
+ /**
108
+ * Create a Swagger documentation comment block
109
+ */
110
+ export function createSwaggerDoc(options: SwaggerDocOptions): string;
111
+
112
+ /**
113
+ * Register Zod schemas for auto-documentation
114
+ */
115
+ export function registerSchemas(
116
+ schemas: Record<string, ZodType<any>>,
117
+ ): Record<string, any>;
118
+
119
+ /**
120
+ * Simplified API for quick endpoint documentation
121
+ */
122
+ export function endpoint(
123
+ method: string,
124
+ path: string,
125
+ options?: EndpointOptions,
126
+ ): Record<string, any>;
@@ -1,12 +1,12 @@
1
- export { setupSwagger } from "./setup.js";
2
-
3
- // Export helper functions for advanced usage
4
- export {
5
- convertZodToOpenAPI,
6
- extractBodySchema,
7
- getCommonResponses,
8
- detectSecurity,
9
- createSwaggerDoc,
10
- registerSchemas,
11
- endpoint,
12
- } from "./helpers.js";
1
+ export { setupSwagger } from "./setup.js";
2
+
3
+ // Export helper functions for advanced usage
4
+ export {
5
+ convertZodToOpenAPI,
6
+ extractBodySchema,
7
+ getCommonResponses,
8
+ detectSecurity,
9
+ createSwaggerDoc,
10
+ registerSchemas,
11
+ endpoint,
12
+ } from "./helpers.js";
@@ -1,100 +1,100 @@
1
- import swaggerUi from "swagger-ui-express";
2
- import swaggerJSDoc from "swagger-jsdoc";
3
- import fs from "fs";
4
- import path from "path";
5
- import { registerSchemas, getCommonResponses } from "./helpers.js";
6
-
7
- export function setupSwagger(app, options = {}) {
8
- const defaultOptions = {
9
- title: "Charcole API",
10
- version: "1.0.0",
11
- description: "Auto-generated API documentation",
12
- path: "/api-docs",
13
- servers: [{ url: "http://localhost:3000", description: "Local server" }],
14
- // NEW: Auto-register Zod schemas
15
- schemas: {},
16
- // NEW: Include common response templates
17
- includeCommonResponses: true,
18
- // NEW: Custom response schemas
19
- customResponses: {},
20
- };
21
-
22
- const config = { ...defaultOptions, ...options };
23
-
24
- // Detect if running TypeScript or JavaScript by checking if src directory has .ts files
25
- const srcPath = path.join(process.cwd(), "src");
26
- const hasSrcDir = fs.existsSync(srcPath);
27
-
28
- let isTypeScript = false;
29
- if (hasSrcDir) {
30
- // Check if there are any .ts files in src directory
31
- const files = fs.readdirSync(srcPath);
32
- isTypeScript = files.some((file) => file.endsWith(".ts"));
33
- }
34
-
35
- // Determine file extensions to scan
36
- const fileExtension = isTypeScript ? "ts" : "js";
37
-
38
- // Build API paths based on project structure
39
- const apiPaths = [
40
- `${process.cwd()}/src/modules/**/*.${fileExtension}`,
41
- `${process.cwd()}/src/routes/**/*.${fileExtension}`,
42
- ];
43
-
44
- // NEW: Build components with auto-registered schemas
45
- const components = {
46
- securitySchemes: {
47
- bearerAuth: {
48
- type: "http",
49
- scheme: "bearer",
50
- bearerFormat: "JWT",
51
- description: "Enter your JWT token in the format: your-token-here",
52
- },
53
- },
54
- schemas: {},
55
- responses: {},
56
- };
57
-
58
- // NEW: Register Zod schemas if provided
59
- if (config.schemas && Object.keys(config.schemas).length > 0) {
60
- try {
61
- const registeredSchemas = registerSchemas(config.schemas);
62
- components.schemas = { ...registeredSchemas };
63
- console.log(
64
- `✅ Auto-registered ${Object.keys(registeredSchemas).length} Zod schemas`,
65
- );
66
- } catch (error) {
67
- console.warn("⚠️ Failed to register some Zod schemas:", error.message);
68
- }
69
- }
70
-
71
- // NEW: Add common response templates
72
- if (config.includeCommonResponses) {
73
- components.responses = {
74
- ...getCommonResponses(),
75
- ...config.customResponses,
76
- };
77
- }
78
-
79
- const openApiSpec = swaggerJSDoc({
80
- definition: {
81
- openapi: "3.0.0",
82
- info: {
83
- title: config.title,
84
- version: config.version,
85
- description: config.description,
86
- },
87
- servers: config.servers,
88
- components,
89
- },
90
- apis: apiPaths,
91
- });
92
-
93
- app.use(config.path, swaggerUi.serve, swaggerUi.setup(openApiSpec));
94
-
95
- console.log(
96
- `✅ Swagger UI available at http://localhost:${process.env.PORT || 3000}${config.path}`,
97
- );
98
-
99
- return openApiSpec;
100
- }
1
+ import swaggerUi from "swagger-ui-express";
2
+ import swaggerJSDoc from "swagger-jsdoc";
3
+ import fs from "fs";
4
+ import path from "path";
5
+ import { registerSchemas, getCommonResponses } from "./helpers.js";
6
+
7
+ export function setupSwagger(app, options = {}) {
8
+ const defaultOptions = {
9
+ title: "Charcole API",
10
+ version: "1.0.0",
11
+ description: "Auto-generated API documentation",
12
+ path: "/api-docs",
13
+ servers: [{ url: "http://localhost:3000", description: "Local server" }],
14
+ // NEW: Auto-register Zod schemas
15
+ schemas: {},
16
+ // NEW: Include common response templates
17
+ includeCommonResponses: true,
18
+ // NEW: Custom response schemas
19
+ customResponses: {},
20
+ };
21
+
22
+ const config = { ...defaultOptions, ...options };
23
+
24
+ // Detect if running TypeScript or JavaScript by checking if src directory has .ts files
25
+ const srcPath = path.join(process.cwd(), "src");
26
+ const hasSrcDir = fs.existsSync(srcPath);
27
+
28
+ let isTypeScript = false;
29
+ if (hasSrcDir) {
30
+ // Check if there are any .ts files in src directory
31
+ const files = fs.readdirSync(srcPath);
32
+ isTypeScript = files.some((file) => file.endsWith(".ts"));
33
+ }
34
+
35
+ // Determine file extensions to scan
36
+ const fileExtension = isTypeScript ? "ts" : "js";
37
+
38
+ // Build API paths based on project structure
39
+ const apiPaths = [
40
+ `${process.cwd()}/src/modules/**/*.${fileExtension}`,
41
+ `${process.cwd()}/src/routes/**/*.${fileExtension}`,
42
+ ];
43
+
44
+ // NEW: Build components with auto-registered schemas
45
+ const components = {
46
+ securitySchemes: {
47
+ bearerAuth: {
48
+ type: "http",
49
+ scheme: "bearer",
50
+ bearerFormat: "JWT",
51
+ description: "Enter your JWT token in the format: your-token-here",
52
+ },
53
+ },
54
+ schemas: {},
55
+ responses: {},
56
+ };
57
+
58
+ // NEW: Register Zod schemas if provided
59
+ if (config.schemas && Object.keys(config.schemas).length > 0) {
60
+ try {
61
+ const registeredSchemas = registerSchemas(config.schemas);
62
+ components.schemas = { ...registeredSchemas };
63
+ console.log(
64
+ `✅ Auto-registered ${Object.keys(registeredSchemas).length} Zod schemas`,
65
+ );
66
+ } catch (error) {
67
+ console.warn("⚠️ Failed to register some Zod schemas:", error.message);
68
+ }
69
+ }
70
+
71
+ // NEW: Add common response templates
72
+ if (config.includeCommonResponses) {
73
+ components.responses = {
74
+ ...getCommonResponses(),
75
+ ...config.customResponses,
76
+ };
77
+ }
78
+
79
+ const openApiSpec = swaggerJSDoc({
80
+ definition: {
81
+ openapi: "3.0.0",
82
+ info: {
83
+ title: config.title,
84
+ version: config.version,
85
+ description: config.description,
86
+ },
87
+ servers: config.servers,
88
+ components,
89
+ },
90
+ apis: apiPaths,
91
+ });
92
+
93
+ app.use(config.path, swaggerUi.serve, swaggerUi.setup(openApiSpec));
94
+
95
+ console.log(
96
+ `✅ Swagger UI available at http://localhost:${process.env.PORT || 3000}${config.path}`,
97
+ );
98
+
99
+ return openApiSpec;
100
+ }
@@ -1,16 +1,16 @@
1
- # Server Configuration
2
- NODE_ENV=development
3
- PORT=3000
4
-
5
- # Logging
6
- LOG_LEVEL=info
7
-
8
- # CORS
9
- CORS_ORIGIN=*
10
-
11
- # Request
12
- REQUEST_TIMEOUT=30000
13
-
14
-
15
- # Authentication
1
+ # Server Configuration
2
+ NODE_ENV=development
3
+ PORT=3000
4
+
5
+ # Logging
6
+ LOG_LEVEL=info
7
+
8
+ # CORS
9
+ CORS_ORIGIN=*
10
+
11
+ # Request
12
+ REQUEST_TIMEOUT=30000
13
+
14
+
15
+ # Authentication
16
16
  JWT_SECRET=your-secret-key-here