@sundaysf/cli-v2 0.0.2 → 0.0.3

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 (34) hide show
  1. package/dist/bin/index.js +1 -1
  2. package/dist/bin/index.js.map +1 -1
  3. package/dist/templates/backend-db-sql/.claude/agents/knex-table-implementer.md +114 -0
  4. package/dist/templates/backend-db-sql/.claude/agents/sundays-backend-builder.md +70 -0
  5. package/dist/templates/backend-db-sql/.claude/settings.local.json +19 -0
  6. package/dist/templates/backend-db-sql/.env.example +13 -0
  7. package/dist/templates/backend-db-sql/.prettierignore +3 -0
  8. package/dist/templates/backend-db-sql/.prettierrc +9 -0
  9. package/dist/templates/backend-db-sql/CLAUDE.md +374 -0
  10. package/dist/templates/backend-db-sql/Dockerfile +17 -0
  11. package/dist/templates/backend-db-sql/README.md +34 -0
  12. package/dist/templates/backend-db-sql/db/knexfile.ts +33 -0
  13. package/dist/templates/backend-db-sql/db/migrations/.gitkeep +0 -0
  14. package/dist/templates/backend-db-sql/db/migrations/001_create_sundays_package_version.ts +13 -0
  15. package/dist/templates/backend-db-sql/db/seeds/001_sundays_package_version_seed.ts +11 -0
  16. package/dist/templates/backend-db-sql/db/src/KnexConnection.ts +74 -0
  17. package/dist/templates/backend-db-sql/db/src/d.types.ts +18 -0
  18. package/dist/templates/backend-db-sql/db/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -0
  19. package/dist/templates/backend-db-sql/db/src/index.ts +9 -0
  20. package/dist/templates/backend-db-sql/db/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -0
  21. package/dist/templates/backend-db-sql/db/tsconfig.json +16 -0
  22. package/dist/templates/backend-db-sql/eslint.config.js +20 -0
  23. package/dist/templates/backend-db-sql/src/app.ts +35 -0
  24. package/dist/templates/backend-db-sql/src/common/config/origins/origins.config.ts +11 -0
  25. package/dist/templates/backend-db-sql/src/common/utils/environment.resolver.ts +4 -0
  26. package/dist/templates/backend-db-sql/src/common/utils/version.resolver.ts +5 -0
  27. package/dist/templates/backend-db-sql/src/controllers/health/health.controller.ts +24 -0
  28. package/dist/templates/backend-db-sql/src/middlewares/error/error.middleware.ts +21 -0
  29. package/dist/templates/backend-db-sql/src/routes/health/health.router.ts +17 -0
  30. package/dist/templates/backend-db-sql/src/routes/index.ts +57 -0
  31. package/dist/templates/backend-db-sql/src/server.ts +18 -0
  32. package/dist/templates/backend-db-sql/src/types.d.ts +10 -0
  33. package/dist/templates/backend-db-sql/tsconfig.json +16 -0
  34. package/package.json +1 -1
