neatnode 3.0.2 → 3.1.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 (57) hide show
  1. package/package.json +3 -1
  2. package/src/actions/createProject.js +15 -14
  3. package/src/cli.js +45 -30
  4. package/src/config/templates.js +12 -19
  5. package/src/utils/copyTemplate.js +1 -1
  6. package/src/utils/downloadRepoTemplate.js +47 -0
  7. package/templates/express-basic/.env.example +0 -3
  8. package/templates/express-basic/package-lock.json +0 -1505
  9. package/templates/express-basic/package.json +0 -21
  10. package/templates/express-basic/server.js +0 -11
  11. package/templates/express-basic/src/app.js +0 -45
  12. package/templates/express-basic/src/config/db.config.js +0 -12
  13. package/templates/express-basic/src/config/env.config.js +0 -11
  14. package/templates/express-basic/src/controllers/todo.controller.js +0 -90
  15. package/templates/express-basic/src/middleware/notFound.middleware.js +0 -5
  16. package/templates/express-basic/src/models/todo.model.js +0 -21
  17. package/templates/express-basic/src/routes/index.route.js +0 -10
  18. package/templates/express-basic/src/routes/todo.route.js +0 -15
  19. package/templates/express-basic/src/utils/responseHandler.js +0 -7
  20. package/templates/express-rest-api/.env.example +0 -7
  21. package/templates/express-rest-api/package-lock.json +0 -1977
  22. package/templates/express-rest-api/package.json +0 -30
  23. package/templates/express-rest-api/server.js +0 -14
  24. package/templates/express-rest-api/src/app.js +0 -55
  25. package/templates/express-rest-api/src/config/db.config.js +0 -14
  26. package/templates/express-rest-api/src/config/env.config.js +0 -13
  27. package/templates/express-rest-api/src/config/logger.config.js +0 -20
  28. package/templates/express-rest-api/src/controllers/user.controller.js +0 -35
  29. package/templates/express-rest-api/src/middleware/auth.middleware.js +0 -36
  30. package/templates/express-rest-api/src/middleware/error.middleware.js +0 -32
  31. package/templates/express-rest-api/src/middleware/rateLimiter.js +0 -13
  32. package/templates/express-rest-api/src/middleware/validateRequest.middleware.js +0 -15
  33. package/templates/express-rest-api/src/models/user.model.js +0 -31
  34. package/templates/express-rest-api/src/routes/user.route.js +0 -14
  35. package/templates/express-rest-api/src/schemas/user.schema.js +0 -43
  36. package/templates/express-rest-api/src/services/user.service.js +0 -54
  37. package/templates/express-rest-api/src/utils/ApiError.js +0 -17
  38. package/templates/express-rest-api/src/utils/ApiResponse.js +0 -9
  39. package/templates/express-rest-api/src/utils/CatchAsync.js +0 -5
  40. package/templates/express-rest-api/src/utils/Token.js +0 -16
  41. package/templates/express-socket/.env.example +0 -5
  42. package/templates/express-socket/package-lock.json +0 -2262
  43. package/templates/express-socket/package.json +0 -31
  44. package/templates/express-socket/server.js +0 -19
  45. package/templates/express-socket/src/app.js +0 -33
  46. package/templates/express-socket/src/config/db.config.js +0 -14
  47. package/templates/express-socket/src/config/env.config.js +0 -10
  48. package/templates/express-socket/src/config/logger.js +0 -20
  49. package/templates/express-socket/src/config/socket.js +0 -23
  50. package/templates/express-socket/src/middleware/auth.middleware.js +0 -36
  51. package/templates/express-socket/src/middleware/error.middleware.js +0 -31
  52. package/templates/express-socket/src/middleware/rateLimiter.js +0 -14
  53. package/templates/express-socket/src/middleware/validateRequest.middleware.js +0 -15
  54. package/templates/express-socket/src/utils/ApiError.js +0 -17
  55. package/templates/express-socket/src/utils/ApiResponse.js +0 -9
  56. package/templates/express-socket/src/utils/CatchAsync.js +0 -5
  57. package/templates/express-socket/src/utils/Token.js +0 -16
