@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/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":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,QAAQ,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,OAAO,IAAI,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5K,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAEnE,KAAK,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC;AAGxE,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAG/C,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI;KACxB,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GACxC,CAAC,SAAS,MAAM,CAAC,GAChB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GACX,CAAC,CAAC,CAAC,CAAC,GACL,CAAC,SAAS,MAAM,CAAC,GACjB,CAAC,CAAC,CAAC,CAAC,GACJ,KAAK;CACR,CAAC;AAGF,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAG3G,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9F,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAE/E,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAE7G;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,OAAO,CAAC,QAAQ,SAAS,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,SAAS,SAAS,MAAM,GAAG,GAAG,CACnH,SAAQ,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACjG,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;IAChJ,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,OAAO,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAC,GACpH,EAAE,SAAS,eAAe,CAAC,MAAM,OAAO,EAAE,MAAM,SAAS,CAAC,GACzD,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,GACxD,KAAK,GACN,KAAK,CAAC;AAET;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,SAAS,GAAG;IACtD,UAAU,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC;CACrC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,GAAG,GAAG,OAAO,IAAI,OAAO,GACrD,GAAG,GAAG;IACL;;;;;;;;;;;;;;;;OAgBG;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACpC,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,OAAO,GAAG,GAAG,EAAE,GAAG,SAAS,QAAQ,GAAG,GAAG,IAAI;IACjF,CAAC,GAAG,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,GAAG,CAAC;IAC5E,GAAG,CAAC,EAAE,eAAe,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,GAAG,SAAS,OAAO,GAAG,GAAG,EAAE,GAAG,SAAS,QAAQ,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,YAAY,KAAK,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC"}
@@ -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
+ }