@ismael1361/router 1.0.8 → 1.0.9
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.html +1530 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/swagger-markdown/transformers/path.d.ts.map +1 -1
- package/package.json +2 -1
- package/resources/markdown-style.css +4 -2
package/README.html
ADDED
|
@@ -0,0 +1,1530 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<title>README</title>
|
|
6
|
+
<meta charset="utf-8">
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
8
|
+
|
|
9
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.css">
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
<style>
|
|
16
|
+
code[class*=language-],
|
|
17
|
+
pre[class*=language-] {
|
|
18
|
+
color: #333;
|
|
19
|
+
background: 0 0;
|
|
20
|
+
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
21
|
+
text-align: left;
|
|
22
|
+
white-space: pre;
|
|
23
|
+
word-spacing: normal;
|
|
24
|
+
word-break: normal;
|
|
25
|
+
word-wrap: normal;
|
|
26
|
+
line-height: 1.4;
|
|
27
|
+
-moz-tab-size: 8;
|
|
28
|
+
-o-tab-size: 8;
|
|
29
|
+
tab-size: 8;
|
|
30
|
+
-webkit-hyphens: none;
|
|
31
|
+
-moz-hyphens: none;
|
|
32
|
+
-ms-hyphens: none;
|
|
33
|
+
hyphens: none
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
pre[class*=language-] {
|
|
37
|
+
padding: .8em;
|
|
38
|
+
overflow: auto;
|
|
39
|
+
border-radius: 3px;
|
|
40
|
+
background: #f5f5f5
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:not(pre)>code[class*=language-] {
|
|
44
|
+
padding: .1em;
|
|
45
|
+
border-radius: .3em;
|
|
46
|
+
white-space: normal;
|
|
47
|
+
background: #f5f5f5
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.token.blockquote,
|
|
51
|
+
.token.comment {
|
|
52
|
+
color: #969896
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.token.cdata {
|
|
56
|
+
color: #183691
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.token.doctype,
|
|
60
|
+
.token.macro.property,
|
|
61
|
+
.token.punctuation,
|
|
62
|
+
.token.variable {
|
|
63
|
+
color: #333
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.token.builtin,
|
|
67
|
+
.token.important,
|
|
68
|
+
.token.keyword,
|
|
69
|
+
.token.operator,
|
|
70
|
+
.token.rule {
|
|
71
|
+
color: #a71d5d
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.token.attr-value,
|
|
75
|
+
.token.regex,
|
|
76
|
+
.token.string,
|
|
77
|
+
.token.url {
|
|
78
|
+
color: #183691
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.token.atrule,
|
|
82
|
+
.token.boolean,
|
|
83
|
+
.token.code,
|
|
84
|
+
.token.command,
|
|
85
|
+
.token.constant,
|
|
86
|
+
.token.entity,
|
|
87
|
+
.token.number,
|
|
88
|
+
.token.property,
|
|
89
|
+
.token.symbol {
|
|
90
|
+
color: #0086b3
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.token.prolog,
|
|
94
|
+
.token.selector,
|
|
95
|
+
.token.tag {
|
|
96
|
+
color: #63a35c
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.token.attr-name,
|
|
100
|
+
.token.class,
|
|
101
|
+
.token.class-name,
|
|
102
|
+
.token.function,
|
|
103
|
+
.token.id,
|
|
104
|
+
.token.namespace,
|
|
105
|
+
.token.pseudo-class,
|
|
106
|
+
.token.pseudo-element,
|
|
107
|
+
.token.url-reference .token.variable {
|
|
108
|
+
color: #795da3
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.token.entity {
|
|
112
|
+
cursor: help
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.token.title,
|
|
116
|
+
.token.title .token.punctuation {
|
|
117
|
+
font-weight: 700;
|
|
118
|
+
color: #1d3e81
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.token.list {
|
|
122
|
+
color: #ed6a43
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.token.inserted {
|
|
126
|
+
background-color: #eaffea;
|
|
127
|
+
color: #55a532
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.token.deleted {
|
|
131
|
+
background-color: #ffecec;
|
|
132
|
+
color: #bd2c00
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.token.bold {
|
|
136
|
+
font-weight: 700
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.token.italic {
|
|
140
|
+
font-style: italic
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.language-json .token.property {
|
|
144
|
+
color: #183691
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.language-markup .token.tag .token.punctuation {
|
|
148
|
+
color: #333
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.language-css .token.function,
|
|
152
|
+
code.language-css {
|
|
153
|
+
color: #0086b3
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.language-yaml .token.atrule {
|
|
157
|
+
color: #63a35c
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
code.language-yaml {
|
|
161
|
+
color: #183691
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.language-ruby .token.function {
|
|
165
|
+
color: #333
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.language-markdown .token.url {
|
|
169
|
+
color: #795da3
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.language-makefile .token.symbol {
|
|
173
|
+
color: #795da3
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.language-makefile .token.variable {
|
|
177
|
+
color: #183691
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.language-makefile .token.builtin {
|
|
181
|
+
color: #0086b3
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.language-bash .token.keyword {
|
|
185
|
+
color: #0086b3
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
pre[data-line] {
|
|
189
|
+
position: relative;
|
|
190
|
+
padding: 1em 0 1em 3em
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
pre[data-line] .line-highlight-wrapper {
|
|
194
|
+
position: absolute;
|
|
195
|
+
top: 0;
|
|
196
|
+
left: 0;
|
|
197
|
+
background-color: transparent;
|
|
198
|
+
display: block;
|
|
199
|
+
width: 100%
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
pre[data-line] .line-highlight {
|
|
203
|
+
position: absolute;
|
|
204
|
+
left: 0;
|
|
205
|
+
right: 0;
|
|
206
|
+
padding: inherit 0;
|
|
207
|
+
margin-top: 1em;
|
|
208
|
+
background: hsla(24, 20%, 50%, .08);
|
|
209
|
+
background: linear-gradient(to right, hsla(24, 20%, 50%, .1) 70%, hsla(24, 20%, 50%, 0));
|
|
210
|
+
pointer-events: none;
|
|
211
|
+
line-height: inherit;
|
|
212
|
+
white-space: pre
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
pre[data-line] .line-highlight:before,
|
|
216
|
+
pre[data-line] .line-highlight[data-end]:after {
|
|
217
|
+
content: attr(data-start);
|
|
218
|
+
position: absolute;
|
|
219
|
+
top: .4em;
|
|
220
|
+
left: .6em;
|
|
221
|
+
min-width: 1em;
|
|
222
|
+
padding: 0 .5em;
|
|
223
|
+
background-color: hsla(24, 20%, 50%, .4);
|
|
224
|
+
color: #f4f1ef;
|
|
225
|
+
font: bold 65%/1.5 sans-serif;
|
|
226
|
+
text-align: center;
|
|
227
|
+
vertical-align: .3em;
|
|
228
|
+
border-radius: 999px;
|
|
229
|
+
text-shadow: none;
|
|
230
|
+
box-shadow: 0 1px #fff
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
pre[data-line] .line-highlight[data-end]:after {
|
|
234
|
+
content: attr(data-end);
|
|
235
|
+
top: auto;
|
|
236
|
+
bottom: .4em
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
html body {
|
|
240
|
+
font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif;
|
|
241
|
+
font-size: 16px;
|
|
242
|
+
line-height: 1.6;
|
|
243
|
+
color: #333;
|
|
244
|
+
background-color: #fff;
|
|
245
|
+
overflow: initial;
|
|
246
|
+
box-sizing: border-box;
|
|
247
|
+
word-wrap: break-word
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
html body>:first-child {
|
|
251
|
+
margin-top: 0
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
html body h1,
|
|
255
|
+
html body h2,
|
|
256
|
+
html body h3,
|
|
257
|
+
html body h4,
|
|
258
|
+
html body h5,
|
|
259
|
+
html body h6 {
|
|
260
|
+
line-height: 1.2;
|
|
261
|
+
margin-top: 1em;
|
|
262
|
+
margin-bottom: 16px;
|
|
263
|
+
color: #000
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
html body h1 {
|
|
267
|
+
font-size: 2.25em;
|
|
268
|
+
font-weight: 300;
|
|
269
|
+
padding-bottom: .3em
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
html body h2 {
|
|
273
|
+
font-size: 1.75em;
|
|
274
|
+
font-weight: 400;
|
|
275
|
+
padding-bottom: .3em
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
html body h3 {
|
|
279
|
+
font-size: 1.5em;
|
|
280
|
+
font-weight: 500
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
html body h4 {
|
|
284
|
+
font-size: 1.25em;
|
|
285
|
+
font-weight: 600
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
html body h5 {
|
|
289
|
+
font-size: 1.1em;
|
|
290
|
+
font-weight: 600
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
html body h6 {
|
|
294
|
+
font-size: 1em;
|
|
295
|
+
font-weight: 600
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
html body h1,
|
|
299
|
+
html body h2,
|
|
300
|
+
html body h3,
|
|
301
|
+
html body h4,
|
|
302
|
+
html body h5 {
|
|
303
|
+
font-weight: 600
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
html body h5 {
|
|
307
|
+
font-size: 1em
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
html body h6 {
|
|
311
|
+
color: #5c5c5c
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
html body strong {
|
|
315
|
+
color: #000
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
html body del {
|
|
319
|
+
color: #5c5c5c
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
html body a:not([href]) {
|
|
323
|
+
color: inherit;
|
|
324
|
+
text-decoration: none
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
html body a {
|
|
328
|
+
color: #08c;
|
|
329
|
+
text-decoration: none
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
html body a:hover {
|
|
333
|
+
color: #00a3f5;
|
|
334
|
+
text-decoration: none
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
html body img {
|
|
338
|
+
max-width: 100%
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
html body>p {
|
|
342
|
+
margin-top: 0;
|
|
343
|
+
margin-bottom: 16px;
|
|
344
|
+
word-wrap: break-word
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
html body>ol,
|
|
348
|
+
html body>ul {
|
|
349
|
+
margin-bottom: 16px
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
html body ol,
|
|
353
|
+
html body ul {
|
|
354
|
+
padding-left: 2em
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
html body ol.no-list,
|
|
358
|
+
html body ul.no-list {
|
|
359
|
+
padding: 0;
|
|
360
|
+
list-style-type: none
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
html body ol ol,
|
|
364
|
+
html body ol ul,
|
|
365
|
+
html body ul ol,
|
|
366
|
+
html body ul ul {
|
|
367
|
+
margin-top: 0;
|
|
368
|
+
margin-bottom: 0
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
html body li {
|
|
372
|
+
margin-bottom: 0
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
html body li.task-list-item {
|
|
376
|
+
list-style: none
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
html body li>p {
|
|
380
|
+
margin-top: 0;
|
|
381
|
+
margin-bottom: 0
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
html body .task-list-item-checkbox {
|
|
385
|
+
margin: 0 .2em .25em -1.8em;
|
|
386
|
+
vertical-align: middle
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
html body .task-list-item-checkbox:hover {
|
|
390
|
+
cursor: pointer
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
html body blockquote {
|
|
394
|
+
margin: 16px 0;
|
|
395
|
+
font-size: inherit;
|
|
396
|
+
padding: 0 15px;
|
|
397
|
+
color: #5c5c5c;
|
|
398
|
+
background-color: #f0f0f0;
|
|
399
|
+
border-left: 4px solid #d6d6d6
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
html body blockquote>:first-child {
|
|
403
|
+
margin-top: 0
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
html body blockquote>:last-child {
|
|
407
|
+
margin-bottom: 0
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
html body hr {
|
|
411
|
+
height: 4px;
|
|
412
|
+
margin: 32px 0;
|
|
413
|
+
background-color: #d6d6d6;
|
|
414
|
+
border: 0 none
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
html body table {
|
|
418
|
+
margin: 10px 0 15px 0;
|
|
419
|
+
border-collapse: collapse;
|
|
420
|
+
border-spacing: 0;
|
|
421
|
+
display: block;
|
|
422
|
+
width: 100%;
|
|
423
|
+
overflow: auto;
|
|
424
|
+
word-break: normal;
|
|
425
|
+
word-break: keep-all
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
html body table th {
|
|
429
|
+
font-weight: 700;
|
|
430
|
+
color: #000
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
html body table td,
|
|
434
|
+
html body table th {
|
|
435
|
+
border: 1px solid #d6d6d6;
|
|
436
|
+
padding: 6px 13px
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
html body dl {
|
|
440
|
+
padding: 0
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
html body dl dt {
|
|
444
|
+
padding: 0;
|
|
445
|
+
margin-top: 16px;
|
|
446
|
+
font-size: 1em;
|
|
447
|
+
font-style: italic;
|
|
448
|
+
font-weight: 700
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
html body dl dd {
|
|
452
|
+
padding: 0 16px;
|
|
453
|
+
margin-bottom: 16px
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
html body code {
|
|
457
|
+
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
|
|
458
|
+
font-size: .85em;
|
|
459
|
+
color: #000;
|
|
460
|
+
background-color: #f0f0f0;
|
|
461
|
+
border-radius: 3px;
|
|
462
|
+
padding: .2em 0
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
html body code::after,
|
|
466
|
+
html body code::before {
|
|
467
|
+
letter-spacing: -.2em;
|
|
468
|
+
content: '\00a0'
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
html body pre>code {
|
|
472
|
+
padding: 0;
|
|
473
|
+
margin: 0;
|
|
474
|
+
word-break: normal;
|
|
475
|
+
white-space: pre;
|
|
476
|
+
background: 0 0;
|
|
477
|
+
border: 0
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
html body .highlight {
|
|
481
|
+
margin-bottom: 16px
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
html body .highlight pre,
|
|
485
|
+
html body pre {
|
|
486
|
+
padding: 1em;
|
|
487
|
+
overflow: auto;
|
|
488
|
+
line-height: 1.45;
|
|
489
|
+
border: #d6d6d6;
|
|
490
|
+
border-radius: 3px
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
html body .highlight pre {
|
|
494
|
+
margin-bottom: 0;
|
|
495
|
+
word-break: normal
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
html body pre code,
|
|
499
|
+
html body pre tt {
|
|
500
|
+
display: inline;
|
|
501
|
+
max-width: initial;
|
|
502
|
+
padding: 0;
|
|
503
|
+
margin: 0;
|
|
504
|
+
overflow: initial;
|
|
505
|
+
line-height: inherit;
|
|
506
|
+
word-wrap: normal;
|
|
507
|
+
background-color: transparent;
|
|
508
|
+
border: 0
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
html body pre code:after,
|
|
512
|
+
html body pre code:before,
|
|
513
|
+
html body pre tt:after,
|
|
514
|
+
html body pre tt:before {
|
|
515
|
+
content: normal
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
html body blockquote,
|
|
519
|
+
html body dl,
|
|
520
|
+
html body ol,
|
|
521
|
+
html body p,
|
|
522
|
+
html body pre,
|
|
523
|
+
html body ul {
|
|
524
|
+
margin-top: 0;
|
|
525
|
+
margin-bottom: 16px
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
html body kbd {
|
|
529
|
+
color: #000;
|
|
530
|
+
border: 1px solid #d6d6d6;
|
|
531
|
+
border-bottom: 2px solid #c7c7c7;
|
|
532
|
+
padding: 2px 4px;
|
|
533
|
+
background-color: #f0f0f0;
|
|
534
|
+
border-radius: 3px
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
@media print {
|
|
538
|
+
html body {
|
|
539
|
+
background-color: #fff
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
html body h1,
|
|
543
|
+
html body h2,
|
|
544
|
+
html body h3,
|
|
545
|
+
html body h4,
|
|
546
|
+
html body h5,
|
|
547
|
+
html body h6 {
|
|
548
|
+
color: #000;
|
|
549
|
+
page-break-after: avoid
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
html body blockquote {
|
|
553
|
+
color: #5c5c5c
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
html body pre {
|
|
557
|
+
page-break-inside: avoid
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
html body table {
|
|
561
|
+
display: table
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
html body img {
|
|
565
|
+
display: block;
|
|
566
|
+
max-width: 100%;
|
|
567
|
+
max-height: 100%
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
html body code,
|
|
571
|
+
html body pre {
|
|
572
|
+
word-wrap: break-word;
|
|
573
|
+
white-space: pre
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
.markdown-preview {
|
|
578
|
+
width: 100%;
|
|
579
|
+
height: 100%;
|
|
580
|
+
box-sizing: border-box
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
.markdown-preview ul {
|
|
584
|
+
list-style: disc
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
.markdown-preview ul ul {
|
|
588
|
+
list-style: circle
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.markdown-preview ul ul ul {
|
|
592
|
+
list-style: square
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.markdown-preview ol {
|
|
596
|
+
list-style: decimal
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
.markdown-preview ol ol,
|
|
600
|
+
.markdown-preview ul ol {
|
|
601
|
+
list-style-type: lower-roman
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
.markdown-preview ol ol ol,
|
|
605
|
+
.markdown-preview ol ul ol,
|
|
606
|
+
.markdown-preview ul ol ol,
|
|
607
|
+
.markdown-preview ul ul ol {
|
|
608
|
+
list-style-type: lower-alpha
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
.markdown-preview .newpage,
|
|
612
|
+
.markdown-preview .pagebreak {
|
|
613
|
+
page-break-before: always
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
.markdown-preview pre.line-numbers {
|
|
617
|
+
position: relative;
|
|
618
|
+
padding-left: 3.8em;
|
|
619
|
+
counter-reset: linenumber
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.markdown-preview pre.line-numbers>code {
|
|
623
|
+
position: relative
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.markdown-preview pre.line-numbers .line-numbers-rows {
|
|
627
|
+
position: absolute;
|
|
628
|
+
pointer-events: none;
|
|
629
|
+
top: 1em;
|
|
630
|
+
font-size: 100%;
|
|
631
|
+
left: 0;
|
|
632
|
+
width: 3em;
|
|
633
|
+
letter-spacing: -1px;
|
|
634
|
+
border-right: 1px solid #999;
|
|
635
|
+
-webkit-user-select: none;
|
|
636
|
+
-moz-user-select: none;
|
|
637
|
+
-ms-user-select: none;
|
|
638
|
+
user-select: none
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
.markdown-preview pre.line-numbers .line-numbers-rows>span {
|
|
642
|
+
pointer-events: none;
|
|
643
|
+
display: block;
|
|
644
|
+
counter-increment: linenumber
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.markdown-preview pre.line-numbers .line-numbers-rows>span:before {
|
|
648
|
+
content: counter(linenumber);
|
|
649
|
+
color: #999;
|
|
650
|
+
display: block;
|
|
651
|
+
padding-right: .8em;
|
|
652
|
+
text-align: right
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
.markdown-preview .mathjax-exps .MathJax_Display {
|
|
656
|
+
text-align: center !important
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.markdown-preview:not([data-for=preview]) .code-chunk .code-chunk-btn-group {
|
|
660
|
+
display: none
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
.markdown-preview:not([data-for=preview]) .code-chunk .status {
|
|
664
|
+
display: none
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
.markdown-preview:not([data-for=preview]) .code-chunk .output-div {
|
|
668
|
+
margin-bottom: 16px
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
.markdown-preview .md-toc {
|
|
672
|
+
padding: 0
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link {
|
|
676
|
+
display: inline;
|
|
677
|
+
padding: .25rem 0
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link div,
|
|
681
|
+
.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link p {
|
|
682
|
+
display: inline
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
.markdown-preview .md-toc .md-toc-link-wrapper.highlighted .md-toc-link {
|
|
686
|
+
font-weight: 800
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
.scrollbar-style::-webkit-scrollbar {
|
|
690
|
+
width: 8px
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.scrollbar-style::-webkit-scrollbar-track {
|
|
694
|
+
border-radius: 10px;
|
|
695
|
+
background-color: transparent
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
.scrollbar-style::-webkit-scrollbar-thumb {
|
|
699
|
+
border-radius: 5px;
|
|
700
|
+
background-color: rgba(150, 150, 150, .66);
|
|
701
|
+
border: 4px solid rgba(150, 150, 150, .66);
|
|
702
|
+
background-clip: content-box
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
html body[for=html-export]:not([data-presentation-mode]) {
|
|
706
|
+
position: relative;
|
|
707
|
+
width: 100%;
|
|
708
|
+
height: 100%;
|
|
709
|
+
top: 0;
|
|
710
|
+
left: 0;
|
|
711
|
+
margin: 0;
|
|
712
|
+
padding: 0;
|
|
713
|
+
overflow: auto
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
html body[for=html-export]:not([data-presentation-mode]) .markdown-preview {
|
|
717
|
+
position: relative;
|
|
718
|
+
top: 0;
|
|
719
|
+
min-height: 100vh
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
@media screen and (min-width:914px) {
|
|
723
|
+
html body[for=html-export]:not([data-presentation-mode]) .markdown-preview {
|
|
724
|
+
padding: 2em calc(50% - 457px + 2em)
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
@media screen and (max-width:914px) {
|
|
729
|
+
html body[for=html-export]:not([data-presentation-mode]) .markdown-preview {
|
|
730
|
+
padding: 2em
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
@media screen and (max-width:450px) {
|
|
735
|
+
html body[for=html-export]:not([data-presentation-mode]) .markdown-preview {
|
|
736
|
+
font-size: 14px !important;
|
|
737
|
+
padding: 1em
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
@media print {
|
|
742
|
+
html body[for=html-export]:not([data-presentation-mode]) #sidebar-toc-btn {
|
|
743
|
+
display: none
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
html body[for=html-export]:not([data-presentation-mode]) #sidebar-toc-btn {
|
|
748
|
+
position: fixed;
|
|
749
|
+
bottom: 8px;
|
|
750
|
+
left: 8px;
|
|
751
|
+
font-size: 28px;
|
|
752
|
+
cursor: pointer;
|
|
753
|
+
color: inherit;
|
|
754
|
+
z-index: 99;
|
|
755
|
+
width: 32px;
|
|
756
|
+
text-align: center;
|
|
757
|
+
opacity: .4
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn {
|
|
761
|
+
opacity: 1
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc {
|
|
765
|
+
position: fixed;
|
|
766
|
+
top: 0;
|
|
767
|
+
left: 0;
|
|
768
|
+
width: 300px;
|
|
769
|
+
height: 100%;
|
|
770
|
+
padding: 32px 0 48px 0;
|
|
771
|
+
font-size: 14px;
|
|
772
|
+
box-shadow: 0 0 4px rgba(150, 150, 150, .33);
|
|
773
|
+
box-sizing: border-box;
|
|
774
|
+
overflow: auto;
|
|
775
|
+
background-color: inherit
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar {
|
|
779
|
+
width: 8px
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track {
|
|
783
|
+
border-radius: 10px;
|
|
784
|
+
background-color: transparent
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb {
|
|
788
|
+
border-radius: 5px;
|
|
789
|
+
background-color: rgba(150, 150, 150, .66);
|
|
790
|
+
border: 4px solid rgba(150, 150, 150, .66);
|
|
791
|
+
background-clip: content-box
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a {
|
|
795
|
+
text-decoration: none
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc {
|
|
799
|
+
padding: 0 16px
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link {
|
|
803
|
+
display: inline;
|
|
804
|
+
padding: .25rem 0
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link div,
|
|
808
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link p {
|
|
809
|
+
display: inline
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper.highlighted .md-toc-link {
|
|
813
|
+
font-weight: 800
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview {
|
|
817
|
+
left: 300px;
|
|
818
|
+
width: calc(100% - 300px);
|
|
819
|
+
padding: 2em calc(50% - 457px - 300px / 2);
|
|
820
|
+
margin: 0;
|
|
821
|
+
box-sizing: border-box
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
@media screen and (max-width:1274px) {
|
|
825
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview {
|
|
826
|
+
padding: 2em
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
@media screen and (max-width:450px) {
|
|
831
|
+
html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview {
|
|
832
|
+
width: 100%
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
html body[for=html-export]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview {
|
|
837
|
+
left: 50%;
|
|
838
|
+
transform: translateX(-50%)
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
html body[for=html-export]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc {
|
|
842
|
+
display: none
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/* Please visit the URL below for more information: */
|
|
846
|
+
/* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
|
|
847
|
+
</style>
|
|
848
|
+
<!-- The content below will be included at the end of the <head> element. -->
|
|
849
|
+
<script type="text/javascript">
|
|
850
|
+
document.addEventListener("DOMContentLoaded", function () {
|
|
851
|
+
// your code here
|
|
852
|
+
});
|
|
853
|
+
</script>
|
|
854
|
+
</head>
|
|
855
|
+
|
|
856
|
+
<body for="html-export">
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
<div class="crossnote markdown-preview ">
|
|
860
|
+
|
|
861
|
+
<h1 id="ismael1361router">@ismael1361/router </h1>
|
|
862
|
+
<p><a href="https://www.npmjs.com/package/@ismael1361/router"><img
|
|
863
|
+
src="https://img.shields.io/npm/v/@ismael1361/router.svg" alt="npm version"></a><br>
|
|
864
|
+
<a href="https://github.com/ismael1361/router/blob/main/MIT"><img
|
|
865
|
+
src="https://img.shields.io/npm/l/@ismael1361/router.svg" alt="License"></a><br>
|
|
866
|
+
<a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-Ready-blue.svg"
|
|
867
|
+
alt="TypeScript"></a>
|
|
868
|
+
</p>
|
|
869
|
+
<p>Um módulo moderno e robusto para criar e gerenciar rotas em Express.js com tipagem encadeada forte, útil para
|
|
870
|
+
tipar conteúdo de escopo e propriedades de requisição como <code>body</code>, <code>params</code> e
|
|
871
|
+
<code>query</code>. Oferece geração automática de documentação OpenAPI/Swagger integrada.
|
|
872
|
+
</p>
|
|
873
|
+
<h2 id="-índice">📋 Índice </h2>
|
|
874
|
+
<ul>
|
|
875
|
+
<li><a href="#-caracter%C3%ADsticas">Características</a></li>
|
|
876
|
+
<li><a href="#-instala%C3%A7%C3%A3o">Instalação</a></li>
|
|
877
|
+
<li><a href="#-in%C3%ADcio-r%C3%A1pido">Início Rápido</a></li>
|
|
878
|
+
<li><a href="#-api-completa">API Completa</a>
|
|
879
|
+
<ul>
|
|
880
|
+
<li><a href="#create">create</a></li>
|
|
881
|
+
<li><a href="#middleware">middleware</a></li>
|
|
882
|
+
<li><a href="#route">route</a></li>
|
|
883
|
+
<li><a href="#classe-router">Classe Router</a></li>
|
|
884
|
+
</ul>
|
|
885
|
+
</li>
|
|
886
|
+
<li><a href="#-exemplos-avan%C3%A7ados">Exemplos Avançados</a></li>
|
|
887
|
+
<li><a href="#-documenta%C3%A7%C3%A3o-openapiswagger">Documentação OpenAPI/Swagger</a></li>
|
|
888
|
+
<li><a href="#-typescript">TypeScript</a></li>
|
|
889
|
+
<li><a href="#-contribuindo">Contribuindo</a></li>
|
|
890
|
+
<li><a href="#-licen%C3%A7a">Licença</a></li>
|
|
891
|
+
</ul>
|
|
892
|
+
<h2 id="-características">✨ Características </h2>
|
|
893
|
+
<ul>
|
|
894
|
+
<li>🔒 <strong>Tipagem Forte</strong>: Suporte completo a TypeScript com tipos encadeados</li>
|
|
895
|
+
<li>📚 <strong>Documentação Automática</strong>: Geração de documentação OpenAPI/Swagger integrada</li>
|
|
896
|
+
<li>🔗 <strong>API Fluente</strong>: Interface encadeável e intuitiva para definição de rotas</li>
|
|
897
|
+
<li>🛡️ <strong>Middlewares Documentados</strong>: Middlewares com documentação automática</li>
|
|
898
|
+
<li>🎯 <strong>Organização Modular</strong>: Suporte a sub-roteadores e rotas agrupadas</li>
|
|
899
|
+
<li>⚡ <strong>Performance</strong>: Construído sobre Express.js, mantendo sua eficiência</li>
|
|
900
|
+
<li>🧩 <strong>Extensível</strong>: Fácil de estender com tipos personalizados</li>
|
|
901
|
+
</ul>
|
|
902
|
+
<h2 id="-instalação">📦 Instalação </h2>
|
|
903
|
+
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token function">npm</span> <span class="token function">install</span> @ismael1361/router
|
|
904
|
+
</code></pre>
|
|
905
|
+
<p>ou</p>
|
|
906
|
+
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token function">yarn</span> <span class="token function">add</span> @ismael1361/router
|
|
907
|
+
</code></pre>
|
|
908
|
+
<h2 id="-início-rápido">🚀 Início Rápido </h2>
|
|
909
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> create<span class="token punctuation">,</span> Middlewares <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
910
|
+
|
|
911
|
+
<span class="token keyword keyword-const">const</span> app <span class="token operator">=</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
912
|
+
|
|
913
|
+
app<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>Middlewares<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
914
|
+
|
|
915
|
+
<span class="token comment">// Crie o roteador com middleware JSON</span>
|
|
916
|
+
<span class="token keyword keyword-const">const</span> router <span class="token operator">=</span> app<span class="token punctuation">.</span><span class="token function">route</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
917
|
+
|
|
918
|
+
<span class="token comment">// Defina rotas com documentação</span>
|
|
919
|
+
router
|
|
920
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/users/:id'</span><span class="token punctuation">)</span>
|
|
921
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
922
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
923
|
+
id<span class="token operator">:</span> req<span class="token punctuation">.</span>params<span class="token punctuation">.</span>id<span class="token punctuation">,</span>
|
|
924
|
+
name<span class="token operator">:</span> <span class="token string">'John Doe'</span>
|
|
925
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
926
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
927
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
928
|
+
summary<span class="token operator">:</span> <span class="token string">'Obter usuário por ID'</span><span class="token punctuation">,</span>
|
|
929
|
+
description<span class="token operator">:</span> <span class="token string">'Retorna os detalhes de um usuário específico'</span><span class="token punctuation">,</span>
|
|
930
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Users'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
931
|
+
params<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
932
|
+
id<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
933
|
+
description<span class="token operator">:</span> <span class="token string">'ID do usuário'</span><span class="token punctuation">,</span>
|
|
934
|
+
type<span class="token operator">:</span> <span class="token string">'string'</span><span class="token punctuation">,</span>
|
|
935
|
+
required<span class="token operator">:</span> <span class="token boolean">true</span>
|
|
936
|
+
<span class="token punctuation">}</span>
|
|
937
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
938
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
939
|
+
<span class="token number">200</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Usuário encontrado'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
940
|
+
<span class="token number">404</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Usuário não encontrado'</span> <span class="token punctuation">}</span>
|
|
941
|
+
<span class="token punctuation">}</span>
|
|
942
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
943
|
+
|
|
944
|
+
app<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
945
|
+
<span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'🚀 Servidor rodando na porta 3000'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
946
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
947
|
+
</code></pre>
|
|
948
|
+
<h2 id="-api-completa">📖 API Completa </h2>
|
|
949
|
+
<h3 id="create">create </h3>
|
|
950
|
+
<p>Cria uma nova instância do roteador aprimorado.</p>
|
|
951
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token generic-function"><span class="token function">create</span><span class="token generic class-name"><span class="token operator"><</span>Req <span class="token keyword keyword-extends">extends</span> Request<span class="token punctuation">,</span> Res <span class="token keyword keyword-extends">extends</span> Response<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Router<span class="token operator"><</span>Req<span class="token punctuation">,</span> Res<span class="token operator">></span>
|
|
952
|
+
</code></pre>
|
|
953
|
+
<p><strong>Retorno:</strong> Nova instância do Router com métodos encadeáveis</p>
|
|
954
|
+
<p><strong>Exemplo:</strong></p>
|
|
955
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> create<span class="token punctuation">,</span> Request<span class="token punctuation">,</span> Response <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
956
|
+
|
|
957
|
+
<span class="token keyword keyword-interface">interface</span> <span class="token class-name">CustomRequest</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">Request</span> <span class="token punctuation">{</span>
|
|
958
|
+
user<span class="token operator">?</span><span class="token operator">:</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> name<span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
959
|
+
<span class="token punctuation">}</span>
|
|
960
|
+
|
|
961
|
+
<span class="token keyword keyword-const">const</span> router <span class="token operator">=</span> <span class="token generic-function"><span class="token function">create</span><span class="token generic class-name"><span class="token operator"><</span>CustomRequest<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
|
|
962
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>express<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
963
|
+
</code></pre>
|
|
964
|
+
<h3 id="middleware">middleware </h3>
|
|
965
|
+
<p>Cria middlewares reutilizáveis com documentação integrada.</p>
|
|
966
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator"><</span>Req <span class="token keyword keyword-extends">extends</span> Request<span class="token punctuation">,</span> Res <span class="token keyword keyword-extends">extends</span> Response<span class="token operator">></span></span></span><span class="token punctuation">(</span>
|
|
967
|
+
callback<span class="token operator">:</span> MiddlewareFC<span class="token operator"><</span>Req<span class="token punctuation">,</span> Res<span class="token operator">></span><span class="token punctuation">,</span>
|
|
968
|
+
doc<span class="token operator">?</span><span class="token operator">:</span> MiddlewareFCDoc
|
|
969
|
+
<span class="token punctuation">)</span><span class="token operator">:</span> MiddlewareFC<span class="token operator"><</span>Req<span class="token punctuation">,</span> Res<span class="token operator">></span>
|
|
970
|
+
</code></pre>
|
|
971
|
+
<p><strong>Parâmetros:</strong></p>
|
|
972
|
+
<ul>
|
|
973
|
+
<li><code>callback</code>: Função de middleware padrão do Express <code>(req, res, next)</code></li>
|
|
974
|
+
<li><code>doc</code> (opcional): Objeto com metadados para documentação OpenAPI</li>
|
|
975
|
+
</ul>
|
|
976
|
+
<p><strong>Retorno:</strong> Função de middleware com metadados de documentação anexados</p>
|
|
977
|
+
<p><strong>Exemplo:</strong></p>
|
|
978
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> middleware<span class="token punctuation">,</span> Request <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
979
|
+
|
|
980
|
+
<span class="token keyword keyword-interface">interface</span> <span class="token class-name">AuthRequest</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">Request<span class="token operator"><</span>
|
|
981
|
+
<span class="token string">"api_key"</span> <span class="token operator">|</span> <span class="token string">"token"</span><span class="token punctuation">,</span>
|
|
982
|
+
<span class="token punctuation">{</span>
|
|
983
|
+
api_key<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
|
|
984
|
+
token<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span>
|
|
985
|
+
<span class="token punctuation">}</span>
|
|
986
|
+
<span class="token operator">></span></span> <span class="token punctuation">{</span>
|
|
987
|
+
user<span class="token operator">:</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> roles<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
988
|
+
<span class="token punctuation">}</span>
|
|
989
|
+
|
|
990
|
+
<span class="token keyword keyword-const">const</span> isAuthenticated <span class="token operator">=</span> <span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator"><</span>AuthRequest<span class="token operator">></span></span></span><span class="token punctuation">(</span>
|
|
991
|
+
<span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
992
|
+
<span class="token keyword keyword-const">const</span> token <span class="token operator">=</span> req<span class="token punctuation">.</span>headers<span class="token punctuation">.</span>authorization<span class="token punctuation">;</span>
|
|
993
|
+
|
|
994
|
+
<span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span>token <span class="token operator">===</span> <span class="token string">'Bearer meu-token-secreto'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
|
995
|
+
req<span class="token punctuation">.</span>user <span class="token operator">=</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token string">'123'</span><span class="token punctuation">,</span> roles<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'admin'</span><span class="token punctuation">,</span> <span class="token string">'user'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
996
|
+
<span class="token keyword keyword-return">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
997
|
+
<span class="token punctuation">}</span>
|
|
998
|
+
|
|
999
|
+
res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">401</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> message<span class="token operator">:</span> <span class="token string">'Não autorizado'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1000
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1001
|
+
<span class="token punctuation">{</span>
|
|
1002
|
+
security<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span> bearerAuth<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1003
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1004
|
+
<span class="token number">401</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1005
|
+
description<span class="token operator">:</span> <span class="token string">'Token de autenticação inválido ou não fornecido'</span>
|
|
1006
|
+
<span class="token punctuation">}</span>
|
|
1007
|
+
<span class="token punctuation">}</span>
|
|
1008
|
+
<span class="token punctuation">}</span>
|
|
1009
|
+
<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1010
|
+
|
|
1011
|
+
<span class="token comment">// Usar o middleware</span>
|
|
1012
|
+
router
|
|
1013
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/profile'</span><span class="token punctuation">)</span>
|
|
1014
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>isAuthenticated<span class="token punctuation">)</span>
|
|
1015
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1016
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> user<span class="token operator">:</span> req<span class="token punctuation">.</span>user <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1017
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1018
|
+
</code></pre>
|
|
1019
|
+
<h3 id="route">route </h3>
|
|
1020
|
+
<p>Cria uma instância de rota para agrupar múltiplos métodos HTTP sob o mesmo caminho.</p>
|
|
1021
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token generic-function"><span class="token function">route</span><span class="token generic class-name"><span class="token operator"><</span>Req <span class="token keyword keyword-extends">extends</span> Request<span class="token punctuation">,</span> Res <span class="token keyword keyword-extends">extends</span> Response<span class="token operator">></span></span></span><span class="token punctuation">(</span>
|
|
1022
|
+
path<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span>
|
|
1023
|
+
<span class="token punctuation">)</span><span class="token operator">:</span> Router<span class="token operator"><</span>Req<span class="token punctuation">,</span> Res<span class="token operator">></span>
|
|
1024
|
+
</code></pre>
|
|
1025
|
+
<p><strong>Parâmetros:</strong></p>
|
|
1026
|
+
<ul>
|
|
1027
|
+
<li><code>path</code>: Caminho da URL para a rota</li>
|
|
1028
|
+
</ul>
|
|
1029
|
+
<p><strong>Retorno:</strong> Nova instância do Router "travada" no path especificado</p>
|
|
1030
|
+
<p><strong>Exemplo:</strong></p>
|
|
1031
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> route <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1032
|
+
|
|
1033
|
+
<span class="token keyword keyword-const">const</span> tasksRouter <span class="token operator">=</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'/tasks'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1034
|
+
|
|
1035
|
+
<span class="token comment">// GET /tasks/items</span>
|
|
1036
|
+
tasksRouter
|
|
1037
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/items'</span><span class="token punctuation">)</span>
|
|
1038
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1039
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Aprender @ismael1361/router'</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1040
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1041
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1042
|
+
summary<span class="token operator">:</span> <span class="token string">'Listar todas as tarefas'</span><span class="token punctuation">,</span>
|
|
1043
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Tasks'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1044
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token number">200</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Lista de tarefas'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
|
|
1045
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1046
|
+
|
|
1047
|
+
<span class="token comment">// POST /tasks/item</span>
|
|
1048
|
+
tasksRouter
|
|
1049
|
+
<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/item'</span><span class="token punctuation">)</span>
|
|
1050
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1051
|
+
<span class="token keyword keyword-const">const</span> newTask <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span>
|
|
1052
|
+
res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">201</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token operator">...</span>newTask <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1053
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1054
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1055
|
+
summary<span class="token operator">:</span> <span class="token string">'Criar nova tarefa'</span><span class="token punctuation">,</span>
|
|
1056
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Tasks'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1057
|
+
body<span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Dados da nova tarefa'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1058
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token number">201</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Tarefa criada'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
|
|
1059
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1060
|
+
|
|
1061
|
+
<span class="token comment">// Adicionar ao roteador principal</span>
|
|
1062
|
+
mainRouter<span class="token punctuation">.</span><span class="token function">by</span><span class="token punctuation">(</span>tasksRouter<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1063
|
+
</code></pre>
|
|
1064
|
+
<h3 id="classe-router">Classe Router </h3>
|
|
1065
|
+
<p>A classe principal que encapsula o roteador do Express com API fluente e tipada.</p>
|
|
1066
|
+
<h4 id="propriedades">Propriedades </h4>
|
|
1067
|
+
<h5 id="app"><code>.app</code> </h5>
|
|
1068
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code>router<span class="token operator">:</span> express<span class="token punctuation">.</span>Express
|
|
1069
|
+
</code></pre>
|
|
1070
|
+
<p>Instância do Express subjacente.</p>
|
|
1071
|
+
<h5 id="routes"><code>.routes</code> </h5>
|
|
1072
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code>routes<span class="token operator">:</span> <span class="token builtin">Array</span><span class="token operator"><</span><span class="token punctuation">{</span>
|
|
1073
|
+
path<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
|
|
1074
|
+
methods<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
|
|
1075
|
+
type<span class="token operator">:</span> <span class="token string">"ROUTE"</span> <span class="token operator">|</span> <span class="token string">"MIDDLEWARE"</span><span class="token punctuation">;</span>
|
|
1076
|
+
swagger<span class="token operator">?</span><span class="token operator">:</span> Pick<span class="token operator"><</span>swaggerJSDoc<span class="token punctuation">.</span>OAS3Definition<span class="token punctuation">,</span> <span class="token string">"paths"</span> <span class="token operator">|</span> <span class="token string">"components"</span><span class="token operator">></span><span class="token punctuation">;</span>
|
|
1077
|
+
<span class="token punctuation">}</span><span class="token operator">></span>
|
|
1078
|
+
</code></pre>
|
|
1079
|
+
<p>Array de rotas e middlewares registrados para geração de documentação.</p>
|
|
1080
|
+
<h4 id="métodos-http">Métodos HTTP </h4>
|
|
1081
|
+
<h5 id="getpath-string-doc-middlewarefcdoc"><code>.get(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1082
|
+
<p>Registra uma rota GET.</p>
|
|
1083
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code>router
|
|
1084
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/status'</span><span class="token punctuation">)</span>
|
|
1085
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1086
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> status<span class="token operator">:</span> <span class="token string">'ok'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1087
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1088
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1089
|
+
summary<span class="token operator">:</span> <span class="token string">'Verificar status da API'</span><span class="token punctuation">,</span>
|
|
1090
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Health'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1091
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token number">200</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'API funcionando'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
|
|
1092
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1093
|
+
</code></pre>
|
|
1094
|
+
<h5 id="postpath-string-doc-middlewarefcdoc"><code>.post(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1095
|
+
<p>Registra uma rota POST.</p>
|
|
1096
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code>router
|
|
1097
|
+
<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/users'</span><span class="token punctuation">)</span>
|
|
1098
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1099
|
+
<span class="token keyword keyword-const">const</span> newUser <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span>
|
|
1100
|
+
res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">201</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> Date<span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">...</span>newUser <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1101
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1102
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1103
|
+
summary<span class="token operator">:</span> <span class="token string">'Criar novo usuário'</span><span class="token punctuation">,</span>
|
|
1104
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Users'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1105
|
+
body<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1106
|
+
description<span class="token operator">:</span> <span class="token string">'Dados do usuário'</span><span class="token punctuation">,</span>
|
|
1107
|
+
schema<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1108
|
+
type<span class="token operator">:</span> <span class="token string">'object'</span><span class="token punctuation">,</span>
|
|
1109
|
+
properties<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1110
|
+
name<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> <span class="token string">'string'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1111
|
+
email<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> <span class="token string">'string'</span> <span class="token punctuation">}</span>
|
|
1112
|
+
<span class="token punctuation">}</span>
|
|
1113
|
+
<span class="token punctuation">}</span>
|
|
1114
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1115
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token number">201</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Usuário criado'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
|
|
1116
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1117
|
+
</code></pre>
|
|
1118
|
+
<h5 id="putpath-string-doc-middlewarefcdoc"><code>.put(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1119
|
+
<p>Registra uma rota PUT para substituição completa de recursos.</p>
|
|
1120
|
+
<h5 id="patchpath-string-doc-middlewarefcdoc"><code>.patch(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1121
|
+
<p>Registra uma rota PATCH para atualizações parciais.</p>
|
|
1122
|
+
<h5 id="deletepath-string-doc-middlewarefcdoc"><code>.delete(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1123
|
+
<p>Registra uma rota DELETE para remoção de recursos.</p>
|
|
1124
|
+
<h5 id="optionspath-string-doc-middlewarefcdoc"><code>.options(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1125
|
+
<p>Registra uma rota OPTIONS para requisições de pré-voo CORS.</p>
|
|
1126
|
+
<h5 id="headpath-string-doc-middlewarefcdoc"><code>.head(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1127
|
+
<p>Registra uma rota HEAD para obter metadados sem corpo de resposta.</p>
|
|
1128
|
+
<h5 id="allpath-string-doc-middlewarefcdoc"><code>.all(path: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1129
|
+
<p>Registra uma rota que responde a todos os métodos HTTP.</p>
|
|
1130
|
+
<h4 id="métodos-de-configuração">Métodos de Configuração </h4>
|
|
1131
|
+
<h5 id="usepath-string-doc-middlewarefcdoc"><code>.use(path?: string, doc?: MiddlewareFCDoc)</code> </h5>
|
|
1132
|
+
<p>Monta middlewares em um caminho específico.</p>
|
|
1133
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code>router<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token string">'/api'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1134
|
+
<span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">[</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword keyword-new">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toISOString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">] </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>req<span class="token punctuation">.</span>method<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>req<span class="token punctuation">.</span>originalUrl<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1135
|
+
<span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1136
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1137
|
+
</code></pre>
|
|
1138
|
+
<h5 id="routepath-string"><code>.route(path?: string)</code> </h5>
|
|
1139
|
+
<p>Cria um sub-roteador com prefixo.</p>
|
|
1140
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-const">const</span> usersRouter <span class="token operator">=</span> mainRouter<span class="token punctuation">.</span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'/users'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1141
|
+
|
|
1142
|
+
usersRouter
|
|
1143
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span>
|
|
1144
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1145
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token string">'1'</span><span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token string">'Alice'</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1146
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1147
|
+
</code></pre>
|
|
1148
|
+
<h5 id="middlewarecallback-middlewarefc-doc-middlewarefcdoc">
|
|
1149
|
+
<code>.middleware(callback: MiddlewareFC, doc?: MiddlewareFCDoc)</code>
|
|
1150
|
+
</h5>
|
|
1151
|
+
<p>Aplica middleware a todas as rotas subsequentes.</p>
|
|
1152
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-const">const</span> router <span class="token operator">=</span> <span class="token function">create</span><span class="token punctuation">(</span>app<span class="token punctuation">)</span>
|
|
1153
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>express<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
|
|
1154
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>authMiddleware<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1155
|
+
</code></pre>
|
|
1156
|
+
<h5 id="handlercallback-handlerfc-doc-middlewarefcdoc">
|
|
1157
|
+
<code>.handler(callback: HandlerFC, doc?: MiddlewareFCDoc)</code>
|
|
1158
|
+
</h5>
|
|
1159
|
+
<p>Define a função controladora para processar requisições.</p>
|
|
1160
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code>router
|
|
1161
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/status'</span><span class="token punctuation">)</span>
|
|
1162
|
+
<span class="token punctuation">.</span><span class="token function">handler</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1163
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> status<span class="token operator">:</span> <span class="token string">'ok'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1164
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1165
|
+
</code></pre>
|
|
1166
|
+
<h5 id="byrouter-expressrouter--router"><code>.by(router: ExpressRouter | Router)</code> </h5>
|
|
1167
|
+
<p>Anexa um roteador existente ao atual.</p>
|
|
1168
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-const">const</span> productsRouter <span class="token operator">=</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'/products'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1169
|
+
<span class="token comment">// ... definir rotas</span>
|
|
1170
|
+
|
|
1171
|
+
mainRouter<span class="token punctuation">.</span><span class="token function">by</span><span class="token punctuation">(</span>productsRouter<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1172
|
+
</code></pre>
|
|
1173
|
+
<h5 id="defineswaggeroptions-swaggeroptions"><code>.defineSwagger(options: SwaggerOptions)</code> </h5>
|
|
1174
|
+
<p>Gera as rotas de documentação para a especificação OpenAPI completa.</p>
|
|
1175
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> create <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1176
|
+
|
|
1177
|
+
<span class="token keyword keyword-const">const</span> router <span class="token operator">=</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1178
|
+
|
|
1179
|
+
<span class="token keyword keyword-const">const</span> swaggerDefinition <span class="token operator">=</span> <span class="token punctuation">{</span>
|
|
1180
|
+
openapi<span class="token operator">:</span> <span class="token string">'3.0.0'</span><span class="token punctuation">,</span>
|
|
1181
|
+
info<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1182
|
+
title<span class="token operator">:</span> <span class="token string">'Minha API'</span><span class="token punctuation">,</span>
|
|
1183
|
+
version<span class="token operator">:</span> <span class="token string">'1.0.0'</span><span class="token punctuation">,</span>
|
|
1184
|
+
description<span class="token operator">:</span> <span class="token string">'API com documentação automática'</span>
|
|
1185
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1186
|
+
servers<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span> url<span class="token operator">:</span> <span class="token string">'http://localhost:3000'</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1187
|
+
components<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1188
|
+
securitySchemes<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1189
|
+
bearerAuth<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1190
|
+
type<span class="token operator">:</span> <span class="token string">'http'</span><span class="token punctuation">,</span>
|
|
1191
|
+
scheme<span class="token operator">:</span> <span class="token string">'bearer'</span><span class="token punctuation">,</span>
|
|
1192
|
+
bearerFormat<span class="token operator">:</span> <span class="token string">'JWT'</span>
|
|
1193
|
+
<span class="token punctuation">}</span>
|
|
1194
|
+
<span class="token punctuation">}</span>
|
|
1195
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1196
|
+
defaultResponses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1197
|
+
<span class="token number">400</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">"Dados inválidos"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1198
|
+
<span class="token number">401</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1199
|
+
description<span class="token operator">:</span> <span class="token string">"Falha na autenticação"</span><span class="token punctuation">,</span>
|
|
1200
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1201
|
+
<span class="token number">403</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">"Acesso negado"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1202
|
+
<span class="token number">500</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">"Erro interno do servidor"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1203
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1204
|
+
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
1205
|
+
|
|
1206
|
+
router<span class="token punctuation">.</span><span class="token function">defineSwagger</span><span class="token punctuation">(</span>swaggerDefinition<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1207
|
+
<span class="token comment">// By swagger json -> /doc/swagger/definition.json</span>
|
|
1208
|
+
<span class="token comment">// By swagger -> /doc/swagger</span>
|
|
1209
|
+
<span class="token comment">// By redoc -> /doc/redoc</span>
|
|
1210
|
+
</code></pre>
|
|
1211
|
+
<h2 id="-exemplos-avançados">🎯 Exemplos Avançados </h2>
|
|
1212
|
+
<h3 id="autenticação-e-autorização">Autenticação e Autorização </h3>
|
|
1213
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> create<span class="token punctuation">,</span> middleware<span class="token punctuation">,</span> Middlewares<span class="token punctuation">,</span> Request <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1214
|
+
|
|
1215
|
+
<span class="token keyword keyword-interface">interface</span> <span class="token class-name">AuthRequest</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">Request</span> <span class="token punctuation">{</span>
|
|
1216
|
+
user<span class="token operator">:</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> roles<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
1217
|
+
<span class="token punctuation">}</span>
|
|
1218
|
+
|
|
1219
|
+
<span class="token comment">// Middleware de autenticação</span>
|
|
1220
|
+
<span class="token keyword keyword-const">const</span> authenticate <span class="token operator">=</span> <span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator"><</span>AuthRequest<span class="token operator">></span></span></span><span class="token punctuation">(</span>
|
|
1221
|
+
<span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1222
|
+
<span class="token keyword keyword-const">const</span> token <span class="token operator">=</span> req<span class="token punctuation">.</span>headers<span class="token punctuation">.</span>authorization<span class="token operator">?.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'Bearer '</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1223
|
+
|
|
1224
|
+
<span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>token<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
|
1225
|
+
<span class="token keyword keyword-return">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">401</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> message<span class="token operator">:</span> <span class="token string">'Token não fornecido'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1226
|
+
<span class="token punctuation">}</span>
|
|
1227
|
+
|
|
1228
|
+
<span class="token comment">// Validar token (exemplo simplificado)</span>
|
|
1229
|
+
req<span class="token punctuation">.</span>user <span class="token operator">=</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token string">'123'</span><span class="token punctuation">,</span> roles<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'user'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
1230
|
+
<span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1231
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1232
|
+
<span class="token punctuation">{</span>
|
|
1233
|
+
security<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span> bearerAuth<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1234
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1235
|
+
<span class="token number">401</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Não autorizado'</span> <span class="token punctuation">}</span>
|
|
1236
|
+
<span class="token punctuation">}</span>
|
|
1237
|
+
<span class="token punctuation">}</span>
|
|
1238
|
+
<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1239
|
+
|
|
1240
|
+
<span class="token comment">// Middleware de autorização</span>
|
|
1241
|
+
<span class="token keyword keyword-const">const</span> <span class="token function-variable function">authorize</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">...</span>roles<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span>
|
|
1242
|
+
<span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator"><</span>AuthRequest<span class="token operator">></span></span></span><span class="token punctuation">(</span>
|
|
1243
|
+
<span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1244
|
+
<span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>req<span class="token punctuation">.</span>user<span class="token punctuation">.</span>roles<span class="token punctuation">.</span><span class="token function">some</span><span class="token punctuation">(</span>role <span class="token operator">=></span> roles<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>role<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
|
1245
|
+
<span class="token keyword keyword-return">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">403</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> message<span class="token operator">:</span> <span class="token string">'Acesso negado'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1246
|
+
<span class="token punctuation">}</span>
|
|
1247
|
+
<span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1248
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1249
|
+
<span class="token punctuation">{</span>
|
|
1250
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1251
|
+
<span class="token number">403</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Acesso negado'</span> <span class="token punctuation">}</span>
|
|
1252
|
+
<span class="token punctuation">}</span>
|
|
1253
|
+
<span class="token punctuation">}</span>
|
|
1254
|
+
<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1255
|
+
|
|
1256
|
+
<span class="token keyword keyword-const">const</span> app <span class="token operator">=</span> <span class="token generic-function"><span class="token function">create</span><span class="token generic class-name"><span class="token operator"><</span>AuthRequest<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
|
|
1257
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>Middlewares<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1258
|
+
|
|
1259
|
+
<span class="token comment">// Rota protegida</span>
|
|
1260
|
+
app
|
|
1261
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/admin/users'</span><span class="token punctuation">)</span>
|
|
1262
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>authenticate<span class="token punctuation">)</span>
|
|
1263
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token function">authorize</span><span class="token punctuation">(</span><span class="token string">'admin'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
|
|
1264
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1265
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> users<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1266
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1267
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1268
|
+
summary<span class="token operator">:</span> <span class="token string">'Listar usuários (Admin)'</span><span class="token punctuation">,</span>
|
|
1269
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Admin'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1270
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token number">200</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Lista de usuários'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
|
|
1271
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1272
|
+
</code></pre>
|
|
1273
|
+
<h3 id="validação-de-dados">Validação de Dados </h3>
|
|
1274
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> middleware<span class="token punctuation">,</span> Request <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1275
|
+
|
|
1276
|
+
<span class="token keyword keyword-interface">interface</span> <span class="token class-name">ValidatedRequest</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">Request</span> <span class="token punctuation">{</span>
|
|
1277
|
+
validated<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1278
|
+
body<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">;</span>
|
|
1279
|
+
params<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">;</span>
|
|
1280
|
+
query<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">;</span>
|
|
1281
|
+
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
1282
|
+
<span class="token punctuation">}</span>
|
|
1283
|
+
|
|
1284
|
+
<span class="token keyword keyword-const">const</span> <span class="token function-variable function">validate</span> <span class="token operator">=</span> <span class="token punctuation">(</span>schema<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span>
|
|
1285
|
+
<span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator"><</span>ValidatedRequest<span class="token operator">></span></span></span><span class="token punctuation">(</span>
|
|
1286
|
+
<span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1287
|
+
<span class="token comment">// Implementar validação (ex: usando Zod, Joi, etc)</span>
|
|
1288
|
+
<span class="token keyword keyword-const">const</span> result <span class="token operator">=</span> schema<span class="token punctuation">.</span><span class="token function">safeParse</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1289
|
+
|
|
1290
|
+
<span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>result<span class="token punctuation">.</span>success<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
|
1291
|
+
<span class="token keyword keyword-return">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1292
|
+
message<span class="token operator">:</span> <span class="token string">'Dados inválidos'</span><span class="token punctuation">,</span>
|
|
1293
|
+
errors<span class="token operator">:</span> result<span class="token punctuation">.</span>error<span class="token punctuation">.</span>errors
|
|
1294
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1295
|
+
<span class="token punctuation">}</span>
|
|
1296
|
+
|
|
1297
|
+
req<span class="token punctuation">.</span>validated <span class="token operator">=</span> <span class="token punctuation">{</span> body<span class="token operator">:</span> result<span class="token punctuation">.</span>data <span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
1298
|
+
<span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1299
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1300
|
+
<span class="token punctuation">{</span>
|
|
1301
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1302
|
+
<span class="token number">400</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Dados de entrada inválidos'</span> <span class="token punctuation">}</span>
|
|
1303
|
+
<span class="token punctuation">}</span>
|
|
1304
|
+
<span class="token punctuation">}</span>
|
|
1305
|
+
<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1306
|
+
|
|
1307
|
+
router
|
|
1308
|
+
<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/users'</span><span class="token punctuation">)</span>
|
|
1309
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token function">validate</span><span class="token punctuation">(</span>userSchema<span class="token punctuation">)</span><span class="token punctuation">)</span>
|
|
1310
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1311
|
+
<span class="token keyword keyword-const">const</span> validatedData <span class="token operator">=</span> req<span class="token punctuation">.</span>validated<span class="token punctuation">.</span>body<span class="token punctuation">;</span>
|
|
1312
|
+
res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">201</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>validatedData<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1313
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1314
|
+
</code></pre>
|
|
1315
|
+
<h3 id="organização-modular">Organização Modular </h3>
|
|
1316
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token comment">// routes/users.routes.ts</span>
|
|
1317
|
+
<span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> route <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1318
|
+
|
|
1319
|
+
<span class="token keyword keyword-export">export</span> <span class="token keyword keyword-const">const</span> usersRouter <span class="token operator">=</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'/users'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1320
|
+
|
|
1321
|
+
usersRouter
|
|
1322
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span>
|
|
1323
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1324
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1325
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1326
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1327
|
+
summary<span class="token operator">:</span> <span class="token string">'Listar usuários'</span><span class="token punctuation">,</span>
|
|
1328
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Users'</span><span class="token punctuation">]</span>
|
|
1329
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1330
|
+
|
|
1331
|
+
usersRouter
|
|
1332
|
+
<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span>
|
|
1333
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1334
|
+
res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">201</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1335
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1336
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1337
|
+
summary<span class="token operator">:</span> <span class="token string">'Criar usuário'</span><span class="token punctuation">,</span>
|
|
1338
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Users'</span><span class="token punctuation">]</span>
|
|
1339
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1340
|
+
|
|
1341
|
+
<span class="token comment">// routes/products.routes.ts</span>
|
|
1342
|
+
<span class="token keyword keyword-export">export</span> <span class="token keyword keyword-const">const</span> productsRouter <span class="token operator">=</span> <span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'/products'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1343
|
+
<span class="token comment">// ... definir rotas</span>
|
|
1344
|
+
|
|
1345
|
+
<span class="token comment">// app.ts</span>
|
|
1346
|
+
<span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> create <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1347
|
+
<span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> usersRouter <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'./routes/users.routes'</span><span class="token punctuation">;</span>
|
|
1348
|
+
<span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> productsRouter <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'./routes/products.routes'</span><span class="token punctuation">;</span>
|
|
1349
|
+
|
|
1350
|
+
<span class="token keyword keyword-const">const</span> app <span class="token operator">=</span> <span class="token function">express</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1351
|
+
<span class="token keyword keyword-const">const</span> router <span class="token operator">=</span> <span class="token function">create</span><span class="token punctuation">(</span>app<span class="token punctuation">)</span>
|
|
1352
|
+
<span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>express<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1353
|
+
|
|
1354
|
+
router
|
|
1355
|
+
<span class="token punctuation">.</span><span class="token function">by</span><span class="token punctuation">(</span>usersRouter<span class="token punctuation">)</span>
|
|
1356
|
+
<span class="token punctuation">.</span><span class="token function">by</span><span class="token punctuation">(</span>productsRouter<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1357
|
+
</code></pre>
|
|
1358
|
+
<h2 id="-documentação-openapiswagger">📚 Documentação OpenAPI/Swagger </h2>
|
|
1359
|
+
<p>O módulo gera automaticamente documentação OpenAPI 3.0 compatível com Swagger UI.</p>
|
|
1360
|
+
<h3 id="configuração-completa">Configuração Completa </h3>
|
|
1361
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> create<span class="token punctuation">,</span> Middlewares <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1362
|
+
|
|
1363
|
+
<span class="token keyword keyword-const">const</span> app <span class="token operator">=</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">middleware</span><span class="token punctuation">(</span>Middlewares<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1364
|
+
|
|
1365
|
+
<span class="token comment">// Definir rotas com documentação</span>
|
|
1366
|
+
app
|
|
1367
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/users/:id'</span><span class="token punctuation">)</span>
|
|
1368
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1369
|
+
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> req<span class="token punctuation">.</span>params<span class="token punctuation">.</span>id<span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token string">'John Doe'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1370
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
1371
|
+
<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1372
|
+
summary<span class="token operator">:</span> <span class="token string">'Obter usuário'</span><span class="token punctuation">,</span>
|
|
1373
|
+
description<span class="token operator">:</span> <span class="token string">'Retorna um usuário pelo ID'</span><span class="token punctuation">,</span>
|
|
1374
|
+
tags<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'Users'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1375
|
+
params<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1376
|
+
id<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1377
|
+
description<span class="token operator">:</span> <span class="token string">'ID do usuário'</span><span class="token punctuation">,</span>
|
|
1378
|
+
type<span class="token operator">:</span> <span class="token string">'string'</span><span class="token punctuation">,</span>
|
|
1379
|
+
required<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
|
|
1380
|
+
example<span class="token operator">:</span> <span class="token string">'123'</span>
|
|
1381
|
+
<span class="token punctuation">}</span>
|
|
1382
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1383
|
+
responses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1384
|
+
<span class="token number">200</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1385
|
+
description<span class="token operator">:</span> <span class="token string">'Usuário encontrado'</span><span class="token punctuation">,</span>
|
|
1386
|
+
content<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1387
|
+
<span class="token string-property property">'application/json'</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1388
|
+
schema<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1389
|
+
type<span class="token operator">:</span> <span class="token string">'object'</span><span class="token punctuation">,</span>
|
|
1390
|
+
properties<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1391
|
+
id<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> <span class="token string">'string'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1392
|
+
name<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> <span class="token string">'string'</span> <span class="token punctuation">}</span>
|
|
1393
|
+
<span class="token punctuation">}</span>
|
|
1394
|
+
<span class="token punctuation">}</span>
|
|
1395
|
+
<span class="token punctuation">}</span>
|
|
1396
|
+
<span class="token punctuation">}</span>
|
|
1397
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1398
|
+
<span class="token number">404</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Usuário não encontrado'</span> <span class="token punctuation">}</span>
|
|
1399
|
+
<span class="token punctuation">}</span>
|
|
1400
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1401
|
+
|
|
1402
|
+
<span class="token comment">// Configurar Swagger</span>
|
|
1403
|
+
app<span class="token punctuation">.</span><span class="token function">defineSwagger</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
1404
|
+
openapi<span class="token operator">:</span> <span class="token string">'3.0.0'</span><span class="token punctuation">,</span>
|
|
1405
|
+
info<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1406
|
+
title<span class="token operator">:</span> <span class="token string">'API de Exemplo'</span><span class="token punctuation">,</span>
|
|
1407
|
+
version<span class="token operator">:</span> <span class="token string">'1.0.0'</span><span class="token punctuation">,</span>
|
|
1408
|
+
description<span class="token operator">:</span> <span class="token string">'Documentação automática gerada com @ismael1361/router'</span><span class="token punctuation">,</span>
|
|
1409
|
+
contact<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1410
|
+
name<span class="token operator">:</span> <span class="token string">'Suporte'</span><span class="token punctuation">,</span>
|
|
1411
|
+
email<span class="token operator">:</span> <span class="token string">'suporte@exemplo.com'</span>
|
|
1412
|
+
<span class="token punctuation">}</span>
|
|
1413
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1414
|
+
servers<span class="token operator">:</span> <span class="token punctuation">[</span>
|
|
1415
|
+
<span class="token punctuation">{</span>
|
|
1416
|
+
url<span class="token operator">:</span> <span class="token string">'http://localhost:3000'</span><span class="token punctuation">,</span>
|
|
1417
|
+
description<span class="token operator">:</span> <span class="token string">'Servidor de desenvolvimento'</span>
|
|
1418
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1419
|
+
<span class="token punctuation">{</span>
|
|
1420
|
+
url<span class="token operator">:</span> <span class="token string">'https://api.exemplo.com'</span><span class="token punctuation">,</span>
|
|
1421
|
+
description<span class="token operator">:</span> <span class="token string">'Servidor de produção'</span>
|
|
1422
|
+
<span class="token punctuation">}</span>
|
|
1423
|
+
<span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
1424
|
+
components<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1425
|
+
securitySchemes<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1426
|
+
bearerAuth<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1427
|
+
type<span class="token operator">:</span> <span class="token string">'http'</span><span class="token punctuation">,</span>
|
|
1428
|
+
scheme<span class="token operator">:</span> <span class="token string">'bearer'</span><span class="token punctuation">,</span>
|
|
1429
|
+
bearerFormat<span class="token operator">:</span> <span class="token string">'JWT'</span><span class="token punctuation">,</span>
|
|
1430
|
+
description<span class="token operator">:</span> <span class="token string">'Token JWT no formato Bearer'</span>
|
|
1431
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1432
|
+
apiKey<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1433
|
+
type<span class="token operator">:</span> <span class="token string">'apiKey'</span><span class="token punctuation">,</span>
|
|
1434
|
+
<span class="token keyword keyword-in">in</span><span class="token operator">:</span> <span class="token string">'header'</span><span class="token punctuation">,</span>
|
|
1435
|
+
name<span class="token operator">:</span> <span class="token string">'X-API-Key'</span>
|
|
1436
|
+
<span class="token punctuation">}</span>
|
|
1437
|
+
<span class="token punctuation">}</span>
|
|
1438
|
+
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1439
|
+
defaultResponses<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1440
|
+
<span class="token number">500</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Erro interno do servidor'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
1441
|
+
<span class="token number">429</span><span class="token operator">:</span> <span class="token punctuation">{</span> description<span class="token operator">:</span> <span class="token string">'Muitas requisições'</span> <span class="token punctuation">}</span>
|
|
1442
|
+
<span class="token punctuation">}</span>
|
|
1443
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1444
|
+
|
|
1445
|
+
app<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1446
|
+
<span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'🚀 Servidor: http://localhost:3000'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1447
|
+
<span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'📚 Docs-swagger: http://localhost:3000/docs/swagger'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1448
|
+
<span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'📚 Docs-redoc: http://localhost:3000/docs/redoc'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1449
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1450
|
+
</code></pre>
|
|
1451
|
+
<h2 id="-typescript">🔷 TypeScript </h2>
|
|
1452
|
+
<p>O módulo é totalmente tipado e oferece excelente suporte ao TypeScript.</p>
|
|
1453
|
+
<h3 id="tipos-personalizados">Tipos Personalizados </h3>
|
|
1454
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> Request<span class="token punctuation">,</span> Response <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1455
|
+
|
|
1456
|
+
<span class="token comment">// Estender Request</span>
|
|
1457
|
+
<span class="token keyword keyword-interface">interface</span> <span class="token class-name">CustomRequest</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">Request</span> <span class="token punctuation">{</span>
|
|
1458
|
+
user<span class="token operator">?</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
1459
|
+
id<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
|
|
1460
|
+
email<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
|
|
1461
|
+
roles<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
|
|
1462
|
+
<span class="token punctuation">}</span><span class="token punctuation">;</span>
|
|
1463
|
+
requestId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
|
|
1464
|
+
startTime<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
|
|
1465
|
+
<span class="token punctuation">}</span>
|
|
1466
|
+
|
|
1467
|
+
<span class="token comment">// Estender Response</span>
|
|
1468
|
+
<span class="token keyword keyword-interface">interface</span> <span class="token class-name">CustomResponse</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">Response</span> <span class="token punctuation">{</span>
|
|
1469
|
+
<span class="token function-variable function">sendSuccess</span><span class="token operator">:</span> <span class="token punctuation">(</span>data<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword keyword-void">void</span><span class="token punctuation">;</span>
|
|
1470
|
+
<span class="token function-variable function">sendError</span><span class="token operator">:</span> <span class="token punctuation">(</span>message<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> code<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword keyword-void">void</span><span class="token punctuation">;</span>
|
|
1471
|
+
<span class="token punctuation">}</span>
|
|
1472
|
+
|
|
1473
|
+
<span class="token comment">// Usar tipos personalizados</span>
|
|
1474
|
+
<span class="token keyword keyword-const">const</span> router <span class="token operator">=</span> <span class="token generic-function"><span class="token function">create</span><span class="token generic class-name"><span class="token operator"><</span>CustomRequest<span class="token punctuation">,</span> CustomResponse<span class="token operator">></span></span></span><span class="token punctuation">(</span>app<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1475
|
+
|
|
1476
|
+
router
|
|
1477
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/profile'</span><span class="token punctuation">)</span>
|
|
1478
|
+
<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1479
|
+
<span class="token comment">// req.user está totalmente tipado</span>
|
|
1480
|
+
<span class="token comment">// res.sendSuccess está disponível</span>
|
|
1481
|
+
res<span class="token punctuation">.</span><span class="token function">sendSuccess</span><span class="token punctuation">(</span><span class="token punctuation">{</span> user<span class="token operator">:</span> req<span class="token punctuation">.</span>user <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1482
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1483
|
+
</code></pre>
|
|
1484
|
+
<h3 id="inferência-de-tipos">Inferência de Tipos </h3>
|
|
1485
|
+
<pre data-role="codeBlock" data-info="typescript" class="language-typescript typescript"><code><span class="token keyword keyword-import">import</span> <span class="token punctuation">{</span> Request <span class="token punctuation">}</span> <span class="token keyword keyword-from">from</span> <span class="token string">'@ismael1361/router'</span><span class="token punctuation">;</span>
|
|
1486
|
+
|
|
1487
|
+
<span class="token comment">// Os tipos são inferidos automaticamente</span>
|
|
1488
|
+
router
|
|
1489
|
+
<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/users/:id'</span><span class="token punctuation">)</span>
|
|
1490
|
+
<span class="token punctuation">.</span><span class="token generic-function"><span class="token function">handle</span><span class="token generic class-name"><span class="token operator"><</span>Request<span class="token operator"><</span><span class="token builtin">any</span><span class="token punctuation">,</span> <span class="token builtin">any</span><span class="token punctuation">,</span> <span class="token string">"id"</span><span class="token operator">>></span></span></span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
|
|
1491
|
+
<span class="token comment">// req.params é Record<"id", any></span>
|
|
1492
|
+
<span class="token comment">// req.params.id é any</span>
|
|
1493
|
+
<span class="token comment">// req.query é Record<string, any></span>
|
|
1494
|
+
<span class="token comment">// req.body é any (pode ser tipado com middleware)</span>
|
|
1495
|
+
<span class="token keyword keyword-const">const</span> userId<span class="token operator">:</span> <span class="token builtin">string</span> <span class="token operator">=</span> req<span class="token punctuation">.</span>params<span class="token punctuation">.</span>id<span class="token punctuation">;</span>
|
|
1496
|
+
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
1497
|
+
</code></pre>
|
|
1498
|
+
<h2 id="-contribuindo">🤝 Contribuindo </h2>
|
|
1499
|
+
<p>Contribuições são bem-vindas! Por favor, siga estas etapas:</p>
|
|
1500
|
+
<ol>
|
|
1501
|
+
<li>Faça um fork do projeto</li>
|
|
1502
|
+
<li>Crie uma branch para sua feature (<code>git checkout -b feature/MinhaFeature</code>)</li>
|
|
1503
|
+
<li>Commit suas mudanças (<code>git commit -m 'Adiciona MinhaFeature'</code>)</li>
|
|
1504
|
+
<li>Push para a branch (<code>git push origin feature/MinhaFeature</code>)</li>
|
|
1505
|
+
<li>Abra um Pull Request</li>
|
|
1506
|
+
</ol>
|
|
1507
|
+
<h2 id="-licença">📄 Licença </h2>
|
|
1508
|
+
<p>Este projeto está sob a licença MIT. Veja o arquivo <a href="MIT">LICENSE</a> para mais detalhes.</p>
|
|
1509
|
+
<h2 id="-agradecimentos">🙏 Agradecimentos </h2>
|
|
1510
|
+
<ul>
|
|
1511
|
+
<li>Express.js pela base sólida</li>
|
|
1512
|
+
<li>Swagger/OpenAPI pela especificação de documentação</li>
|
|
1513
|
+
<li>A comunidade TypeScript</li>
|
|
1514
|
+
</ul>
|
|
1515
|
+
<hr>
|
|
1516
|
+
<p>Desenvolvido com ❤️ por <a href="https://github.com/ismael1361">Ismael Souza Silva</a></p>
|
|
1517
|
+
|
|
1518
|
+
</div>
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
|
|
1528
|
+
</body>
|
|
1529
|
+
|
|
1530
|
+
</html>
|