@@ -1,31 +0,0 @@
1
- {
2
- "name": "project-name",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "server.js",
6
- "scripts": {
7
- "start": "node server.js",
8
- "dev": "nodemon server.js"
9
- },
10
- "keywords": [],
11
- "author": "",
12
- "license": "ISC",
13
- "type": "module",
14
- "dependencies": {
15
- "bcryptjs": "^3.0.2",
16
- "cors": "^2.8.5",
17
- "dotenv": "^17.2.3",
18
- "express": "^5.1.0",
19
- "express-rate-limit": "^8.2.1",
20
- "helmet": "^8.1.0",
21
- "joi": "^18.0.1",
22
- "jsonwebtoken": "^9.0.2",
23
- "mongoose": "^8.19.2",
24
- "morgan": "^1.10.1",
25
- "socket.io": "^4.8.1",
26
- "winston": "^3.18.3"
27
- },
28
- "devDependencies": {
29
- "nodemon": "^3.1.10"
30
- }
31
- }
@@ -1,19 +0,0 @@
1
- import http from "http";
2
- import app from "./src/app.js";
3
- import { config } from "./src/config/env.config.js";
4
- import { initSocket } from "./src/config/socket.js";
5
- import logger from "./src/config/logger.js";
6
- import { connect } from "http2";
7
- import { connectDB } from "./src/config/db.config.js";
8
-
9
- const PORT = config.port || 3000;
10
- const server = http.createServer(app);
11
-
12
- initSocket(server);
13
- connectDB();
14
-
15
- // Start the server
16
- server.listen(PORT, () => {
17
- logger.info(`Server is running on port ${PORT}`);
18
- });
19
-
@@ -1,33 +0,0 @@
1
- import express from 'express';
2
- import cors from 'cors';
3
- import morgan from 'morgan';
4
- import helmet from 'helmet';
5
- import { errorHandler, notFound } from './middleware/error.middleware.js';
6
- import { rateLimiter } from './middleware/rateLimiter.js';
7
-
8
-
9
- // instance
10
- const app = express();
11
-
12
- // middlewares
13
- app.use(cors());
14
- app.use(express.json());
15
- app.use(express.urlencoded({ extended: true }));
16
- app.use(morgan('dev'));
17
- app.use(helmet());
18
-
19
- // health check route with rate limiting
20
- app.get("/health", rateLimiter(20), (req, res) => {
21
- res.status(200).json({ status: "OK", message: "ALL IS WELL😂..." });
22
- });
23
-
24
- // default route
25
- app.get("/", (req, res) => {
26
- res.send("API is running...");
27
- });
28
-
29
- // error handling middlewares
30
- app.use(notFound);
31
- app.use(errorHandler);
32
-
33
- export default app;
@@ -1,14 +0,0 @@
1
- import mongoose from "mongoose";
2
- import logger from "./logger.js";
3
- import { config } from "./env.config.js";
4
-
5
- export const connectDB = async () => {
6
- try {
7
- await mongoose.connect(config.dbUri);
8
- logger.info("✔ Database connected");
9
-
10
- } catch (error) {
11
- logger.error("✖ Database connection error:", error);
12
- process.exit(1);
13
- }
14
- }
@@ -1,10 +0,0 @@
1
- import dotenv from "dotenv";
2
- dotenv.config();
3
-
4
- export const config = {
5
- jwtSecret: process.env.JWT_SECRET,
6
- dbUri: process.env.MONGODB_URI,
7
- port: process.env.PORT || 3000,
8
- nodeEnv: process.env.NODE_ENV || "development"
9
-
10
- }
@@ -1,20 +0,0 @@
1
- import winston from "winston";
2
-
3
- const { combine, timestamp, printf, colorize } = winston.format;
4
-
5
- const logFormat = printf(({ level, message, timestamp }) => {
6
- return `[${timestamp}] ${level}: ${message}`;
7
- });
8
-
9
- const logger = winston.createLogger({
10
- level: "info",
11
- format: combine(colorize(), timestamp({ format: "HH:mm:ss" }), logFormat),
12
- transports: [
13
- new winston.transports.Console(),
14
- // new winston.transports.File({ filename: "logs/app.log" })
15
-
16
- ],
17
- });
18
-
19
- export default logger;
20
-
@@ -1,23 +0,0 @@
1
- import { Server } from "socket.io";
2
- import logger from "./logger.js";
3
-
4
- export const initSocket = (server) => {
5
- const io = new Server(server, {
6
- cors: { origin: "*" },
7
- });
8
-
9
- io.on("connection", (socket) => {
10
- logger.info(`New client connected: ${socket.id}`);
11
-
12
- socket.on("message", (data) => {
13
- logger.info(`Message received: ${data}`);
14
- io.emit("message", `Server received: ${data}`);
15
- });
16
-
17
- socket.on("disconnect", () => {
18
- logger.warn(`Client disconnected: ${socket.id}`);
19
- });
20
- });
21
-
22
- return io;
23
- };
@@ -1,36 +0,0 @@
1
- import { verifyAccessToken } from "../utils/Token.js";
2
-
3
-
4
- // Middleware to protect routes
5
- export const protect = (req, res, next) => {
6
- const token = req.headers.authorization.split(' ')[1];
7
-
8
- // Check for token
9
- if (!token || !token.startsWith('Bearer ')) {
10
- return res.status(401).json({ message: 'Unauthorized' });
11
- }
12
-
13
- // Verify token
14
- const decoded = verifyAccessToken(token);
15
-
16
- // Check if token is valid
17
- if (!decoded) {
18
- return res.status(401).json({ message: 'Unauthorized' });
19
- }
20
-
21
- // Attach token
22
- req.user = decoded;
23
- next();
24
- };
25
-
26
- // Middleware to restrict access based on user roles
27
- export const restrictTo = (...roles) => {
28
- return (req, res, next) => {
29
- if (!roles.includes(req.user.role)) {
30
- return res.status(403).json({ message: 'Forbidden' });
31
- }
32
- next();
33
- };
34
- };
35
-
36
-
@@ -1,31 +0,0 @@
1
- import { config } from "../config/env.config.js";
2
- import ApiError from "../utils/ApiError.js";
3
-
4
-
5
- // Global error handling middleware
6
- export const errorHandler = (err, req, res, next) => {
7
- console.error("Error 💥", err);
8
-
9
- let { statusCode, message } = err;
10
- if (!statusCode) statusCode = 500;
11
-
12
- // Handle operational errors
13
- if (err.isOperational) {
14
- return res.status(err.statusCode).json({
15
- success: false,
16
- message: err.message,
17
- });
18
- }
19
-
20
- // For unexpected errors (like coding bugs, db crashes, etc.)
21
- res.status(statusCode).json({
22
- success: false,
23
- message,
24
- });
25
- };
26
-
27
- // Handle invalid routes
28
- export const notFound = (req, res, next) => {
29
- const error = new ApiError(404, `Not Found - ${req.originalUrl}`);
30
- next(error);
31
- };
@@ -1,14 +0,0 @@
1
- import rateLimit from "express-rate-limit";
2
-
3
-
4
- export const rateLimiter = (max = 10) =>
5
- rateLimit({
6
- windowMs: 15 * 60 * 1000, // 15 minutes
7
- max, // limit each IP to max requests per windowMs
8
- message: {
9
- success: false,
10
- message: "Too many requests, please try again later."
11
- },
12
- standardHeaders: true, // return rate limit info in headers
13
- legacyHeaders: false,
14
- });
@@ -1,15 +0,0 @@
1
- // Generic middleware to validate req.body against a Joi schema
2
- const validate = (schema) => (req, res, next) => {
3
- const { error } = schema.validate(req.body, { abortEarly: false });
4
-
5
- if (error) {
6
- return res.status(400).json({
7
- success: false,
8
- errors: error.details.map((err) => err.message),
9
- });
10
- }
11
-
12
- next();
13
- };
14
-
15
- export default validate;
@@ -1,17 +0,0 @@
1
- class ApiError extends Error {
2
- constructor(statusCode, message, errors = [], stack = "") {
3
- super(message);
4
- this.statusCode = statusCode;
5
- this.errors = errors;
6
- this.isOperational = true;
7
-
8
-
9
- if (stack) {
10
- this.stack = stack;
11
- } else {
12
- Error.captureStackTrace(this, this.constructor);
13
- }
14
- }
15
- }
16
-
17
- export default ApiError;
@@ -1,9 +0,0 @@
1
- const sendResponse = (res, statusCode, message, data = {}) => {
2
- res.status(statusCode).json({
3
- success: statusCode < 400,
4
- message,
5
- ...data
6
- });
7
- };
8
-
9
- export default sendResponse;
@@ -1,5 +0,0 @@
1
- const catchAsync = (fn)=>(req, res, next)=>{
2
- fn(req, res, next).catch(next);
3
- }
4
-
5
- export default catchAsync;
@@ -1,16 +0,0 @@
1
- import jwt from "jsonwebtoken"
2
- import { config } from "../config/env.config.js";
3
-
4
- // Generate JWT token
5
- export const generateToken = (payload, expiresIn = '1h') => {
6
- return jwt.sign(payload, config.jwtSecret, { expiresIn });
7
- }
8
-
9
- // Verify JWT token
10
- export const verifyAccessToken = (token) => {
11
- try {
12
- return jwt.verify(token, config.jwtSecret);
13
- } catch (error) {
14
- return null;
15
- }
16
- };