sashiko 0.1.0 → 0.2.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 +42 -14
- package/dist/core/app.d.ts +6 -3
- package/dist/core/app.d.ts.map +1 -1
- package/dist/core/app.js +17 -14
- package/dist/core/app.js.map +1 -1
- package/dist/core/compiler.d.ts +34 -10
- package/dist/core/compiler.d.ts.map +1 -1
- package/dist/core/compiler.js +60 -36
- package/dist/core/compiler.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/metadata.d.ts +4 -4
- package/dist/core/metadata.d.ts.map +1 -1
- package/dist/core/mounted-group.d.ts +41 -0
- package/dist/core/mounted-group.d.ts.map +1 -0
- package/dist/core/mounted-group.js +43 -0
- package/dist/core/mounted-group.js.map +1 -0
- package/dist/decorators/index.d.ts +1 -1
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -1
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/middlewares.d.ts +28 -0
- package/dist/decorators/middlewares.d.ts.map +1 -0
- package/dist/decorators/middlewares.js +40 -0
- package/dist/decorators/middlewares.js.map +1 -0
- package/package.json +1 -1
- package/dist/decorators/use.d.ts +0 -26
- package/dist/decorators/use.d.ts.map +0 -1
- package/dist/decorators/use.js +0 -38
- package/dist/decorators/use.js.map +0 -1
package/README.md
CHANGED
|
@@ -33,6 +33,7 @@ await app.listen({ port: 3000 });
|
|
|
33
33
|
- [Requisitos e instalação](#requisitos-e-instalação)
|
|
34
34
|
- [Rotas](#rotas)
|
|
35
35
|
- [Registro e composição: `app.mount()`](#registro-e-composição-appmount)
|
|
36
|
+
- [Mapeamento manual](#mapeamento-manual)
|
|
36
37
|
- [Schemas: validação, serialização e tipos](#schemas-validação-serialização-e-tipos)
|
|
37
38
|
- [Respostas e o `ctx`](#respostas-e-o-ctx)
|
|
38
39
|
- [Middlewares e guards](#middlewares-e-guards)
|
|
@@ -99,24 +100,50 @@ app
|
|
|
99
100
|
.mount(HealthRoutes)
|
|
100
101
|
.mount(userRoutes) // como declarado
|
|
101
102
|
.mount(userRoutes, { prefix: '/v2/users' }) // a mesma instância em outro prefixo
|
|
102
|
-
.mount(userRoutes, { prefix: '/public/users', only: [
|
|
103
|
+
.mount(userRoutes, { prefix: '/public/users', only: (r) => [r.list, r.get] }) // exposição parcial
|
|
103
104
|
.mount(new AdminRoutes(repo), { middlewares: [authenticate], guards: [isAdmin] }); // regras para o grupo
|
|
104
105
|
```
|
|
105
106
|
|
|
106
107
|
| Opção | Efeito |
|
|
107
108
|
|---|---|
|
|
108
109
|
| `prefix` | Substitui o prefixo do `@Router` |
|
|
109
|
-
| `only` / `except` | Registra só
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
110
|
+
| `only` / `except` | Registra só os métodos selecionados, ou todos menos esses: `(r) => [r.list, r.get]`. O seletor é checado pelo TypeScript; usar os dois juntos gera erro |
|
|
111
|
+
| `auto` | `false` registra só as [rotas manuais](#mapeamento-manual). Padrão: `true` |
|
|
112
|
+
| `middlewares` | Valem para todas as rotas do grupo; rodam antes dos `@Middlewares` da classe |
|
|
113
|
+
| `guards` | Valem para todas as rotas do grupo; rodam antes dos `@Guards` da classe |
|
|
112
114
|
|
|
113
115
|
Erros de registro aparecem na inicialização, com mensagem clara:
|
|
114
116
|
- classe sem `@Router`;
|
|
115
|
-
-
|
|
117
|
+
- seletor em `only`/`except` que não aponta para um método de rota;
|
|
116
118
|
- a mesma classe registrada duas vezes com o mesmo prefixo.
|
|
117
119
|
|
|
118
120
|
> **Por que `mount` e não `register`?** O método monta um grupo de rotas sob um prefixo, quantas vezes for preciso, como o `koa-mount` e os routers do Express. No Fastify, `register` significa plugin encapsulado, e esse nome fica reservado para um futuro sistema de plugins.
|
|
119
121
|
|
|
122
|
+
## Mapeamento manual
|
|
123
|
+
|
|
124
|
+
Depois do `mount`, os verbos `.get()`, `.post()`, `.put()`, `.patch()` e `.delete()` mapeiam um método da classe para um path que ela não declara: um alias, um endpoint legado, um export. O path é relativo ao prefixo do grupo, e o método é escolhido por um **seletor**, checado pelo TypeScript:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
@Router('/users')
|
|
128
|
+
class UserRoutes {
|
|
129
|
+
@Get('/:id', byId) getUser(ctx: Context<typeof byId>) {}
|
|
130
|
+
@Schema(csv) exportCsv(ctx: Context<typeof csv>) {} // sem verbo: só por mapeamento manual
|
|
131
|
+
private findOr404() {} // sem decorator: nunca pode ser exposto
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
app
|
|
135
|
+
.mount(new UserRoutes(repo))
|
|
136
|
+
.get('/legacy/:id', (r) => r.getUser) // GET /users/legacy/:id
|
|
137
|
+
.get('/export.csv', (r) => r.exportCsv, { middlewares: [cache()], guards: [isAuditor] })
|
|
138
|
+
.mount(HealthRoutes); // o encadeamento continua
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- **Seletor:** funciona com instância (inclusive inline, `mount(new X(repo))`) e com a classe. "Ir para a definição" e renomear no editor funcionam.
|
|
142
|
+
- **Permissão por método:** só podem ser mapeados métodos com algum decorator do Sashiko (verbo, `@Schema`, `@Middlewares` ou `@Guards`). Um método sem decorator gera erro no registro.
|
|
143
|
+
- **Regras herdadas:** a rota manual usa os schemas e os `@Middlewares`/`@Guards` do método, e as regras do grupo.
|
|
144
|
+
- **Opções da rota:** `{ middlewares, guards }` em objeto, e não uma lista de funções, para que middleware, guard e seletor nunca se confundam.
|
|
145
|
+
- **Só mapeamento manual:** `mount(x, { auto: false })` não registra as rotas declaradas na classe.
|
|
146
|
+
|
|
120
147
|
## Schemas: validação, serialização e tipos
|
|
121
148
|
|
|
122
149
|
Os schemas da rota (`params`, `query`, `headers`, `body` e `response`) são escritos em [TypeBox](https://github.com/sinclairzx81/typebox) (JSON Schema) e podem ser declarados de duas formas equivalentes:
|
|
@@ -199,7 +226,7 @@ app.use(async (ctx, next) => {
|
|
|
199
226
|
});
|
|
200
227
|
```
|
|
201
228
|
|
|
202
|
-
Por classe ou por método, use `@
|
|
229
|
+
Por classe ou por método, use `@Middlewares` e `@Guards`; para um grupo inteiro ou uma rota manual, use as opções `middlewares` e `guards`, com os mesmos nomes em todos os níveis. Um guard retorna `true` para seguir, `false` para responder 403, ou lança um `HttpError` (por exemplo, `unauthorized()` para 401).
|
|
203
230
|
|
|
204
231
|
```ts
|
|
205
232
|
declare module 'sashiko' {
|
|
@@ -212,10 +239,10 @@ const authenticate: Middleware = async (ctx, next) => {
|
|
|
212
239
|
};
|
|
213
240
|
const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
|
|
214
241
|
|
|
215
|
-
@
|
|
242
|
+
@Middlewares(authenticate)
|
|
216
243
|
@Router('/admin')
|
|
217
244
|
class AdminRoutes {
|
|
218
|
-
@
|
|
245
|
+
@Guards(isAdmin)
|
|
219
246
|
@Delete('/users/:id')
|
|
220
247
|
remove() {}
|
|
221
248
|
}
|
|
@@ -224,13 +251,14 @@ class AdminRoutes {
|
|
|
224
251
|
**Ordem de execução:**
|
|
225
252
|
|
|
226
253
|
```
|
|
227
|
-
globais →
|
|
228
|
-
|
|
254
|
+
globais → mount.middlewares → @Middlewares (classe → método) → rota manual.middlewares
|
|
255
|
+
→ mount.guards → @Guards (classe → método) → rota manual.guards
|
|
256
|
+
→ validação → handler
|
|
229
257
|
```
|
|
230
258
|
|
|
231
|
-
**Ordem dos decorators no código.** `@Router`, `@Get`/`@Post`/…, `@Schema`, `@
|
|
259
|
+
**Ordem dos decorators no código.** `@Router`, `@Get`/`@Post`/…, `@Schema`, `@Middlewares` e `@Guards` só registram metadata, então a posição entre eles não muda o comportamento; a única regra é que vários `@Middlewares` (ou `@Guards`) executam na ordem em que aparecem, de cima para baixo. Já decorators que **envolvem** o método, como `@timer()`, medem tudo o que estiver abaixo deles.
|
|
232
260
|
|
|
233
|
-
Os guards rodam **antes** da validação: quem não tem acesso recebe 401/403, e não um 400 que revelaria o formato esperado.
|
|
261
|
+
Os guards rodam **antes** da validação: quem não tem acesso recebe 401/403, e não um 400 que revelaria o formato esperado.
|
|
234
262
|
|
|
235
263
|
## Erros
|
|
236
264
|
|
|
@@ -328,7 +356,7 @@ assert.equal(res.json<{ name: string }>().name, 'Ana');
|
|
|
328
356
|
| `logRequests` | `false` | Log de cada requisição concluída |
|
|
329
357
|
| `requestId` | header `x-request-id` | `header`, `trustIncoming`, `generate` |
|
|
330
358
|
|
|
331
|
-
Métodos do app: `use()`, `mount()`, `onError()`, `listen()`, `close()`, `callback()`, `inject()`, `log`.
|
|
359
|
+
Métodos do app: `use()`, `mount()`, `onError()`, `listen()`, `close()`, `callback()`, `inject()`, `log`. O `mount()` devolve um `MountedGroup`, com os verbos do mapeamento manual e os mesmos métodos do app, para continuar o encadeamento.
|
|
332
360
|
|
|
333
361
|
O body só é lido como JSON quando o `Content-Type` é `application/json` ou `application/*+json`.
|
|
334
362
|
|
|
@@ -347,7 +375,7 @@ O body só é lido como JSON quando o `Content-Type` é `application/json` ou `a
|
|
|
347
375
|
|
|
348
376
|
## Exemplo completo
|
|
349
377
|
|
|
350
|
-
[`examples/app-users`](examples/app-users) traz CRUD, composição com `app.mount()`, guards, CORS, rate limit, logger, herança e injeção de dependências, além de um script que percorre todos os cenários:
|
|
378
|
+
[`examples/app-users`](examples/app-users) traz CRUD, composição com `app.mount()`, mapeamento manual, guards, CORS, rate limit, logger, herança e injeção de dependências, além de um script que percorre todos os cenários:
|
|
351
379
|
|
|
352
380
|
```bash
|
|
353
381
|
pnpm dev
|
package/dist/core/app.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import http from 'node:http';
|
|
2
2
|
import { type MountOptions } from './compiler.ts';
|
|
3
|
+
import { MountedGroup } from './mounted-group.ts';
|
|
3
4
|
import { type Middleware } from './compose.ts';
|
|
4
5
|
import { Context } from './context.ts';
|
|
5
6
|
import '../shims/symbol-metadata.ts';
|
|
@@ -71,11 +72,13 @@ export declare class SashikoApp {
|
|
|
71
72
|
* ```ts
|
|
72
73
|
* app
|
|
73
74
|
* .mount(HealthRoutes)
|
|
74
|
-
* .mount(new UserRoutes(repo), { prefix: '/v2/users', middlewares: [auth], except: [
|
|
75
|
+
* .mount(new UserRoutes(repo), { prefix: '/v2/users', middlewares: [auth], except: (r) => [r.remove] })
|
|
76
|
+
* .get('/legacy/:id', (r) => r.getUser); // mapeamento manual (F-30)
|
|
75
77
|
* ```
|
|
76
78
|
*/
|
|
77
|
-
mount<T extends object>(ref: new () => T, options?: MountOptions<T>):
|
|
78
|
-
mount<T extends object>(ref: T extends abstract new (...args: never) => unknown ? never : T, options?: MountOptions<T>):
|
|
79
|
+
mount<T extends object>(ref: new () => T, options?: MountOptions<T>): MountedGroup<T>;
|
|
80
|
+
mount<T extends object>(ref: T extends abstract new (...args: never) => unknown ? never : T, options?: MountOptions<T>): MountedGroup<T>;
|
|
81
|
+
private addRoute;
|
|
79
82
|
handle(ctx: Context): Promise<void>;
|
|
80
83
|
/**
|
|
81
84
|
* Executa os `onError` do usuário. Se um deles lançar, o erro é logado e seguimos
|
package/dist/core/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/core/app.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/core/app.ts"],"names":[],"mappings":"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"}
|
package/dist/core/app.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import http from 'node:http';
|
|
3
3
|
import { performance } from 'node:perf_hooks';
|
|
4
|
-
import {
|
|
4
|
+
import { compileAutoRoutes, compileManualRoute, createGroup } from './compiler.js';
|
|
5
|
+
import { MountedGroup } from './mounted-group.js';
|
|
5
6
|
import { compose } from './compose.js';
|
|
6
7
|
import { Context } from './context.js';
|
|
7
8
|
import '../shims/symbol-metadata.js';
|
|
@@ -39,19 +40,21 @@ export class SashikoApp {
|
|
|
39
40
|
return this;
|
|
40
41
|
}
|
|
41
42
|
mount(ref, options = {}) {
|
|
42
|
-
const
|
|
43
|
-
for (const route of
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
const group = createGroup(ref, options);
|
|
44
|
+
for (const route of compileAutoRoutes(group))
|
|
45
|
+
this.addRoute(group.name, route);
|
|
46
|
+
return new MountedGroup(this, group, (g, method, path, select, opts) => this.addRoute(g.name, compileManualRoute(g, method, path, select, opts)));
|
|
47
|
+
}
|
|
48
|
+
addRoute(owner, route) {
|
|
49
|
+
if (this.opts.requireSchemas)
|
|
50
|
+
assertSchemas(owner, route);
|
|
51
|
+
try {
|
|
52
|
+
this.router.on(route.method, route.path, route);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
throw new Error(`[sashiko] app.mount(${owner}): ${route.method} ${route.path} is already registered. ` +
|
|
56
|
+
`Use a different "prefix" to mount the same class twice.`, { cause: err });
|
|
53
57
|
}
|
|
54
|
-
return this;
|
|
55
58
|
}
|
|
56
59
|
async handle(ctx) {
|
|
57
60
|
// Antes de tudo, para valer inclusive em erros, 404 e preflight (S-04).
|
|
@@ -73,7 +76,7 @@ export class SashikoApp {
|
|
|
73
76
|
return void ctx.status(404).json({ error: 'Not Found' });
|
|
74
77
|
}
|
|
75
78
|
ctx.params = match.params;
|
|
76
|
-
// F-01:
|
|
79
|
+
// F-01: middlewares → guards → validação → handler. Guards antes da validação, para que
|
|
77
80
|
// quem não tem acesso receba 401/403 e não um 400 que revele a estrutura esperada.
|
|
78
81
|
const route = match;
|
|
79
82
|
const pipeline = [...route.middlewares];
|
package/dist/core/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/core/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/core/app.ts"],"names":[],"mappings":"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"}
|
package/dist/core/compiler.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Guard } from './guard.ts';
|
|
2
2
|
import type { Middleware } from './compose.ts';
|
|
3
|
+
import { type RouterMetadata } from './metadata.ts';
|
|
3
4
|
import type { RouteDefinition } from './route-table.ts';
|
|
4
5
|
export interface CompiledRoute extends RouteDefinition {
|
|
5
6
|
method: string;
|
|
@@ -7,22 +8,45 @@ export interface CompiledRoute extends RouteDefinition {
|
|
|
7
8
|
}
|
|
8
9
|
/** Classe com construtor sem argumentos **ou** instância já construída (B-10). */
|
|
9
10
|
export type RouterRef = (new () => object) | object;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
type AnyMethod = (...args: never[]) => unknown;
|
|
12
|
+
/** Seleciona um método da instância montada: `(r) => r.getUser` (F-30). */
|
|
13
|
+
export type MethodSelector<T> = (routes: T) => AnyMethod;
|
|
14
|
+
/** Seleciona vários métodos: `(r) => [r.list, r.getUser]` (F-30). */
|
|
15
|
+
export type MethodsSelector<T> = (routes: T) => readonly AnyMethod[];
|
|
16
|
+
/** Opções de `app.mount()`, aplicadas no ponto de composição (F-28, F-30). */
|
|
15
17
|
export interface MountOptions<T = object> {
|
|
16
18
|
/** Substitui o prefixo definido no `@Router`. */
|
|
17
19
|
prefix?: string;
|
|
18
20
|
/** Registra só estes métodos de rota. Não pode ser usado junto com `except`. */
|
|
19
|
-
only?:
|
|
21
|
+
only?: MethodsSelector<T>;
|
|
20
22
|
/** Registra todos os métodos de rota, exceto estes. */
|
|
21
|
-
except?:
|
|
22
|
-
/**
|
|
23
|
+
except?: MethodsSelector<T>;
|
|
24
|
+
/** Registra as rotas declaradas na classe. Padrão: `true`. Use `false` para só mapear manualmente. */
|
|
25
|
+
auto?: boolean;
|
|
26
|
+
/** Middlewares para todas as rotas do grupo; rodam antes dos `@Middlewares` da classe. */
|
|
23
27
|
middlewares?: readonly Middleware[];
|
|
24
|
-
/** Guards para todas as rotas
|
|
28
|
+
/** Guards para todas as rotas do grupo; rodam antes dos `@Guards` da classe. */
|
|
25
29
|
guards?: readonly Guard[];
|
|
26
30
|
}
|
|
27
|
-
|
|
31
|
+
/** Opções de uma rota mapeada manualmente: `.get(path, sel, { middlewares, guards })` (F-30). */
|
|
32
|
+
export interface ManualRouteOptions {
|
|
33
|
+
/** Rodam depois dos `@Middlewares` do método (são as mais específicas). */
|
|
34
|
+
middlewares?: readonly Middleware[];
|
|
35
|
+
/** Rodam depois dos `@Guards` do método. */
|
|
36
|
+
guards?: readonly Guard[];
|
|
37
|
+
}
|
|
38
|
+
/** Um grupo montado: a instância, sua metadata e as opções do `mount`. */
|
|
39
|
+
export interface RouteGroup {
|
|
40
|
+
name: string;
|
|
41
|
+
instance: object;
|
|
42
|
+
meta: RouterMetadata;
|
|
43
|
+
prefix: string;
|
|
44
|
+
options: MountOptions;
|
|
45
|
+
}
|
|
46
|
+
export declare function createGroup(ref: RouterRef, options?: MountOptions): RouteGroup;
|
|
47
|
+
/** Rotas declaradas na classe (`@Get`, `@Post`…), filtradas por `only`/`except` e `auto`. */
|
|
48
|
+
export declare function compileAutoRoutes(group: RouteGroup): CompiledRoute[];
|
|
49
|
+
/** Rota mapeada no app: `.get('/legacy/:id', (r) => r.getUser, opts)` (F-30). */
|
|
50
|
+
export declare function compileManualRoute(group: RouteGroup, httpMethod: string, path: string, selector: MethodSelector<object>, options?: ManualRouteOptions): CompiledRoute;
|
|
51
|
+
export {};
|
|
28
52
|
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG,CAAC,UAAU,MAAM,CAAC,GAAG,MAAM,CAAC;AAEpD,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC;AAE/C,2EAA2E;AAC3E,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;AACzD,qEAAqE;AACrE,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,SAAS,EAAE,CAAC;AAErE,8EAA8E;AAC9E,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM;IACtC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1B,uDAAuD;IACvD,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,sGAAsG;IACtG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0FAA0F;IAC1F,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACpC,gFAAgF;IAChF,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CAC3B;AAED,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACpC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,GAAE,YAAiB,GAAG,UAAU,CAgBlF;AAED,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,EAAE,CAiBpE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,EAChC,OAAO,GAAE,kBAAuB,GAC/B,aAAa,CAGf"}
|
package/dist/core/compiler.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readOwnMetadata } from './metadata.js';
|
|
2
2
|
import { joinPaths } from '../utils/path.js';
|
|
3
|
-
export function
|
|
3
|
+
export function createGroup(ref, options = {}) {
|
|
4
4
|
const isClass = typeof ref === 'function';
|
|
5
5
|
const Class = (isClass ? ref : ref.constructor);
|
|
6
6
|
const meta = readOwnMetadata(Class);
|
|
@@ -8,43 +8,67 @@ export function compileRoutes(ref, opts = {}) {
|
|
|
8
8
|
throw new Error(`[sashiko] Class ${Class.name} is not decorated with @Router('/prefix'). ` +
|
|
9
9
|
`Add it to register the class with app.mount().`);
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
if (options.only && options.except) {
|
|
12
|
+
throw new Error(`[sashiko] app.mount(${Class.name}): use either "only" or "except", not both.`);
|
|
13
|
+
}
|
|
13
14
|
// Instâncias permitem injetar dependências pelo construtor: app.mount(new UserRoutes(repo))
|
|
14
15
|
const instance = isClass ? new Class() : ref;
|
|
15
|
-
|
|
16
|
-
const routes = [];
|
|
17
|
-
for (const [name, methodMeta] of meta.methods) {
|
|
18
|
-
if (!methodMeta.method || !methodMeta.path || !selected.has(String(name)))
|
|
19
|
-
continue;
|
|
20
|
-
const fn = instance[name];
|
|
21
|
-
if (typeof fn !== 'function')
|
|
22
|
-
continue;
|
|
23
|
-
routes.push({
|
|
24
|
-
method: methodMeta.method,
|
|
25
|
-
path: joinPaths(prefix, methodMeta.path),
|
|
26
|
-
handler: (ctx) => fn.call(instance, ctx),
|
|
27
|
-
schemas: methodMeta.schemas,
|
|
28
|
-
// Ordem: composição (app.mount) → classe → método (F-01, F-28)
|
|
29
|
-
middlewares: [...(opts.middlewares ?? []), ...meta.middlewares, ...methodMeta.middlewares],
|
|
30
|
-
guards: [...(opts.guards ?? []), ...meta.guards, ...methodMeta.guards],
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
return routes;
|
|
16
|
+
return { name: Class.name, instance, meta, prefix: options.prefix ?? meta.prefix, options };
|
|
34
17
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
18
|
+
/** Rotas declaradas na classe (`@Get`, `@Post`…), filtradas por `only`/`except` e `auto`. */
|
|
19
|
+
export function compileAutoRoutes(group) {
|
|
20
|
+
const { meta, options } = group;
|
|
21
|
+
if (options.auto === false)
|
|
22
|
+
return [];
|
|
23
|
+
const declared = [...meta.methods].filter(([, m]) => m.method && m.path).map(([name]) => name);
|
|
24
|
+
const pick = (selector, label) => new Set(selector(group.instance).map((fn) => resolveMethod(group, fn, label, declared)));
|
|
25
|
+
const excluded = options.except ? pick(options.except, 'except') : new Set();
|
|
26
|
+
const selected = options.only ? pick(options.only, 'only') : new Set(declared.filter((n) => !excluded.has(n)));
|
|
27
|
+
return declared
|
|
28
|
+
.filter((name) => selected.has(name))
|
|
29
|
+
.map((name) => {
|
|
30
|
+
const m = meta.methods.get(name);
|
|
31
|
+
return buildRoute(group, name, m, m.method, m.path);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Rota mapeada no app: `.get('/legacy/:id', (r) => r.getUser, opts)` (F-30). */
|
|
35
|
+
export function compileManualRoute(group, httpMethod, path, selector, options = {}) {
|
|
36
|
+
const name = resolveMethod(group, selector(group.instance), `.${httpMethod.toLowerCase()}('${path}')`);
|
|
37
|
+
return buildRoute(group, name, group.meta.methods.get(name), httpMethod, path, options);
|
|
38
|
+
}
|
|
39
|
+
function buildRoute(group, name, methodMeta, httpMethod, path, manual = {}) {
|
|
40
|
+
const fn = group.instance[name];
|
|
41
|
+
const { meta, options, instance } = group;
|
|
42
|
+
return {
|
|
43
|
+
method: httpMethod,
|
|
44
|
+
path: joinPaths(group.prefix, path),
|
|
45
|
+
handler: (ctx) => fn.call(instance, ctx),
|
|
46
|
+
schemas: methodMeta.schemas,
|
|
47
|
+
// Ordem: mount → classe → método → rota manual (F-01, F-28, F-30)
|
|
48
|
+
middlewares: [...(options.middlewares ?? []), ...meta.middlewares, ...methodMeta.middlewares, ...(manual.middlewares ?? [])],
|
|
49
|
+
guards: [...(options.guards ?? []), ...meta.guards, ...methodMeta.guards, ...(manual.guards ?? [])],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Descobre o nome do método a partir da função devolvida pelo seletor.
|
|
54
|
+
* Só aceita métodos com algum decorator do Sashiko (a "permissão" no nível do método).
|
|
55
|
+
*/
|
|
56
|
+
function resolveMethod(group, fn, where, allowed = [...group.meta.methods.keys()]) {
|
|
57
|
+
const target = group.instance;
|
|
58
|
+
const name = typeof fn === 'function' ? allowed.find((n) => target[n] === fn) : undefined;
|
|
59
|
+
if (name !== undefined)
|
|
60
|
+
return name;
|
|
61
|
+
const label = typeof fn === 'function' && fn.name ? `"${fn.name}"` : 'the selected value';
|
|
62
|
+
const available = allowed.map(String).join(', ') || '(none)';
|
|
63
|
+
const decorated = typeof fn === 'function' && [...group.meta.methods.keys()].some((n) => target[n] === fn);
|
|
64
|
+
const isMethod = typeof fn === 'function'
|
|
65
|
+
&& Object.values(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(target))).some((d) => d.value === fn);
|
|
66
|
+
const reason = decorated
|
|
67
|
+
? `${label} has no HTTP verb decorator, so it is not an automatic route; map it manually with .get()/.post()…`
|
|
68
|
+
: isMethod
|
|
69
|
+
? `${label} has no Sashiko decorator (@Get, @Schema, @Middlewares, @Guards…), so it cannot be exposed`
|
|
70
|
+
: `${label} is not a method of ${group.name}`;
|
|
71
|
+
const at = where.startsWith('.') ? where : ` ${where}`;
|
|
72
|
+
throw new Error(`[sashiko] app.mount(${group.name})${at}: ${reason}. Available: ${available}.`);
|
|
49
73
|
}
|
|
50
74
|
//# sourceMappingURL=compiler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import '../shims/symbol-metadata.ts';
|
|
2
2
|
export { createApp, SashikoApp, type AppOptions, type ListenOptions, type RequestIdOptions, type ServerTimeouts } from './app.ts';
|
|
3
3
|
export type { InjectOptions, InjectResponse } from './inject.ts';
|
|
4
|
-
export type {
|
|
4
|
+
export type { ManualRouteOptions, MethodSelector, MethodsSelector, MountOptions, RouterRef } from './compiler.ts';
|
|
5
|
+
export { MountedGroup } from './mounted-group.ts';
|
|
5
6
|
export type { Middleware } from './compose.ts';
|
|
6
7
|
export type { Guard } from './guard.ts';
|
|
7
8
|
export type { InferBody, InferHeaders, InferParams, InferQuery, InferResponse, InferSchema } from './infer.ts';
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAClI,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAClI,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/G,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjH,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrI,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9H,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '../shims/symbol-metadata.js';
|
|
2
2
|
export { createApp, SashikoApp } from './app.js';
|
|
3
|
+
export { MountedGroup } from './mounted-group.js';
|
|
3
4
|
export { consoleLogger, silentLogger } from './logger.js';
|
|
4
5
|
export { Context } from './context.js';
|
|
5
6
|
export { badRequest, forbidden, HttpError, internal, isHttpError, notFound, unauthorized } from './errors.js';
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAmF,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAmF,MAAM,UAAU,CAAC;AAGlI,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAyD,MAAM,aAAa,CAAC;AACjH,OAAO,EAAE,OAAO,EAA0C,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AACrI,OAAO,EAAE,eAAe,EAAE,eAAe,EAA+D,MAAM,eAAe,CAAC"}
|
package/dist/core/metadata.d.ts
CHANGED
|
@@ -13,9 +13,9 @@ export interface MethodMetadata {
|
|
|
13
13
|
path?: string;
|
|
14
14
|
schemas: RouteSchemas;
|
|
15
15
|
handlerName?: string | symbol;
|
|
16
|
-
/** `@
|
|
16
|
+
/** `@Middlewares` no método (F-01). */
|
|
17
17
|
middlewares: Middleware[];
|
|
18
|
-
/** `@
|
|
18
|
+
/** `@Guards` no método (F-01). */
|
|
19
19
|
guards: Guard[];
|
|
20
20
|
}
|
|
21
21
|
export interface RouterMetadata {
|
|
@@ -23,9 +23,9 @@ export interface RouterMetadata {
|
|
|
23
23
|
isRouter: boolean;
|
|
24
24
|
prefix: string;
|
|
25
25
|
methods: Map<string | symbol, MethodMetadata>;
|
|
26
|
-
/** `@
|
|
26
|
+
/** `@Middlewares` na classe: valem para todas as rotas da classe (F-01). */
|
|
27
27
|
middlewares: Middleware[];
|
|
28
|
-
/** `@
|
|
28
|
+
/** `@Guards` na classe (F-01). */
|
|
29
29
|
guards: Guard[];
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/core/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,eAAO,MAAM,eAAe,eAA+B,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/core/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,eAAO,MAAM,eAAe,eAA+B,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,uCAAuC;IACvC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,kCAAkC;IAClC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;IAC9C,4EAA4E;IAC5E,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,kCAAkC;IAClC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,CAoBjF;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAKzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAe/E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAW/F;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,CAO7F"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type http from 'node:http';
|
|
2
|
+
import type { SashikoApp } from './app.ts';
|
|
3
|
+
import type { ManualRouteOptions, MethodSelector, MountOptions, RouteGroup } from './compiler.ts';
|
|
4
|
+
import type { InjectOptions, InjectResponse } from './inject.ts';
|
|
5
|
+
import type { ListenOptions } from './app.ts';
|
|
6
|
+
import type { Logger } from './logger.ts';
|
|
7
|
+
import type { Middleware } from './compose.ts';
|
|
8
|
+
import type { Context } from './context.ts';
|
|
9
|
+
/**
|
|
10
|
+
* Retorno de `app.mount()` (F-30): permite mapear manualmente métodos do grupo e continuar
|
|
11
|
+
* encadeando chamadas do app.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* app
|
|
15
|
+
* .mount(new UserRoutes(repo))
|
|
16
|
+
* .get('/legacy/:id', (r) => r.getUser, { guards: [isAdmin] })
|
|
17
|
+
* .mount(HealthRoutes);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare class MountedGroup<T extends object> {
|
|
21
|
+
#private;
|
|
22
|
+
readonly app: SashikoApp;
|
|
23
|
+
/** @internal Criado por `app.mount()`. */
|
|
24
|
+
constructor(app: SashikoApp, group: RouteGroup, register: (group: RouteGroup, method: string, path: string, select: MethodSelector<object>, opts?: ManualRouteOptions) => void);
|
|
25
|
+
/** Mapeia `GET path` (relativo ao prefixo do grupo) para o método selecionado. */
|
|
26
|
+
get(path: string, select: MethodSelector<T>, opts?: ManualRouteOptions): this;
|
|
27
|
+
post(path: string, select: MethodSelector<T>, opts?: ManualRouteOptions): this;
|
|
28
|
+
put(path: string, select: MethodSelector<T>, opts?: ManualRouteOptions): this;
|
|
29
|
+
patch(path: string, select: MethodSelector<T>, opts?: ManualRouteOptions): this;
|
|
30
|
+
delete(path: string, select: MethodSelector<T>, opts?: ManualRouteOptions): this;
|
|
31
|
+
mount<U extends object>(ref: new () => U, options?: MountOptions<U>): MountedGroup<U>;
|
|
32
|
+
mount<U extends object>(ref: U extends abstract new (...args: never) => unknown ? never : U, options?: MountOptions<U>): MountedGroup<U>;
|
|
33
|
+
use(mw: Middleware): SashikoApp;
|
|
34
|
+
onError(h: (err: unknown, ctx: Context) => void | Promise<void>): SashikoApp;
|
|
35
|
+
listen(options?: number | ListenOptions): Promise<http.Server>;
|
|
36
|
+
close(graceMs?: number): Promise<void>;
|
|
37
|
+
callback(): (req: http.IncomingMessage, res: http.ServerResponse) => void;
|
|
38
|
+
inject(opts: InjectOptions | string): Promise<InjectResponse>;
|
|
39
|
+
get log(): Logger;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=mounted-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mounted-group.d.ts","sourceRoot":"","sources":["../../src/core/mounted-group.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retorno de `app.mount()` (F-30): permite mapear manualmente métodos do grupo e continuar
|
|
3
|
+
* encadeando chamadas do app.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* app
|
|
7
|
+
* .mount(new UserRoutes(repo))
|
|
8
|
+
* .get('/legacy/:id', (r) => r.getUser, { guards: [isAdmin] })
|
|
9
|
+
* .mount(HealthRoutes);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export class MountedGroup {
|
|
13
|
+
app;
|
|
14
|
+
#group;
|
|
15
|
+
#register;
|
|
16
|
+
/** @internal Criado por `app.mount()`. */
|
|
17
|
+
constructor(app, group, register) {
|
|
18
|
+
this.app = app;
|
|
19
|
+
this.#group = group;
|
|
20
|
+
this.#register = register;
|
|
21
|
+
}
|
|
22
|
+
#map(method, path, select, opts) {
|
|
23
|
+
this.#register(this.#group, method, path, select, opts);
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
/** Mapeia `GET path` (relativo ao prefixo do grupo) para o método selecionado. */
|
|
27
|
+
get(path, select, opts) { return this.#map('GET', path, select, opts); }
|
|
28
|
+
post(path, select, opts) { return this.#map('POST', path, select, opts); }
|
|
29
|
+
put(path, select, opts) { return this.#map('PUT', path, select, opts); }
|
|
30
|
+
patch(path, select, opts) { return this.#map('PATCH', path, select, opts); }
|
|
31
|
+
delete(path, select, opts) { return this.#map('DELETE', path, select, opts); }
|
|
32
|
+
mount(ref, options) {
|
|
33
|
+
return this.app.mount(ref, options);
|
|
34
|
+
}
|
|
35
|
+
use(mw) { return this.app.use(mw); }
|
|
36
|
+
onError(h) { return this.app.onError(h); }
|
|
37
|
+
listen(options) { return this.app.listen(options); }
|
|
38
|
+
close(graceMs) { return this.app.close(graceMs); }
|
|
39
|
+
callback() { return this.app.callback(); }
|
|
40
|
+
inject(opts) { return this.app.inject(opts); }
|
|
41
|
+
get log() { return this.app.log; }
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=mounted-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mounted-group.js","sourceRoot":"","sources":["../../src/core/mounted-group.ts"],"names":[],"mappings":"AASA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,YAAY;IACd,GAAG,CAAa;IAChB,MAAM,CAAa;IACnB,SAAS,CAAuH;IAEzI,0CAA0C;IAC1C,YACE,GAAe,EACf,KAAiB,EACjB,QAA8H;QAE9H,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,IAAY,EAAE,MAAyB,EAAE,IAAyB;QACrF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAgC,EAAE,IAAI,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kFAAkF;IAClF,GAAG,CAAC,IAAY,EAAE,MAAyB,EAAE,IAAyB,IAAU,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9H,IAAI,CAAC,IAAY,EAAE,MAAyB,EAAE,IAAyB,IAAU,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAChI,GAAG,CAAC,IAAY,EAAE,MAAyB,EAAE,IAAyB,IAAU,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9H,KAAK,CAAC,IAAY,EAAE,MAAyB,EAAE,IAAyB,IAAU,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAClI,MAAM,CAAC,IAAY,EAAE,MAAyB,EAAE,IAAyB,IAAU,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAKpI,KAAK,CAAC,GAAW,EAAE,OAA8B;QAC/C,OAAQ,IAAI,CAAC,GAAG,CAAC,KAAuE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzG,CAAC;IACD,GAAG,CAAC,EAAc,IAAgB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,CAAuD,IAAgB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,MAAM,CAAC,OAAgC,IAA0B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnG,KAAK,CAAC,OAAgB,IAAmB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,QAAQ,KAAoE,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,CAAC,IAA4B,IAA6B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,GAAG,KAAa,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3C"}
|
|
@@ -2,5 +2,5 @@ export { Delete, Get, Patch, Post, Put } from './http.ts';
|
|
|
2
2
|
export { timer, type TimerOptions } from './log.ts';
|
|
3
3
|
export { Router } from './router.ts';
|
|
4
4
|
export { Schema } from './schema.ts';
|
|
5
|
-
export {
|
|
5
|
+
export { Guards, Middlewares } from './middlewares.ts';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/decorators/index.js
CHANGED
|
@@ -2,5 +2,5 @@ export { Delete, Get, Patch, Post, Put } from './http.js';
|
|
|
2
2
|
export { timer } from './log.js';
|
|
3
3
|
export { Router } from './router.js';
|
|
4
4
|
export { Schema } from './schema.js';
|
|
5
|
-
export {
|
|
5
|
+
export { Guards, Middlewares } from './middlewares.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAqB,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAqB,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Middleware } from '../core/compose.ts';
|
|
2
|
+
import type { Guard } from '../core/guard.ts';
|
|
3
|
+
type ClassOrMethodContext = ClassDecoratorContext | ClassMethodDecoratorContext;
|
|
4
|
+
/**
|
|
5
|
+
* Middlewares para todas as rotas da classe ou para um método (F-01, F-30). Rodam depois dos globais
|
|
6
|
+
* e dos `middlewares` do `mount`, e antes dos guards. É o mesmo nome da opção `middlewares`.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* @Middlewares(rateLimit({ max: 10 })) // todas as rotas da classe
|
|
10
|
+
* @Router('/auth')
|
|
11
|
+
* class AuthRoutes {
|
|
12
|
+
* @Middlewares(audit) @Post('/login') login() {}
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function Middlewares(...middlewares: Middleware[]): (_value: unknown, context: ClassOrMethodContext) => void;
|
|
17
|
+
/**
|
|
18
|
+
* Guards para todas as rotas da classe ou para um método (F-01, F-30). Rodam antes da validação;
|
|
19
|
+
* `false` responde 403. É o mesmo nome da opção `guards`.
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
|
|
23
|
+
* @Guards(isAdmin) @Delete('/:id') remove() {}
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function Guards(...guards: Guard[]): (_value: unknown, context: ClassOrMethodContext) => void;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=middlewares.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/decorators/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,KAAK,oBAAoB,GAAG,qBAAqB,GAAG,2BAA2B,CAAC;AAchF;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,WAAW,EAAE,UAAU,EAAE,YAnB7B,OAAO,WAAW,oBAAoB,KAAG,IAAI,CAqBvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,YAhCd,OAAO,WAAW,oBAAoB,KAAG,IAAI,CAkCvE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getOrCreateMethod, metadataFor } from '../core/metadata.js';
|
|
2
|
+
/**
|
|
3
|
+
* Aplica `items` na classe (todas as rotas) ou no método. Decorators são avaliados de baixo para
|
|
4
|
+
* cima; inserimos no início para que a ordem de execução siga a ordem de leitura (de cima para baixo).
|
|
5
|
+
*/
|
|
6
|
+
function register(decorator, pick, items) {
|
|
7
|
+
return function (_value, context) {
|
|
8
|
+
const meta = metadataFor(context, decorator);
|
|
9
|
+
const target = context.kind === 'class' ? meta : getOrCreateMethod(meta, context.name);
|
|
10
|
+
target[pick].unshift(...items);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Middlewares para todas as rotas da classe ou para um método (F-01, F-30). Rodam depois dos globais
|
|
15
|
+
* e dos `middlewares` do `mount`, e antes dos guards. É o mesmo nome da opção `middlewares`.
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* @Middlewares(rateLimit({ max: 10 })) // todas as rotas da classe
|
|
19
|
+
* @Router('/auth')
|
|
20
|
+
* class AuthRoutes {
|
|
21
|
+
* @Middlewares(audit) @Post('/login') login() {}
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function Middlewares(...middlewares) {
|
|
26
|
+
return register('Middlewares', 'middlewares', middlewares);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Guards para todas as rotas da classe ou para um método (F-01, F-30). Rodam antes da validação;
|
|
30
|
+
* `false` responde 403. É o mesmo nome da opção `guards`.
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
|
|
34
|
+
* @Guards(isAdmin) @Delete('/:id') remove() {}
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function Guards(...guards) {
|
|
38
|
+
return register('Guards', 'guards', guards);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=middlewares.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/decorators/middlewares.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIrE;;;GAGG;AACH,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAA8B,EAAE,KAAyB;IAC5F,OAAO,UAAU,MAAe,EAAE,OAA6B;QAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAe,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,WAAyB;IACtD,OAAO,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,GAAG,MAAe;IACvC,OAAO,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
package/package.json
CHANGED
package/dist/decorators/use.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { Middleware } from '../core/compose.ts';
|
|
2
|
-
import type { Guard } from '../core/guard.ts';
|
|
3
|
-
type ClassOrMethodContext = ClassDecoratorContext | ClassMethodDecoratorContext;
|
|
4
|
-
/**
|
|
5
|
-
* Middlewares por classe ou por rota (F-01). Rodam depois dos globais e antes dos guards.
|
|
6
|
-
*
|
|
7
|
-
* ```ts
|
|
8
|
-
* @Use(rateLimit({ max: 10 })) // todas as rotas da classe
|
|
9
|
-
* @Router('/auth')
|
|
10
|
-
* class AuthRoutes {
|
|
11
|
-
* @Use(audit) @Post('/login') login() {}
|
|
12
|
-
* }
|
|
13
|
-
* ```
|
|
14
|
-
*/
|
|
15
|
-
export declare function Use(...middlewares: Middleware[]): (_value: unknown, context: ClassOrMethodContext) => void;
|
|
16
|
-
/**
|
|
17
|
-
* Guards por classe ou por rota (F-01). Rodam antes da validação; `false` responde 403.
|
|
18
|
-
*
|
|
19
|
-
* ```ts
|
|
20
|
-
* const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
|
|
21
|
-
* @UseGuards(isAdmin) @Delete('/:id') remove() {}
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
export declare function UseGuards(...guards: Guard[]): (_value: unknown, context: ClassOrMethodContext) => void;
|
|
25
|
-
export {};
|
|
26
|
-
//# sourceMappingURL=use.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../src/decorators/use.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,KAAK,oBAAoB,GAAG,qBAAqB,GAAG,2BAA2B,CAAC;AAchF;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,GAAG,WAAW,EAAE,UAAU,EAAE,YAlBrB,OAAO,WAAW,oBAAoB,KAAG,IAAI,CAoBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,YA9BjB,OAAO,WAAW,oBAAoB,KAAG,IAAI,CAgCvE"}
|
package/dist/decorators/use.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { getOrCreateMethod, metadataFor } from '../core/metadata.js';
|
|
2
|
-
/**
|
|
3
|
-
* Aplica `items` na classe (todas as rotas) ou no método. Decorators são avaliados de baixo para
|
|
4
|
-
* cima; inserimos no início para que a ordem de execução siga a ordem de leitura (de cima para baixo).
|
|
5
|
-
*/
|
|
6
|
-
function register(decorator, pick, items) {
|
|
7
|
-
return function (_value, context) {
|
|
8
|
-
const meta = metadataFor(context, decorator);
|
|
9
|
-
const target = context.kind === 'class' ? meta : getOrCreateMethod(meta, context.name);
|
|
10
|
-
target[pick].unshift(...items);
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Middlewares por classe ou por rota (F-01). Rodam depois dos globais e antes dos guards.
|
|
15
|
-
*
|
|
16
|
-
* ```ts
|
|
17
|
-
* @Use(rateLimit({ max: 10 })) // todas as rotas da classe
|
|
18
|
-
* @Router('/auth')
|
|
19
|
-
* class AuthRoutes {
|
|
20
|
-
* @Use(audit) @Post('/login') login() {}
|
|
21
|
-
* }
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
export function Use(...middlewares) {
|
|
25
|
-
return register('Use', 'middlewares', middlewares);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Guards por classe ou por rota (F-01). Rodam antes da validação; `false` responde 403.
|
|
29
|
-
*
|
|
30
|
-
* ```ts
|
|
31
|
-
* const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
|
|
32
|
-
* @UseGuards(isAdmin) @Delete('/:id') remove() {}
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export function UseGuards(...guards) {
|
|
36
|
-
return register('UseGuards', 'guards', guards);
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=use.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/decorators/use.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIrE;;;GAGG;AACH,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAA8B,EAAE,KAAyB;IAC5F,OAAO,UAAU,MAAe,EAAE,OAA6B;QAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAe,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,WAAyB;IAC9C,OAAO,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAG,MAAe;IAC1C,OAAO,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
|