@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 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">=&gt;</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">=&gt;</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">&lt;</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">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Router<span class="token operator">&lt;</span>Req<span class="token punctuation">,</span> Res<span class="token operator">&gt;</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">&lt;</span>CustomRequest<span class="token operator">&gt;</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">&lt;</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">&gt;</span></span></span><span class="token punctuation">(</span>
967
+ callback<span class="token operator">:</span> MiddlewareFC<span class="token operator">&lt;</span>Req<span class="token punctuation">,</span> Res<span class="token operator">&gt;</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">&lt;</span>Req<span class="token punctuation">,</span> Res<span class="token operator">&gt;</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">&lt;</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">&gt;</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">&lt;</span>AuthRequest<span class="token operator">&gt;</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">=&gt;</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">=&gt;</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">&lt;</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">&gt;</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">&lt;</span>Req<span class="token punctuation">,</span> Res<span class="token operator">&gt;</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">=&gt;</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">=&gt;</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">&lt;</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">&lt;</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">&gt;</span><span class="token punctuation">;</span>
1077
+ <span class="token punctuation">}</span><span class="token operator">&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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 -&gt; /doc/swagger/definition.json</span>
1208
+ <span class="token comment">// By swagger -&gt; /doc/swagger</span>
1209
+ <span class="token comment">// By redoc -&gt; /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">&lt;</span>AuthRequest<span class="token operator">&gt;</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">=&gt;</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">=&gt;</span>
1242
+ <span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator">&lt;</span>AuthRequest<span class="token operator">&gt;</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">=&gt;</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">=&gt;</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">&lt;</span>AuthRequest<span class="token operator">&gt;</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">=&gt;</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">=&gt;</span>
1285
+ <span class="token generic-function"><span class="token function">middleware</span><span class="token generic class-name"><span class="token operator">&lt;</span>ValidatedRequest<span class="token operator">&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">=&gt;</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">&lt;</span>CustomRequest<span class="token punctuation">,</span> CustomResponse<span class="token operator">&gt;</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">=&gt;</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">&lt;</span>Request<span class="token operator">&lt;</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">&gt;&gt;</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">=&gt;</span> <span class="token punctuation">{</span>
1491
+ <span class="token comment">// req.params é Record&lt;"id", any&gt;</span>
1492
+ <span class="token comment">// req.params.id é any</span>
1493
+ <span class="token comment">// req.query é Record&lt;string, any&gt;</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>