@yauheni-shcharbakou/wormhole
v1.0.0
Published
Library for handle backend state between middlewares in TypeScript frameworks
Downloads
5
Readme
wormhole
TypeScript library for handle backend state between middlewares in TypeScript frameworks
Installation
npm install @yauheni-shcharbakou/wormholeUsage
Configure dynamic wormhole based on initial state object
// project.ts
import { WormholeBuilder, DynamicWormholeFactory } from '@yauheni-shcharbakou/wormhole';
export type State = {
todos: object[];
posts: object[];
missing?: boolean;
};
// initial state object
const state: State = {
todos: [],
posts: [],
};
// create dynamic wormhole class with utility methods based on initial state object
const Wormhole: DynamicWormholeFactory<State> = new WormholeBuilder(state).dynamic;If you use Express, declare type top-level declarations for Request object
// global.d.ts
import { StorageProvider } from '@yauheni-shcharbakou/wormhole';
import { State } from 'project';
declare global {
namespace Express {
interface Request extends StorageProvider<State> {}
}
}
export {};Then use it inside middlewares and endpoints for set / get state fields
// project.ts
import { Wormhole, WormholeBuilder, DynamicWormhole, DynamicWormholeFactory } from '@yauheni-shcharbakou/wormhole';
import express, { Request, Response, NextFunction } from 'express';
import { fetchTodos } from 'any'
// ...previous example
const app = express();
app.use(async (request: Request, response: Response, next: NextFunction) => {
const wormhole: DynamicWormhole<State> = Wormhole(request);
const todos: object[] = await fetchTodos();
wormhole.set({ todos }); // set todos field in backend state
wormhole.setTodos(todos); // same as previous, method generates dynamically based on initial state object
next();
});
app.use(async (request: Request, response: Response, next: NextFunction) => {
const wormhole: DynamicWormhole<State> = Wormhole(request);
console.log(wormhole.get('todos')); // [...todos]
console.log(wormhole.getTodos()); // [...todos]
console.log(wormhole.get('posts')); // []
console.log(wormhole.getPosts()); // []
next();
});
app.get('/', async (request: Request, response: Response, next: NextFunction) => {
// static wormhole (without auto-generation of methods)
const wormhole: Wormhole<State> = new WormholeBuilder(state).static(request);
console.log(wormhole.get('missing')); // undefined
response.json({ todos: wormhole.getTodos() });
});
app.listen(5000);Creating custom setter
const wormhole: DynamicWormhole<State> = Wormhole(request);
const setter = wormhole.createSetter((state: State, todo: object) => {
return { todos: [...state.todos, todo] };
});
setter({ text: 'some text' });Creating custom spread setter
const wormhole: DynamicWormhole<State> = Wormhole(request);
const spreadSetter = wormhole.createSpreadSetter((state: State, ...posts: Post[]) => {
return { posts: [...state.posts, ...posts] };
});
spreadSetter({ text: 'some text' }, { text: 'another text' });