express-web-tools
v1.0.19
Published
A lightweight framework-style library for Express applications using Mongoose. Includes reusable classes such as CrudController, CrudRouter, MongooseSchema, and JWT helpers to enforce consistent API structure and reduce boilerplate.
Downloads
494
Maintainers
Readme
express-web-tools
A lightweight framework-style library for Express applications using Mongoose. It provides reusable classes and utilities to enforce a consistent API structure, automate CRUD operations, and significantly reduce boilerplate code.
Key Features
- Configurable Mongoose Models: Automatically add audit fields, soft-delete logic, and multitenancy support.
- Automated CRUD: Generate routes and controllers with built-in validation and metadata tracking.
- Modern Performance: Uses
structuredClonefor deep object mutation. - Flexible Logging: File-system logger with support for multiple instances and custom paths.
- Event Management: Application-wide or private async event streams.
- JWT Helpers: Simple, configurable token generation and verification.
Usage
1. MongooseModel & Configuration
Define your schemas with automatic audit and multitenancy support.
import { MongooseModel } from 'express-web-tools';
import { Schema, Document } from 'mongoose';
interface IUser extends Document {
username: string;
}
const userSchema = new Schema({ username: String });
// Configuration options (All default to true)
const config = {
softDelete: true, // Adds isDeleted flag and deleted metadata
multitenant: true, // Adds origin field for data isolation
auditEnforce: true, // Adds created/updated (By/From) metadata
timestamps: true // Enables native Mongoose timestamps
};
const userModelWrapper = new MongooseModel<IUser>('User', userSchema, null, null, config);
const User = userModelWrapper.model();2. CrudController
The controller automatically adapts its logic based on the MongooseModel configuration.
import { CrudController } from 'express-web-tools';
import { User } from './models/User';
class UserController extends CrudController<IUser> {
constructor() {
super(User);
}
// Logic for 'origin' and 'user._id' validation is handled automatically
}3. CrudRoutes
Generate standard RESTful endpoints for your controller with optional global and local middlewares.
import { CrudRoutes, CrudMiddleware } from 'express-web-tools';
import userController from './controllers/UserController';
import { authenticate, authorize, validateUser } from './middleware';
const middleware: CrudMiddleware = {
global: [authenticate], // Applied to all routes
add: [validateUser], // Specific to POST /users
delete: [authorize('admin')] // Specific to DELETE /users/:id
};
const userRoutes = new CrudRoutes('/users', userController, middleware);
// Dynamic middleware addition
userRoutes.addMiddleware('global', [anotherMiddleware]);
userRoutes.addMiddleware('add', validatePayload);
const router = userRoutes.publish();
// Routes generated:
// GET /users -> [authenticate] -> List all
// POST /users -> [authenticate, validateUser] -> Create new
// DELETE /users/:id -> [authenticate, authorize('admin')] -> Delete4. EventStream
Singleton or instance-based event emitter with async support.
import { eventStream, EventStream } from 'express-web-tools';
// Using the global singleton
eventStream.onEvent('log', async (data) => console.log(data));
eventStream.emitEvent('log', 'Hello World');
// Or create a private stream
const privateBus = new EventStream();5. FSLogger
Manage application logs with ease.
import { fsLogger, FSLogger } from 'express-web-tools';
// Global logger (uses process.env.logpath or ./logs)
fsLogger.Log('Action performed', { userId: 1 });
// Custom logger
const dbLogger = new FSLogger('./logs/db.log');6. Token (JWT)
Configure your secret once and use it everywhere.
import { Token } from 'express-web-tools';
Token.config('your-super-secret-key');
const token = Token.generate({ id: '123' });
const payload = Token.verify(token);API Reference Summary
ExpressServer
A wrapper to simplify Express app setup, including middleware, routing, and view engines.
import { ExpressServer } from 'express-web-tools';
const server = new ExpressServer();
server.views('twig', './views');
server.addMiddleware(express.json());
server.addRoute('/api/v1', apiRouter);
server.start(3000);API
Static helpers for standard Express responses and a built-in HTTP/HTTPS client.
// Response helpers
API.json(res, { foo: 'bar' }, 'Success message', 200);
API.html(res, '<h1>Hello</h1>');
// HTTP Client
const client = new API({ baseURL: 'https://api.example.com', useHttps: true });
const { status, data } = await client.get('/users');MongooseModel (Advanced)
Easily add hooks, virtuals, and static methods to your models.
const userModelWrapper = new MongooseModel<IUser>('User', userSchema);
userModelWrapper.addPreHook('save', function(next) {
console.log('Saving user...');
next();
});
userModelWrapper.addStatic('findByUsername', function(username) {
return this.findOne({ username });
});
const User = userModelWrapper.model();Other Utilities
Mutate: High-performance deep cloning usingstructuredClone.HttpError: Standardized error class for throwing HTTP-specific status codes.asyncHandler: Middleware to wrap async routes and catch errors automatically.configTest: Utility to validate presence of essential environment variables on startup.
configTest
Ensure your application has all required environment variables before starting.
import { configTest } from 'express-web-tools';
// Throws a descriptive error if variables are missing
configTest(['MONGO_URI', 'JWT_SECRET', 'PORT']);Installation
npm install express-web-toolsNote:
expressandmongooseare listed as peer dependencies. Ensure they are installed in your project:npm install express mongooseMongoose Compatibility
The library automatically handles version differences for Mongoose. For Mongoose v6 and above, it uses
returnDocument: 'after'for update operations, while falling back tonew: truefor older versions, ensuring you always receive the updated document.
License
ISC