@@ -0,0 +1,20 @@
1
+ const eslint = require('@eslint/js');
2
+ const tseslint = require('typescript-eslint');
3
+
4
+ module.exports = tseslint.config(
5
+ eslint.configs.recommended,
6
+ ...tseslint.configs.recommended,
7
+ {
8
+ languageOptions: {
9
+ parserOptions: {
10
+ project: './tsconfig.json',
11
+ },
12
+ },
13
+ rules: {},
14
+ },
15
+ {
16
+ ignores: ['dist/', 'node_modules/'],
17
+ }
18
+ );
19
+
20
+ //# sourceMappingURL=eslint.config.js.map
@@ -0,0 +1,35 @@
1
+ import dotenv from 'dotenv';
2
+ import express, { type Express } from 'express';
3
+ import logger from 'morgan';
4
+ import cors from 'cors';
5
+ import { IndexRouter } from './routes/index';
6
+ import { errorMiddleware } from './middlewares/error/error.middleware';
7
+ import { getAllowedOrigins } from './common/config/origins/origins.config';
8
+ dotenv.config();
9
+
10
+ const app: Express = express();
11
+
12
+ app.use(
13
+ logger('tiny', {
14
+ skip: (req, _res) => {
15
+ return req.originalUrl.startsWith('/api/health');
16
+ },
17
+ })
18
+ );
19
+
20
+ app.use(
21
+ cors({
22
+ origin: getAllowedOrigins(),
23
+ credentials: true,
24
+ allowedHeaders: ['Content-Type', 'Authorization'],
25
+ })
26
+ );
27
+
28
+ app.use(express.urlencoded({ extended: true }));
29
+ app.use(express.json());
30
+
31
+ app.use('/api', new IndexRouter().router);
32
+
33
+ app.use(errorMiddleware);
34
+
35
+ export default app;
@@ -0,0 +1,11 @@
1
+ export const getAllowedOrigins = (): string[] => {
2
+ let origins: string = process.env.CORS_ALLOWED_ORIGINS || 'http://localhost:3098';
3
+ origins = origins
4
+ .split('\n')
5
+ .join('')
6
+ .split('\r')
7
+ .join('')
8
+ .split(' ')
9
+ .join('');
10
+ return origins.split(',');
11
+ };
@@ -0,0 +1,4 @@
1
+ export const getServiceEnvironment = (): string => {
2
+ const serEnv: string = process.env.ENVIRONMENT || 'undefined';
3
+ return serEnv.charAt(0).toUpperCase() + serEnv.slice(1);
4
+ };
@@ -0,0 +1,5 @@
1
+ const pjson = require('../../../package.json');
2
+
3
+ export const getServiceVersion = (): string => {
4
+ return pjson['version'];
5
+ };
@@ -0,0 +1,24 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ import { getServiceVersion } from '../../common/utils/version.resolver';
3
+ import { getServiceEnvironment } from '../../common/utils/environment.resolver';
4
+
5
+ export class HealthController {
6
+ public async getHealthStatus(
7
+ _req: Request,
8
+ res: Response,
9
+ next: NextFunction
10
+ ): Promise<void> {
11
+ try {
12
+ const version: string = await getServiceVersion();
13
+ const environment: string = await getServiceEnvironment();
14
+ res.status(200).json({
15
+ success: true,
16
+ health: 'Up!',
17
+ version,
18
+ environment,
19
+ });
20
+ } catch (err: any) {
21
+ next(err);
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,21 @@
1
+ import { NextFunction, Response, Request } from 'express';
2
+ export const errorMiddleware = (
3
+ err: any,
4
+ req: Request | any,
5
+ res: Response,
6
+ _next: NextFunction
7
+ ) => {
8
+ console.error(err);
9
+ const statusError: number =
10
+ err.statusError ||
11
+ err.statusCode ||
12
+ err.status ||
13
+ req.statusCode ||
14
+ req.statusError ||
15
+ 500;
16
+ const isProduction = process.env.ENVIRONMENT === 'production';
17
+ res.status(statusError).json({
18
+ success: false,
19
+ message: isProduction && statusError === 500 ? 'Internal server error' : err.message,
20
+ });
21
+ };
@@ -0,0 +1,17 @@
1
+ import { Router } from 'express';
2
+ import { HealthController } from '../../controllers/health/health.controller';
3
+
4
+ export class HealthRouter {
5
+ public router: Router = Router();
6
+ private readonly healthController: HealthController = new HealthController();
7
+ constructor() {
8
+ this.initRoutes();
9
+ }
10
+
11
+ private initRoutes(): void {
12
+ this.router.get(
13
+ '/',
14
+ this.healthController.getHealthStatus.bind(this.healthController)
15
+ );
16
+ }
17
+ }
@@ -0,0 +1,57 @@
1
+ import { Router } from 'express';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+
5
+ export class IndexRouter {
6
+ private _router: Router;
7
+
8
+ constructor() {
9
+ this._router = Router();
10
+ this.loadRoutes();
11
+ }
12
+
13
+ private loadRoutes(): void {
14
+ const routesPath = path.join(__dirname);
15
+
16
+ const folders = fs.readdirSync(routesPath).filter(file =>
17
+ fs.statSync(path.join(routesPath, file)).isDirectory()
18
+ );
19
+
20
+ folders.forEach(folder => {
21
+ const baseName = `${folder}.router`;
22
+ const tsPath = path.join(routesPath, folder, `${baseName}.ts`);
23
+ const jsPath = path.join(routesPath, folder, `${baseName}.js`);
24
+
25
+ let filePath = '';
26
+ if (fs.existsSync(tsPath)) {
27
+ filePath = tsPath;
28
+ } else if (fs.existsSync(jsPath)) {
29
+ filePath = jsPath;
30
+ } else {
31
+ console.warn(`[⚠] No route file found for: ${folder}`);
32
+ return;
33
+ }
34
+
35
+ try {
36
+ const routeModule = require(filePath);
37
+ const RouterClass =
38
+ routeModule.default || Object.values(routeModule).find((e) => typeof e === 'function');
39
+
40
+ if (RouterClass) {
41
+ const instance = new (RouterClass as any)();
42
+ this._router.use(`/${folder}`, instance.router);
43
+ console.log(`[✔] Route mounted: /${folder} → ${path.basename(filePath)}`);
44
+ } else {
45
+ console.warn(`[⚠] No class exported in: ${filePath}`);
46
+ }
47
+ } catch (err) {
48
+ console.error(`[❌] Failed to load router at: ${filePath}`);
49
+ console.error(err);
50
+ }
51
+ });
52
+ }
53
+
54
+ public get router(): Router {
55
+ return this._router;
56
+ }
57
+ }
@@ -0,0 +1,18 @@
1
+ import dotenv from 'dotenv';
2
+ dotenv.config();
3
+ import KnexManager from '../db/src/KnexConnection';
4
+
5
+ const envPort: string = process.env.PORT || '3005';
6
+
7
+ if (isNaN(parseInt(envPort))) {
8
+ throw new Error('The port must to be a number');
9
+ }
10
+
11
+ const PORT: number = parseInt(envPort);
12
+
13
+ (async () => {
14
+ await KnexManager.connect();
15
+ })().then(async () => {
16
+ const { default: app } = await import('./app');
17
+ app.listen(PORT, () => console.info(`Server up and running on port ${PORT}`));
18
+ });
@@ -0,0 +1,10 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+
3
+ export interface IBaseController {
4
+ getAll(req: Request, res: Response, next: NextFunction): Promise<void>;
5
+ getByUuid(req: Request, res: Response, next: NextFunction): Promise<void>;
6
+ create(req: Request, res: Response, next: NextFunction): Promise<void>;
7
+ update(req: Request, res: Response, next: NextFunction): Promise<void>;
8
+ patch(req: Request, res: Response, next: NextFunction): Promise<void>;
9
+ delete(req: Request, res: Response, next: NextFunction): Promise<void>;
10
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "commonjs",
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ "resolveJsonModule": true,
8
+ "esModuleInterop": true,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "strict": true,
11
+ "noUnusedLocals": true,
12
+ "skipLibCheck": true
13
+ },
14
+ "include": ["src/**/*"],
15
+ "exclude": ["node_modules", "dist", "db"]
16
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sundaysf/cli-v2",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Sundays Framework CLI - Project scaffolding and CRUD code generation",
5
5
  "main": "./dist/bin/index.js",
6
6
  "scripts": {