@ismael1361/router 1.0.0
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.
- package/README.md +988 -0
- package/dist/HandleError.d.ts +78 -0
- package/dist/HandleError.d.ts.map +1 -0
- package/dist/handler.d.ts +114 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/index.d.ts +149 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +153 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/router.d.ts +416 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/setupTests.d.ts +3 -0
- package/dist/setupTests.d.ts.map +1 -0
- package/dist/type.d.ts +125 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/utils.d.ts +123 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +70 -0
package/dist/type.d.ts
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Request as ExpressRequest, Response as ExpressResponse, NextFunction, Router as ExpressRouter, Express as ExpressApp, RequestHandler, Locals } from "express";
|
|
2
|
+
import type swaggerJSDoc from "swagger-jsdoc";
|
|
3
|
+
import type { PreparedHandler } from "./handler";
|
|
4
|
+
export { ExpressRequest, NextFunction, ExpressRouter, ExpressApp };
|
|
5
|
+
type Send<ResBody = any, T = Response<ResBody>> = (body?: ResBody) => T;
|
|
6
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
7
|
+
type MergeObjects<A, B> = {
|
|
8
|
+
[K in keyof A | keyof B]: K extends keyof A ? K extends keyof B ? A[K] | B[K] : A[K] : K extends keyof B ? B[K] : never;
|
|
9
|
+
};
|
|
10
|
+
export type PreferMerge<A, B> = IsAny<A> extends true ? B : IsAny<B> extends true ? A : MergeObjects<A, B>;
|
|
11
|
+
export type CombineKeys<A, B> = IsAny<A> extends true ? B : IsAny<B> extends true ? A : A | B;
|
|
12
|
+
export type Identity<T> = IsAny<T> extends true ? Record<PropertyKey, any> : T;
|
|
13
|
+
export type Prettify<T> = {
|
|
14
|
+
[K in keyof T]: T[K];
|
|
15
|
+
} & {};
|
|
16
|
+
export type RouterMethods = "get" | "post" | "put" | "delete" | "patch" | "options" | "head" | "all" | "use";
|
|
17
|
+
/**
|
|
18
|
+
* Representa um objeto de requisição (request) estendido do Express, com tipagem aprimorada e propriedades adicionais.
|
|
19
|
+
* Esta interface permite definir os tipos para os parâmetros da rota (`ReqParams`),
|
|
20
|
+
* o corpo da requisição (`ReqBody`), a query string (`ReqQuery`) e o corpo da resposta (`ResBody`),
|
|
21
|
+
* proporcionando um desenvolvimento mais seguro e com melhor autocompletar.
|
|
22
|
+
*
|
|
23
|
+
* @template {string} [ReqQuery=any] - As chaves esperadas na query string da URL (ex: "id" | "name").
|
|
24
|
+
* @template [ReqBody=any] - O tipo do corpo da requisição (ex: `{ username: string; }`).
|
|
25
|
+
* @template [ResBody=any] - O tipo do corpo da resposta que será enviada.
|
|
26
|
+
* @template {string} [ReqParams=any] - As chaves dos parâmetros da rota (ex: "userId" | "postId").
|
|
27
|
+
*
|
|
28
|
+
* @property {string} clientIp - O endereço IP do cliente que originou a requisição.
|
|
29
|
+
* @property {Record<ReqParams, any>} params - Um objeto contendo os parâmetros da rota, com chaves fortemente tipadas.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Exemplo de uso em um handler para a rota: GET /users/:userId?active=true
|
|
33
|
+
* import { Response } from "express";
|
|
34
|
+
* import { Request } from "./Router2";
|
|
35
|
+
*
|
|
36
|
+
* // Define os tipos para a requisição
|
|
37
|
+
* type GetUserReq = Request<"active", never, { id: number; name: string }, "userId">;
|
|
38
|
+
*
|
|
39
|
+
* const getUserHandler = (req: GetUserReq, res: Response) => {
|
|
40
|
+
* // Acesso fortemente tipado aos parâmetros e query
|
|
41
|
+
* const userId: string = req.params.userId;
|
|
42
|
+
* const isActive: string = req.query.active; // "true" ou undefined
|
|
43
|
+
* res.json({ id: parseInt(userId, 10), name: "Usuário Exemplo" });
|
|
44
|
+
* };
|
|
45
|
+
*/
|
|
46
|
+
export interface Request<ReqQuery extends string = any, ReqBody = any, ResBody = any, ReqParams extends string = any> extends ExpressRequest<Record<ReqParams, any>, ResBody, Identity<ReqBody>, Record<ReqQuery, any>> {
|
|
47
|
+
clientIp: string;
|
|
48
|
+
body: Identity<ReqBody>;
|
|
49
|
+
params: Record<ReqParams, any>;
|
|
50
|
+
query: Record<ReqQuery, any>;
|
|
51
|
+
}
|
|
52
|
+
export interface Response<ResBody = any, LocalsObj extends Record<string, any> = Record<string, any>> extends ExpressResponse<ResBody, LocalsObj> {
|
|
53
|
+
send: Send<ResBody, this>;
|
|
54
|
+
json: Send<ResBody, this>;
|
|
55
|
+
jsonp: Send<ResBody, this>;
|
|
56
|
+
locals: LocalsObj & Locals;
|
|
57
|
+
}
|
|
58
|
+
export type ExpressRequestHandler<Rq, Rs> = Rq extends ExpressRequest<infer P, any, infer ReqBody, infer ReqQuery, any> ? Rs extends ExpressResponse<infer ResBody, infer LocalsObj> ? RequestHandler<P, ResBody, ReqBody, ReqQuery, LocalsObj> : never : never;
|
|
59
|
+
/**
|
|
60
|
+
* Define a estrutura da documentação Swagger/OpenAPI que pode ser anexada a um middleware.
|
|
61
|
+
* Permite que middlewares contribuam com definições de segurança, parâmetros, etc., que são
|
|
62
|
+
* mescladas com a documentação da rota final.
|
|
63
|
+
*
|
|
64
|
+
* @see MiddlewareFC
|
|
65
|
+
* @example
|
|
66
|
+
* const authMiddleware: MiddlewareFC = (req, res, next) => { next(); };
|
|
67
|
+
* authMiddleware.doc = {
|
|
68
|
+
* security: [{ BearerAuth: [] }],
|
|
69
|
+
* components: {
|
|
70
|
+
* securitySchemes: { BearerAuth: { type: "http", scheme: "bearer" } }
|
|
71
|
+
* }
|
|
72
|
+
* };
|
|
73
|
+
*/
|
|
74
|
+
export type MiddlewareFCDoc = swaggerJSDoc.Operation & {
|
|
75
|
+
components?: swaggerJSDoc.Components;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Estende o objeto de requisição do Express com funcionalidades adicionais para o middleware.
|
|
79
|
+
* @template Req O tipo do objeto de requisição do Express.
|
|
80
|
+
*/
|
|
81
|
+
export type MiddlewareRequest<Req = Request> = Request & Req & {
|
|
82
|
+
/**
|
|
83
|
+
* Controla a execução do middleware para a requisição atual.
|
|
84
|
+
* Útil para garantir que um middleware seja executado apenas uma vez, mesmo que seja
|
|
85
|
+
* aplicado em múltiplos níveis de rotas.
|
|
86
|
+
*
|
|
87
|
+
* @param {boolean} [isOnce=true] - Se `true`, o middleware não será executado novamente para a mesma requisição. Se `false`, permite que o middleware seja executado novamente.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* // Middleware que executa uma lógica apenas uma vez por requisição.
|
|
91
|
+
* const myMiddleware: MiddlewareFC = (req, res, next) => {
|
|
92
|
+
* // Garante que este bloco de código execute apenas uma vez.
|
|
93
|
+
* req.executeOnce();
|
|
94
|
+
*
|
|
95
|
+
* console.log("Este middleware só roda uma vez!");
|
|
96
|
+
* next();
|
|
97
|
+
* };
|
|
98
|
+
*/
|
|
99
|
+
executeOnce(isOnce?: boolean): void;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Define a assinatura para uma função de middleware que será chamada quando uma rota for correspondida.
|
|
103
|
+
* @param req O objeto da requisição, estendido com o método `executeOnce`.
|
|
104
|
+
* @param res O objeto da resposta.
|
|
105
|
+
* @param next A função para chamar o próximo middleware na pilha.
|
|
106
|
+
* @template Req O tipo do objeto de requisição do Express.
|
|
107
|
+
* @template Res O tipo do objeto de resposta do Express.
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* import { MiddlewareFC } from "utils/Router2";
|
|
111
|
+
*
|
|
112
|
+
* // Middleware que adiciona uma propriedade 'user' à requisição.
|
|
113
|
+
* const authMiddleware: MiddlewareFC = (req, res, next) => {
|
|
114
|
+
* // Em um cenário real, você validaria um token e buscaria o usuário.
|
|
115
|
+
* (req as any).user = { id: 1, name: "Usuário Teste" };
|
|
116
|
+
* next();
|
|
117
|
+
* };
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export type MiddlewareFC<Req extends Request = any, Res extends Response = any> = {
|
|
121
|
+
(req: MiddlewareRequest<Req>, res: Response & Res, next: NextFunction): any;
|
|
122
|
+
doc?: MiddlewareFCDoc;
|
|
123
|
+
};
|
|
124
|
+
export type HandlerFC<Req extends Request = any, Res extends Response = any> = ((req: Request & Req, res: Response & Res, next: NextFunction) => any) | PreparedHandler<Req, Res>;
|
|
125
|
+
//# sourceMappingURL=type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import swaggerJSDoc from "swagger-jsdoc";
|
|
2
|
+
import type { MiddlewareFC, ExpressRouter, Response, Request } from "./type";
|
|
3
|
+
export declare const isConstructedObject: (value: any) => boolean;
|
|
4
|
+
export declare const joinObject: <T extends Object = any>(obj: T, ...objs: Array<Partial<T>>) => T;
|
|
5
|
+
/**
|
|
6
|
+
* Converte uma expressão regular que representa um caminho em uma string de caminho limpa e normalizada.
|
|
7
|
+
* Remove delimitadores de regex, caracteres especiais de âncora e garante que o caminho comece e termine com uma barra.
|
|
8
|
+
*
|
|
9
|
+
* @param {RegExp} regexp A expressão regular a ser convertida.
|
|
10
|
+
* @returns {string} O caminho limpo e normalizado.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Exemplo de uso:
|
|
14
|
+
* const regex = /^\/users\/(?<id>[^/]+)\/?$/i;
|
|
15
|
+
* const path = regexpToPath(regex);
|
|
16
|
+
* console.log(path); // Saída esperada: "/users/{id}/"
|
|
17
|
+
*/
|
|
18
|
+
export declare const regexpToPath: (regexp?: RegExp) => string;
|
|
19
|
+
/**
|
|
20
|
+
* Normaliza uma string de caminho para um formato consistente, adequado para documentação Swagger/OpenAPI.
|
|
21
|
+
* Esta função realiza duas tarefas principais:
|
|
22
|
+
* 1. Consolida múltiplos slashes (`//`, `///`, etc.) em um único slash (`/`).
|
|
23
|
+
* 2. Converte parâmetros de rota no estilo Express (ex: `/:id`) para o formato OpenAPI (ex: `/{id}`).
|
|
24
|
+
*
|
|
25
|
+
* @param {string} path O caminho da rota a ser normalizado.
|
|
26
|
+
* @returns {string} O caminho normalizado.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const rawPath = "//users/:userId//posts";
|
|
30
|
+
* const normalized = normalizePath(rawPath);
|
|
31
|
+
* console.log(normalized); // Saída: "/users/{userId}/posts"
|
|
32
|
+
*/
|
|
33
|
+
export declare const normalizePath: (path: string) => string;
|
|
34
|
+
/**
|
|
35
|
+
* Percorre recursivamente um roteador Express para extrair uma lista de todas as rotas e middlewares.
|
|
36
|
+
* A função identifica rotas, sub-roteadores e middlewares, normalizando seus caminhos e
|
|
37
|
+
* extraindo métodos HTTP e documentação Swagger, se disponível no handler.
|
|
38
|
+
*
|
|
39
|
+
* @param {ExpressRouter} router A instância do roteador Express a ser inspecionada.
|
|
40
|
+
* @param {string} [basePath=""] Um caminho base para prefixar todas as rotas encontradas, útil para roteadores aninhados.
|
|
41
|
+
* @returns {Array<{path: string, methods: string[], type: 'ROUTE' | 'MIDDLEWARE', swagger?: object}>} Uma matriz de objetos representando cada rota ou middleware.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Suponha a seguinte configuração de rotas:
|
|
45
|
+
* const mainRouter = Express.Router();
|
|
46
|
+
* const userRouter = Express.Router();
|
|
47
|
+
*
|
|
48
|
+
* const getUserHandler = (req, res) => res.send('User data');
|
|
49
|
+
* // Anexa a documentação Swagger ao handler
|
|
50
|
+
* (getUserHandler as any).swagger = (path: string) => ({
|
|
51
|
+
* paths: { [path]: { get: { summary: 'Get a specific user' } } }
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* userRouter.get('/:id', getUserHandler);
|
|
55
|
+
* mainRouter.use('/users', userRouter);
|
|
56
|
+
*
|
|
57
|
+
* const routesInfo = getRoutes(mainRouter);
|
|
58
|
+
* console.log(routesInfo);
|
|
59
|
+
* // Saída esperada (simplificada):
|
|
60
|
+
* // [
|
|
61
|
+
* // { path: '/users/{id}/', methods: ['GET'], type: 'ROUTE', swagger: { ... } }
|
|
62
|
+
* // ]
|
|
63
|
+
*/
|
|
64
|
+
export declare const getRoutes: (router: ExpressRouter, basePath?: string) => {
|
|
65
|
+
path: string;
|
|
66
|
+
methods: string[];
|
|
67
|
+
type: "ROUTE" | "MIDDLEWARE";
|
|
68
|
+
swagger?: Pick<swaggerJSDoc.OAS3Definition, "paths" | "components">;
|
|
69
|
+
}[];
|
|
70
|
+
/**
|
|
71
|
+
* Envolve um middleware Express com um manipulador de erros (try-catch) centralizado.
|
|
72
|
+
* Se o handler lançar um erro, esta função o captura, formata uma resposta JSON padronizada
|
|
73
|
+
* e registra o erro. Ele lida com handlers síncronos e assíncronos (Promises).
|
|
74
|
+
*
|
|
75
|
+
* @param {MiddlewareFC<any, any>} handler O middleware a ser envolvido.
|
|
76
|
+
* @returns {MiddlewareFC<any, any>} Um novo middleware com tratamento de erro ou o handler original se for um roteador.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // Esta função é usada internamente por `createDynamicMiddleware`.
|
|
80
|
+
* // Exemplo conceitual de como ela age:
|
|
81
|
+
*
|
|
82
|
+
* const myRiskyHandler: MiddlewareFC = (req, res, next) => {
|
|
83
|
+
* throw new HandleError("Algo deu errado!", 400);
|
|
84
|
+
* };
|
|
85
|
+
*
|
|
86
|
+
* // Em vez de usar `myRiskyHandler` diretamente, o sistema usa `tryHandler(myRiskyHandler)`.
|
|
87
|
+
* // Se `myRiskyHandler` for chamado, o erro será capturado e uma resposta como
|
|
88
|
+
* // { "message": "Algo deu errado!", "name": "HandleError", "code": 400 }
|
|
89
|
+
* // será enviada automaticamente.
|
|
90
|
+
*/
|
|
91
|
+
export declare function tryHandler(handler: MiddlewareFC<any, any>): any;
|
|
92
|
+
/**
|
|
93
|
+
* Cria um middleware dinâmico que adiciona funcionalidades extras a um middleware Express padrão.
|
|
94
|
+
* Funcionalidades adicionadas:
|
|
95
|
+
* 1. **Tratamento de Erros:** Envolve o middleware com `tryHandler` para captura centralizada de erros.
|
|
96
|
+
* 2. **Execução Única:** Previne que o mesmo middleware seja executado mais de uma vez na mesma requisição,
|
|
97
|
+
* útil para middlewares aplicados em roteadores aninhados. Fornece `req.executeOnce()` para controle.
|
|
98
|
+
* 3. **IP do Cliente:** Adiciona `req.clientIp` com o endereço de IP do cliente.
|
|
99
|
+
*
|
|
100
|
+
* @template Req - O tipo de objeto de requisição (Request) que o middleware espera.
|
|
101
|
+
* @template Res - O tipo de objeto de resposta (Response) que o middleware espera.
|
|
102
|
+
* @param {MiddlewareFC<Req, Res>} middleware O middleware original a ser aprimorado.
|
|
103
|
+
* @returns {MiddlewareFC<Req, Res>} O novo middleware aprimorado.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* // Middleware de autenticação que só deve rodar uma vez.
|
|
107
|
+
* const authMiddleware: MiddlewareFC<{ user: any }> = (req, res, next) => {
|
|
108
|
+
* // Garante que a lógica de autenticação não seja executada novamente.
|
|
109
|
+
* req.executeOnce();
|
|
110
|
+
* console.log('Verificando autenticação...');
|
|
111
|
+
* (req as any).user = { id: 123 };
|
|
112
|
+
* next();
|
|
113
|
+
* };
|
|
114
|
+
*
|
|
115
|
+
* // Em um roteador:
|
|
116
|
+
* router.use(authMiddleware); // Aplicado a todas as rotas
|
|
117
|
+
* router.get("/profile", authMiddleware, (req, res) => {
|
|
118
|
+
* // Mesmo sendo declarado duas vezes, o console.log só aparecerá uma vez.
|
|
119
|
+
* res.send(`Perfil do usuário: ${(req as any).user.id}, IP: ${req.clientIp}`);
|
|
120
|
+
* });
|
|
121
|
+
*/
|
|
122
|
+
export declare function createDynamicMiddleware<Req extends Request = Request, Res extends Response = Response>(middleware: MiddlewareFC<Req, Res>): MiddlewareFC<Req, Res>;
|
|
123
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAkB,YAAY,EAAE,aAAa,EAAgB,QAAQ,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAK3G,eAAO,MAAM,mBAAmB,GAAI,OAAO,GAAG,KAAG,OAEhD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAG,CA2BvF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MA+B9C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,WAMzC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,aAAa,EAAE,WAAU,MAAW;UAG7D,MAAM;aACH,MAAM,EAAE;UACX,OAAO,GAAG,YAAY;cAClB,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,GAAG,YAAY,CAAC;GAkCrE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,OA4BzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAkClK"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ismael1361/router",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A API of router functions built with TypeScript",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"private": false,
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public",
|
|
14
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"start": "tsx -r tsconfig-paths/register demo/index.ts",
|
|
18
|
+
"build": "npm run clean && npm run build:types && npm run build:bundles",
|
|
19
|
+
"clean": "rimraf dist",
|
|
20
|
+
"build:types": "tsc --emitDeclarationOnly --declaration --outDir dist/types",
|
|
21
|
+
"build:bundles": "rollup -c --bundleConfigAsCjs",
|
|
22
|
+
"dev": "rollup -c --bundleConfigAsCjs -w",
|
|
23
|
+
"test": "jest",
|
|
24
|
+
"test:watch": "jest --watchAll",
|
|
25
|
+
"prepublishOnly": "npm run build && npm test",
|
|
26
|
+
"npm:publish": "npm run build && npm publish --access=public"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"router",
|
|
30
|
+
"api",
|
|
31
|
+
"typescript"
|
|
32
|
+
],
|
|
33
|
+
"author": "ISMAEL1361",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/ismael1361/router.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/ismael1361/router/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/ismael1361/router#readme",
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@rollup/plugin-commonjs": "^25.0.0",
|
|
45
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
46
|
+
"@rollup/plugin-node-resolve": "^15.0.0",
|
|
47
|
+
"@rollup/plugin-terser": "^0.4.0",
|
|
48
|
+
"@rollup/plugin-typescript": "^11.0.0",
|
|
49
|
+
"@types/express": "^5.0.3",
|
|
50
|
+
"@types/jest": "^29.0.0",
|
|
51
|
+
"@types/node": "^24.7.1",
|
|
52
|
+
"@types/swagger-jsdoc": "^6.0.4",
|
|
53
|
+
"jest": "^29.0.0",
|
|
54
|
+
"jest-environment-node": "^30.1.2",
|
|
55
|
+
"rimraf": "^6.0.1",
|
|
56
|
+
"rollup": "^3.0.0",
|
|
57
|
+
"rollup-plugin-dts": "^6.0.0",
|
|
58
|
+
"ts-jest": "^29.0.0",
|
|
59
|
+
"ts-node": "^10.9.2",
|
|
60
|
+
"tsconfig-paths": "^4.2.0",
|
|
61
|
+
"tslib": "^2.8.1",
|
|
62
|
+
"tsx": "^4.20.6",
|
|
63
|
+
"typescript": "^5.0.0"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@ismael1361/utils": "^1.0.4",
|
|
67
|
+
"express": "^5.1.0",
|
|
68
|
+
"swagger-jsdoc": "^6.2.8"
|
|
69
|
+
}
|
|
70
|
+
}
|