@leo-h/create-nodejs-app 1.0.12 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json.js +1 -1
- package/package.json +1 -1
- package/templates/clean/build.config.ts +1 -0
- package/templates/fastify/build.config.ts +1 -0
- package/templates/fastify/package.json +3 -1
- package/templates/fastify/pnpm-lock.yaml +107 -0
- package/templates/nest/package.json +3 -2
- package/templates/nest/pnpm-lock.yaml +144 -18
- package/templates/nest/src/core/errors/validation.error.ts +12 -0
- package/templates/nest/src/infra/http/errors/filters/all-exception.filter.ts +31 -0
- package/templates/nest/src/infra/http/errors/filters/domain-exception.filter.ts +39 -0
- package/templates/nest/src/infra/http/errors/internal-server.error.ts +15 -0
- package/templates/nest/src/infra/http/http.module.ts +4 -4
- package/templates/nest/src/infra/http/middlewares/zod-schema-pipe.ts +24 -11
- package/templates/nest/src/infra/http/middlewares/zod-validation-pipe.ts +4 -4
- package/templates/nest/src/infra/presenters/error.presenter.ts +2 -1
- package/templates/nest/src/core/errors/errors.ts +0 -9
- package/templates/nest/src/infra/http/filters/domain-exception.filter.ts +0 -53
- package/templates/nest/src/infra/http/filters/http-exception.filter.ts +0 -26
package/dist/package.json.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});const name="@leo-h/create-nodejs-app",version="1.0.
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0});const name="@leo-h/create-nodejs-app",version="1.0.13",packageManager="pnpm@9.1.1",author="Leonardo Henrique <leonardo0507.business@gmail.com>",description="Create a modern Node.js app with TypeScript using one command.",license="MIT",keywords=["node","node.js","typescript"],bin={"create-nodejs-app":"./dist/index.js"},files=["./dist","./templates"],repository={type:"git",url:"https://github.com/Leo-Henrique/create-nodejs-app"},scripts={prepare:"husky",start:"node ./dist/index.js","start:dev":"tsx ./src/index.ts","start:dev:watch":"tsx watch ./src/index.ts",typecheck:"tsc --noEmit",lint:"eslint . --ext .ts --max-warnings 0 --cache","lint:fix":"pnpm lint --fix",format:"prettier . --write --cache","test:unit":"vitest run","test:unit:watch":"vitest","test:e2e":"vitest run --config ./vitest.config.e2e.mts","test:e2e:watch":"vitest --config ./vitest.config.e2e.mts","test:coverage":"vitest run --coverage.enabled=true",template:"tsx ./scripts/template-cli.ts",prebuild:"rimraf ./dist",build:"unbuild",prepublishOnly:"pnpm build"},dependencies={commander:"12.1.0",picocolors:"1.0.1",prompts:"2.4.2","validate-npm-package-name":"5.0.1",zod:"3.23.8"},devDependencies={"@faker-js/faker":"8.4.1","@types/node":"20.12.12","@types/prompts":"2.4.9","@types/validate-npm-package-name":"4.0.2","@typescript-eslint/eslint-plugin":"7.10.0","@typescript-eslint/parser":"7.10.0","conventional-changelog-conventionalcommits":"8.0.0",eslint:"8.57.0","eslint-config-prettier":"9.1.0","eslint-plugin-vitest":"0.4.0",husky:"9.0.11","lint-staged":"15.2.2","npm-run-all":"4.1.5",prettier:"3.2.5",rimraf:"5.0.7",tsx:"4.10.5",typescript:"5.4.5",unbuild:"2.0.0","vite-tsconfig-paths":"4.3.2",vitest:"1.6.0"},d={name,version,packageManager,author,description,license,keywords,bin,files,repository,scripts,dependencies,devDependencies};exports.author=author;exports.bin=bin;exports.default=d;exports.dependencies=dependencies;exports.description=description;exports.devDependencies=devDependencies;exports.files=files;exports.keywords=keywords;exports.license=license;exports.name=name;exports.packageManager=packageManager;exports.repository=repository;exports.scripts=scripts;exports.version=version;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@leo-h/create-nodejs-app",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.13",
|
4
4
|
"packageManager": "pnpm@9.1.1",
|
5
5
|
"author": "Leonardo Henrique <leonardo0507.business@gmail.com>",
|
6
6
|
"description": "Create a modern Node.js app with TypeScript using one command.",
|
@@ -12,9 +12,10 @@
|
|
12
12
|
"format": "prettier . --write --cache",
|
13
13
|
"test:unit": "vitest run",
|
14
14
|
"test:unit:watch": "vitest",
|
15
|
+
"test:unit:coverage": "vitest run --coverage.enabled=true",
|
15
16
|
"test:e2e": "vitest run --config ./vitest.config.e2e.mts",
|
16
17
|
"test:e2e:watch": "vitest --config ./vitest.config.e2e.mts",
|
17
|
-
"test:coverage": "vitest run --coverage.enabled=true",
|
18
|
+
"test:e2e:coverage": "vitest run --config ./vitest.config.e2e.mts --coverage.enabled=true",
|
18
19
|
"prebuild": "rimraf ./dist",
|
19
20
|
"build": "unbuild"
|
20
21
|
},
|
@@ -39,6 +40,7 @@
|
|
39
40
|
"@types/supertest": "6.0.2",
|
40
41
|
"@typescript-eslint/eslint-plugin": "7.10.0",
|
41
42
|
"@typescript-eslint/parser": "7.10.0",
|
43
|
+
"@vitest/coverage-v8": "1.6.0",
|
42
44
|
"eslint": "8.57.0",
|
43
45
|
"eslint-config-prettier": "9.1.0",
|
44
46
|
"eslint-plugin-vitest": "0.4.0",
|
@@ -63,6 +63,9 @@ importers:
|
|
63
63
|
'@typescript-eslint/parser':
|
64
64
|
specifier: 7.10.0
|
65
65
|
version: 7.10.0(eslint@8.57.0)(typescript@5.4.5)
|
66
|
+
'@vitest/coverage-v8':
|
67
|
+
specifier: 1.6.0
|
68
|
+
version: 1.6.0(vitest@1.6.0(@types/node@20.12.12))
|
66
69
|
eslint:
|
67
70
|
specifier: 8.57.0
|
68
71
|
version: 8.57.0
|
@@ -203,6 +206,9 @@ packages:
|
|
203
206
|
resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
|
204
207
|
engines: {node: '>=6.9.0'}
|
205
208
|
|
209
|
+
'@bcoe/v8-coverage@0.2.3':
|
210
|
+
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
211
|
+
|
206
212
|
'@esbuild/aix-ppc64@0.19.12':
|
207
213
|
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
|
208
214
|
engines: {node: '>=12'}
|
@@ -556,6 +562,10 @@ packages:
|
|
556
562
|
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
557
563
|
engines: {node: '>=12'}
|
558
564
|
|
565
|
+
'@istanbuljs/schema@0.1.3':
|
566
|
+
resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
|
567
|
+
engines: {node: '>=8'}
|
568
|
+
|
559
569
|
'@jest/schemas@29.6.3':
|
560
570
|
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
|
561
571
|
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
@@ -855,6 +865,11 @@ packages:
|
|
855
865
|
'@ungap/structured-clone@1.2.0':
|
856
866
|
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
|
857
867
|
|
868
|
+
'@vitest/coverage-v8@1.6.0':
|
869
|
+
resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==}
|
870
|
+
peerDependencies:
|
871
|
+
vitest: 1.6.0
|
872
|
+
|
858
873
|
'@vitest/expect@1.6.0':
|
859
874
|
resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==}
|
860
875
|
|
@@ -1591,6 +1606,9 @@ packages:
|
|
1591
1606
|
hookable@5.5.3:
|
1592
1607
|
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
|
1593
1608
|
|
1609
|
+
html-escaper@2.0.2:
|
1610
|
+
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
|
1611
|
+
|
1594
1612
|
http-errors@2.0.0:
|
1595
1613
|
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
1596
1614
|
engines: {node: '>= 0.8'}
|
@@ -1678,6 +1696,22 @@ packages:
|
|
1678
1696
|
isexe@2.0.0:
|
1679
1697
|
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
1680
1698
|
|
1699
|
+
istanbul-lib-coverage@3.2.2:
|
1700
|
+
resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
|
1701
|
+
engines: {node: '>=8'}
|
1702
|
+
|
1703
|
+
istanbul-lib-report@3.0.1:
|
1704
|
+
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
|
1705
|
+
engines: {node: '>=10'}
|
1706
|
+
|
1707
|
+
istanbul-lib-source-maps@5.0.6:
|
1708
|
+
resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
|
1709
|
+
engines: {node: '>=10'}
|
1710
|
+
|
1711
|
+
istanbul-reports@3.1.7:
|
1712
|
+
resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
|
1713
|
+
engines: {node: '>=8'}
|
1714
|
+
|
1681
1715
|
jackspeak@3.4.0:
|
1682
1716
|
resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
|
1683
1717
|
engines: {node: '>=14'}
|
@@ -1785,6 +1819,13 @@ packages:
|
|
1785
1819
|
magic-string@0.30.10:
|
1786
1820
|
resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
|
1787
1821
|
|
1822
|
+
magicast@0.3.4:
|
1823
|
+
resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
|
1824
|
+
|
1825
|
+
make-dir@4.0.0:
|
1826
|
+
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
|
1827
|
+
engines: {node: '>=10'}
|
1828
|
+
|
1788
1829
|
mdn-data@2.0.28:
|
1789
1830
|
resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
|
1790
1831
|
|
@@ -2483,6 +2524,10 @@ packages:
|
|
2483
2524
|
engines: {node: '>=14.0.0'}
|
2484
2525
|
hasBin: true
|
2485
2526
|
|
2527
|
+
test-exclude@6.0.0:
|
2528
|
+
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
|
2529
|
+
engines: {node: '>=8'}
|
2530
|
+
|
2486
2531
|
text-decoding@1.0.0:
|
2487
2532
|
resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==}
|
2488
2533
|
|
@@ -2878,6 +2923,8 @@ snapshots:
|
|
2878
2923
|
'@babel/helper-validator-identifier': 7.24.7
|
2879
2924
|
to-fast-properties: 2.0.0
|
2880
2925
|
|
2926
|
+
'@bcoe/v8-coverage@0.2.3': {}
|
2927
|
+
|
2881
2928
|
'@esbuild/aix-ppc64@0.19.12':
|
2882
2929
|
optional: true
|
2883
2930
|
|
@@ -3129,6 +3176,8 @@ snapshots:
|
|
3129
3176
|
wrap-ansi: 8.1.0
|
3130
3177
|
wrap-ansi-cjs: wrap-ansi@7.0.0
|
3131
3178
|
|
3179
|
+
'@istanbuljs/schema@0.1.3': {}
|
3180
|
+
|
3132
3181
|
'@jest/schemas@29.6.3':
|
3133
3182
|
dependencies:
|
3134
3183
|
'@sinclair/typebox': 0.27.8
|
@@ -3416,6 +3465,25 @@ snapshots:
|
|
3416
3465
|
|
3417
3466
|
'@ungap/structured-clone@1.2.0': {}
|
3418
3467
|
|
3468
|
+
'@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.12))':
|
3469
|
+
dependencies:
|
3470
|
+
'@ampproject/remapping': 2.3.0
|
3471
|
+
'@bcoe/v8-coverage': 0.2.3
|
3472
|
+
debug: 4.3.5
|
3473
|
+
istanbul-lib-coverage: 3.2.2
|
3474
|
+
istanbul-lib-report: 3.0.1
|
3475
|
+
istanbul-lib-source-maps: 5.0.6
|
3476
|
+
istanbul-reports: 3.1.7
|
3477
|
+
magic-string: 0.30.10
|
3478
|
+
magicast: 0.3.4
|
3479
|
+
picocolors: 1.0.1
|
3480
|
+
std-env: 3.7.0
|
3481
|
+
strip-literal: 2.1.0
|
3482
|
+
test-exclude: 6.0.0
|
3483
|
+
vitest: 1.6.0(@types/node@20.12.12)
|
3484
|
+
transitivePeerDependencies:
|
3485
|
+
- supports-color
|
3486
|
+
|
3419
3487
|
'@vitest/expect@1.6.0':
|
3420
3488
|
dependencies:
|
3421
3489
|
'@vitest/spy': 1.6.0
|
@@ -4263,6 +4331,8 @@ snapshots:
|
|
4263
4331
|
|
4264
4332
|
hookable@5.5.3: {}
|
4265
4333
|
|
4334
|
+
html-escaper@2.0.2: {}
|
4335
|
+
|
4266
4336
|
http-errors@2.0.0:
|
4267
4337
|
dependencies:
|
4268
4338
|
depd: 2.0.0
|
@@ -4331,6 +4401,27 @@ snapshots:
|
|
4331
4401
|
|
4332
4402
|
isexe@2.0.0: {}
|
4333
4403
|
|
4404
|
+
istanbul-lib-coverage@3.2.2: {}
|
4405
|
+
|
4406
|
+
istanbul-lib-report@3.0.1:
|
4407
|
+
dependencies:
|
4408
|
+
istanbul-lib-coverage: 3.2.2
|
4409
|
+
make-dir: 4.0.0
|
4410
|
+
supports-color: 7.2.0
|
4411
|
+
|
4412
|
+
istanbul-lib-source-maps@5.0.6:
|
4413
|
+
dependencies:
|
4414
|
+
'@jridgewell/trace-mapping': 0.3.25
|
4415
|
+
debug: 4.3.5
|
4416
|
+
istanbul-lib-coverage: 3.2.2
|
4417
|
+
transitivePeerDependencies:
|
4418
|
+
- supports-color
|
4419
|
+
|
4420
|
+
istanbul-reports@3.1.7:
|
4421
|
+
dependencies:
|
4422
|
+
html-escaper: 2.0.2
|
4423
|
+
istanbul-lib-report: 3.0.1
|
4424
|
+
|
4334
4425
|
jackspeak@3.4.0:
|
4335
4426
|
dependencies:
|
4336
4427
|
'@isaacs/cliui': 8.0.2
|
@@ -4455,6 +4546,16 @@ snapshots:
|
|
4455
4546
|
dependencies:
|
4456
4547
|
'@jridgewell/sourcemap-codec': 1.4.15
|
4457
4548
|
|
4549
|
+
magicast@0.3.4:
|
4550
|
+
dependencies:
|
4551
|
+
'@babel/parser': 7.24.7
|
4552
|
+
'@babel/types': 7.24.7
|
4553
|
+
source-map-js: 1.2.0
|
4554
|
+
|
4555
|
+
make-dir@4.0.0:
|
4556
|
+
dependencies:
|
4557
|
+
semver: 7.6.2
|
4558
|
+
|
4458
4559
|
mdn-data@2.0.28: {}
|
4459
4560
|
|
4460
4561
|
mdn-data@2.0.30: {}
|
@@ -5108,6 +5209,12 @@ snapshots:
|
|
5108
5209
|
csso: 5.0.5
|
5109
5210
|
picocolors: 1.0.1
|
5110
5211
|
|
5212
|
+
test-exclude@6.0.0:
|
5213
|
+
dependencies:
|
5214
|
+
'@istanbuljs/schema': 0.1.3
|
5215
|
+
glob: 7.2.3
|
5216
|
+
minimatch: 3.1.2
|
5217
|
+
|
5111
5218
|
text-decoding@1.0.0: {}
|
5112
5219
|
|
5113
5220
|
text-table@0.2.0: {}
|
@@ -12,13 +12,13 @@
|
|
12
12
|
"format": "prettier . --write --cache",
|
13
13
|
"test:unit": "vitest run",
|
14
14
|
"test:unit:watch": "vitest",
|
15
|
+
"test:unit:coverage": "vitest run --coverage.enabled=true",
|
15
16
|
"test:e2e": "vitest run --config ./vitest.config.e2e.mts",
|
16
17
|
"test:e2e:watch": "vitest --config ./vitest.config.e2e.mts",
|
17
|
-
"test:coverage": "vitest run --coverage.enabled=true",
|
18
|
+
"test:e2e:coverage": "vitest run --config ./vitest.config.e2e.mts --coverage.enabled=true",
|
18
19
|
"build": "nest build"
|
19
20
|
},
|
20
21
|
"dependencies": {
|
21
|
-
"@anatine/zod-nestjs": "2.0.9",
|
22
22
|
"@anatine/zod-openapi": "2.2.6",
|
23
23
|
"@fastify/static": "7.0.4",
|
24
24
|
"@nestjs/common": "10.3.10",
|
@@ -44,6 +44,7 @@
|
|
44
44
|
"@types/supertest": "6.0.2",
|
45
45
|
"@typescript-eslint/eslint-plugin": "7.10.0",
|
46
46
|
"@typescript-eslint/parser": "7.10.0",
|
47
|
+
"@vitest/coverage-v8": "1.6.0",
|
47
48
|
"eslint": "8.57.0",
|
48
49
|
"eslint-config-prettier": "9.1.0",
|
49
50
|
"eslint-plugin-vitest": "0.4.0",
|
@@ -8,9 +8,6 @@ importers:
|
|
8
8
|
|
9
9
|
.:
|
10
10
|
dependencies:
|
11
|
-
'@anatine/zod-nestjs':
|
12
|
-
specifier: 2.0.9
|
13
|
-
version: 2.0.9(@anatine/zod-openapi@2.2.6(openapi3-ts@4.3.3)(zod@3.23.8))(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/swagger@7.4.0(@fastify/static@7.0.4)(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2))(openapi3-ts@4.3.3)(zod@3.23.8)
|
14
11
|
'@anatine/zod-openapi':
|
15
12
|
specifier: 2.2.6
|
16
13
|
version: 2.2.6(openapi3-ts@4.3.3)(zod@3.23.8)
|
@@ -81,6 +78,9 @@ importers:
|
|
81
78
|
'@typescript-eslint/parser':
|
82
79
|
specifier: 7.10.0
|
83
80
|
version: 7.10.0(eslint@8.57.0)(typescript@5.4.5)
|
81
|
+
'@vitest/coverage-v8':
|
82
|
+
specifier: 1.6.0
|
83
|
+
version: 1.6.0(vitest@1.6.0(@types/node@20.12.12)(terser@5.31.3))
|
84
84
|
eslint:
|
85
85
|
specifier: 8.57.0
|
86
86
|
version: 8.57.0
|
@@ -117,14 +117,9 @@ importers:
|
|
117
117
|
|
118
118
|
packages:
|
119
119
|
|
120
|
-
'@
|
121
|
-
resolution: {integrity: sha512-
|
122
|
-
|
123
|
-
'@anatine/zod-openapi': ^2.0.1
|
124
|
-
'@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0
|
125
|
-
'@nestjs/swagger': ^6.0.0 || ^7.0.0
|
126
|
-
openapi3-ts: ^4.1.2
|
127
|
-
zod: ^3.20.0
|
120
|
+
'@ampproject/remapping@2.3.0':
|
121
|
+
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
|
122
|
+
engines: {node: '>=6.0.0'}
|
128
123
|
|
129
124
|
'@anatine/zod-openapi@2.2.6':
|
130
125
|
resolution: {integrity: sha512-Z5sr2Nq2xifEpPbPdUcvyl776LY652oR3VHMV++WFSmRrRL8RDP2XTkbuGn+vgfVNOD7UrndYwCWnxaiw7IZog==}
|
@@ -154,6 +149,10 @@ packages:
|
|
154
149
|
resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
|
155
150
|
engines: {node: '>=6.9.0'}
|
156
151
|
|
152
|
+
'@babel/helper-string-parser@7.24.8':
|
153
|
+
resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
|
154
|
+
engines: {node: '>=6.9.0'}
|
155
|
+
|
157
156
|
'@babel/helper-validator-identifier@7.24.7':
|
158
157
|
resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
|
159
158
|
engines: {node: '>=6.9.0'}
|
@@ -162,6 +161,18 @@ packages:
|
|
162
161
|
resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
|
163
162
|
engines: {node: '>=6.9.0'}
|
164
163
|
|
164
|
+
'@babel/parser@7.25.4':
|
165
|
+
resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==}
|
166
|
+
engines: {node: '>=6.0.0'}
|
167
|
+
hasBin: true
|
168
|
+
|
169
|
+
'@babel/types@7.25.4':
|
170
|
+
resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==}
|
171
|
+
engines: {node: '>=6.9.0'}
|
172
|
+
|
173
|
+
'@bcoe/v8-coverage@0.2.3':
|
174
|
+
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
175
|
+
|
165
176
|
'@colors/colors@1.5.0':
|
166
177
|
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
|
167
178
|
engines: {node: '>=0.1.90'}
|
@@ -378,6 +389,10 @@ packages:
|
|
378
389
|
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
379
390
|
engines: {node: '>=12'}
|
380
391
|
|
392
|
+
'@istanbuljs/schema@0.1.3':
|
393
|
+
resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
|
394
|
+
engines: {node: '>=8'}
|
395
|
+
|
381
396
|
'@jest/schemas@29.6.3':
|
382
397
|
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
|
383
398
|
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
@@ -872,6 +887,11 @@ packages:
|
|
872
887
|
'@ungap/structured-clone@1.2.0':
|
873
888
|
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
|
874
889
|
|
890
|
+
'@vitest/coverage-v8@1.6.0':
|
891
|
+
resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==}
|
892
|
+
peerDependencies:
|
893
|
+
vitest: 1.6.0
|
894
|
+
|
875
895
|
'@vitest/expect@1.6.0':
|
876
896
|
resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==}
|
877
897
|
|
@@ -1823,6 +1843,9 @@ packages:
|
|
1823
1843
|
resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==}
|
1824
1844
|
engines: {node: '>=8'}
|
1825
1845
|
|
1846
|
+
html-escaper@2.0.2:
|
1847
|
+
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
|
1848
|
+
|
1826
1849
|
http-cache-semantics@4.1.1:
|
1827
1850
|
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
|
1828
1851
|
|
@@ -1950,6 +1973,22 @@ packages:
|
|
1950
1973
|
isexe@2.0.0:
|
1951
1974
|
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
1952
1975
|
|
1976
|
+
istanbul-lib-coverage@3.2.2:
|
1977
|
+
resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
|
1978
|
+
engines: {node: '>=8'}
|
1979
|
+
|
1980
|
+
istanbul-lib-report@3.0.1:
|
1981
|
+
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
|
1982
|
+
engines: {node: '>=10'}
|
1983
|
+
|
1984
|
+
istanbul-lib-source-maps@5.0.6:
|
1985
|
+
resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
|
1986
|
+
engines: {node: '>=10'}
|
1987
|
+
|
1988
|
+
istanbul-reports@3.1.7:
|
1989
|
+
resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
|
1990
|
+
engines: {node: '>=8'}
|
1991
|
+
|
1953
1992
|
iterare@1.2.1:
|
1954
1993
|
resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==}
|
1955
1994
|
engines: {node: '>=6'}
|
@@ -2079,6 +2118,13 @@ packages:
|
|
2079
2118
|
resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
|
2080
2119
|
engines: {node: '>=12'}
|
2081
2120
|
|
2121
|
+
magicast@0.3.4:
|
2122
|
+
resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
|
2123
|
+
|
2124
|
+
make-dir@4.0.0:
|
2125
|
+
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
|
2126
|
+
engines: {node: '>=10'}
|
2127
|
+
|
2082
2128
|
media-typer@0.3.0:
|
2083
2129
|
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
|
2084
2130
|
engines: {node: '>= 0.6'}
|
@@ -2863,6 +2909,10 @@ packages:
|
|
2863
2909
|
engines: {node: '>=10'}
|
2864
2910
|
hasBin: true
|
2865
2911
|
|
2912
|
+
test-exclude@6.0.0:
|
2913
|
+
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
|
2914
|
+
engines: {node: '>=8'}
|
2915
|
+
|
2866
2916
|
text-decoding@1.0.0:
|
2867
2917
|
resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==}
|
2868
2918
|
|
@@ -2890,6 +2940,10 @@ packages:
|
|
2890
2940
|
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
|
2891
2941
|
engines: {node: '>=0.6.0'}
|
2892
2942
|
|
2943
|
+
to-fast-properties@2.0.0:
|
2944
|
+
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
|
2945
|
+
engines: {node: '>=4'}
|
2946
|
+
|
2893
2947
|
to-regex-range@5.0.1:
|
2894
2948
|
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
2895
2949
|
engines: {node: '>=8.0'}
|
@@ -3185,14 +3239,10 @@ packages:
|
|
3185
3239
|
|
3186
3240
|
snapshots:
|
3187
3241
|
|
3188
|
-
'@
|
3242
|
+
'@ampproject/remapping@2.3.0':
|
3189
3243
|
dependencies:
|
3190
|
-
'@
|
3191
|
-
'@
|
3192
|
-
'@nestjs/swagger': 7.4.0(@fastify/static@7.0.4)(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)
|
3193
|
-
openapi3-ts: 4.3.3
|
3194
|
-
ts-deepmerge: 6.2.1
|
3195
|
-
zod: 3.23.8
|
3244
|
+
'@jridgewell/gen-mapping': 0.3.5
|
3245
|
+
'@jridgewell/trace-mapping': 0.3.25
|
3196
3246
|
|
3197
3247
|
'@anatine/zod-openapi@2.2.6(openapi3-ts@4.3.3)(zod@3.23.8)':
|
3198
3248
|
dependencies:
|
@@ -3237,6 +3287,8 @@ snapshots:
|
|
3237
3287
|
'@babel/highlight': 7.24.7
|
3238
3288
|
picocolors: 1.0.1
|
3239
3289
|
|
3290
|
+
'@babel/helper-string-parser@7.24.8': {}
|
3291
|
+
|
3240
3292
|
'@babel/helper-validator-identifier@7.24.7': {}
|
3241
3293
|
|
3242
3294
|
'@babel/highlight@7.24.7':
|
@@ -3246,6 +3298,18 @@ snapshots:
|
|
3246
3298
|
js-tokens: 4.0.0
|
3247
3299
|
picocolors: 1.0.1
|
3248
3300
|
|
3301
|
+
'@babel/parser@7.25.4':
|
3302
|
+
dependencies:
|
3303
|
+
'@babel/types': 7.25.4
|
3304
|
+
|
3305
|
+
'@babel/types@7.25.4':
|
3306
|
+
dependencies:
|
3307
|
+
'@babel/helper-string-parser': 7.24.8
|
3308
|
+
'@babel/helper-validator-identifier': 7.24.7
|
3309
|
+
to-fast-properties: 2.0.0
|
3310
|
+
|
3311
|
+
'@bcoe/v8-coverage@0.2.3': {}
|
3312
|
+
|
3249
3313
|
'@colors/colors@1.5.0':
|
3250
3314
|
optional: true
|
3251
3315
|
|
@@ -3420,6 +3484,8 @@ snapshots:
|
|
3420
3484
|
wrap-ansi: 8.1.0
|
3421
3485
|
wrap-ansi-cjs: wrap-ansi@7.0.0
|
3422
3486
|
|
3487
|
+
'@istanbuljs/schema@0.1.3': {}
|
3488
|
+
|
3423
3489
|
'@jest/schemas@29.6.3':
|
3424
3490
|
dependencies:
|
3425
3491
|
'@sinclair/typebox': 0.27.8
|
@@ -3926,6 +3992,25 @@ snapshots:
|
|
3926
3992
|
|
3927
3993
|
'@ungap/structured-clone@1.2.0': {}
|
3928
3994
|
|
3995
|
+
'@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.12)(terser@5.31.3))':
|
3996
|
+
dependencies:
|
3997
|
+
'@ampproject/remapping': 2.3.0
|
3998
|
+
'@bcoe/v8-coverage': 0.2.3
|
3999
|
+
debug: 4.3.5
|
4000
|
+
istanbul-lib-coverage: 3.2.2
|
4001
|
+
istanbul-lib-report: 3.0.1
|
4002
|
+
istanbul-lib-source-maps: 5.0.6
|
4003
|
+
istanbul-reports: 3.1.7
|
4004
|
+
magic-string: 0.30.10
|
4005
|
+
magicast: 0.3.4
|
4006
|
+
picocolors: 1.0.1
|
4007
|
+
std-env: 3.7.0
|
4008
|
+
strip-literal: 2.1.0
|
4009
|
+
test-exclude: 6.0.0
|
4010
|
+
vitest: 1.6.0(@types/node@20.12.12)(terser@5.31.3)
|
4011
|
+
transitivePeerDependencies:
|
4012
|
+
- supports-color
|
4013
|
+
|
3929
4014
|
'@vitest/expect@1.6.0':
|
3930
4015
|
dependencies:
|
3931
4016
|
'@vitest/spy': 1.6.0
|
@@ -5057,6 +5142,8 @@ snapshots:
|
|
5057
5142
|
|
5058
5143
|
hexoid@1.0.0: {}
|
5059
5144
|
|
5145
|
+
html-escaper@2.0.2: {}
|
5146
|
+
|
5060
5147
|
http-cache-semantics@4.1.1: {}
|
5061
5148
|
|
5062
5149
|
http-errors@2.0.0:
|
@@ -5179,6 +5266,27 @@ snapshots:
|
|
5179
5266
|
|
5180
5267
|
isexe@2.0.0: {}
|
5181
5268
|
|
5269
|
+
istanbul-lib-coverage@3.2.2: {}
|
5270
|
+
|
5271
|
+
istanbul-lib-report@3.0.1:
|
5272
|
+
dependencies:
|
5273
|
+
istanbul-lib-coverage: 3.2.2
|
5274
|
+
make-dir: 4.0.0
|
5275
|
+
supports-color: 7.2.0
|
5276
|
+
|
5277
|
+
istanbul-lib-source-maps@5.0.6:
|
5278
|
+
dependencies:
|
5279
|
+
'@jridgewell/trace-mapping': 0.3.25
|
5280
|
+
debug: 4.3.5
|
5281
|
+
istanbul-lib-coverage: 3.2.2
|
5282
|
+
transitivePeerDependencies:
|
5283
|
+
- supports-color
|
5284
|
+
|
5285
|
+
istanbul-reports@3.1.7:
|
5286
|
+
dependencies:
|
5287
|
+
html-escaper: 2.0.2
|
5288
|
+
istanbul-lib-report: 3.0.1
|
5289
|
+
|
5182
5290
|
iterare@1.2.1: {}
|
5183
5291
|
|
5184
5292
|
jackspeak@3.4.3:
|
@@ -5321,6 +5429,16 @@ snapshots:
|
|
5321
5429
|
dependencies:
|
5322
5430
|
'@jridgewell/sourcemap-codec': 1.5.0
|
5323
5431
|
|
5432
|
+
magicast@0.3.4:
|
5433
|
+
dependencies:
|
5434
|
+
'@babel/parser': 7.25.4
|
5435
|
+
'@babel/types': 7.25.4
|
5436
|
+
source-map-js: 1.2.0
|
5437
|
+
|
5438
|
+
make-dir@4.0.0:
|
5439
|
+
dependencies:
|
5440
|
+
semver: 7.6.3
|
5441
|
+
|
5324
5442
|
media-typer@0.3.0: {}
|
5325
5443
|
|
5326
5444
|
memfs@3.5.3:
|
@@ -6070,6 +6188,12 @@ snapshots:
|
|
6070
6188
|
commander: 2.20.3
|
6071
6189
|
source-map-support: 0.5.21
|
6072
6190
|
|
6191
|
+
test-exclude@6.0.0:
|
6192
|
+
dependencies:
|
6193
|
+
'@istanbuljs/schema': 0.1.3
|
6194
|
+
glob: 7.2.3
|
6195
|
+
minimatch: 3.1.2
|
6196
|
+
|
6073
6197
|
text-decoding@1.0.0: {}
|
6074
6198
|
|
6075
6199
|
text-table@0.2.0: {}
|
@@ -6090,6 +6214,8 @@ snapshots:
|
|
6090
6214
|
dependencies:
|
6091
6215
|
os-tmpdir: 1.0.2
|
6092
6216
|
|
6217
|
+
to-fast-properties@2.0.0: {}
|
6218
|
+
|
6093
6219
|
to-regex-range@5.0.1:
|
6094
6220
|
dependencies:
|
6095
6221
|
is-number: 7.0.0
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { DomainError } from "./domain-error";
|
2
|
+
|
3
|
+
export class ValidationError extends DomainError {
|
4
|
+
public error = "ValidationError" as const;
|
5
|
+
public debug: object | null;
|
6
|
+
|
7
|
+
constructor(debug?: object) {
|
8
|
+
super("Os dados recebidos são inválidos.");
|
9
|
+
|
10
|
+
this.debug = debug ?? null;
|
11
|
+
}
|
12
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import {
|
2
|
+
ArgumentsHost,
|
3
|
+
Catch,
|
4
|
+
ExceptionFilter,
|
5
|
+
HttpException,
|
6
|
+
} from "@nestjs/common";
|
7
|
+
import { FastifyReply } from "fastify";
|
8
|
+
import { InternalServerError } from "../internal-server.error";
|
9
|
+
|
10
|
+
@Catch()
|
11
|
+
export class AllExceptionFilter implements ExceptionFilter {
|
12
|
+
catch(exception: unknown, host: ArgumentsHost): void {
|
13
|
+
const ctx = host.switchToHttp();
|
14
|
+
const response = ctx.getResponse<FastifyReply>();
|
15
|
+
|
16
|
+
const debug =
|
17
|
+
exception && typeof exception === "object" && "message" in exception
|
18
|
+
? exception.message
|
19
|
+
: null;
|
20
|
+
|
21
|
+
let httpException: HttpException = new InternalServerError(debug);
|
22
|
+
|
23
|
+
if (exception instanceof HttpException) httpException = exception;
|
24
|
+
|
25
|
+
console.error(exception);
|
26
|
+
|
27
|
+
response
|
28
|
+
.status(httpException.getStatus())
|
29
|
+
.send(httpException.getResponse());
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { DomainError } from "@/core/errors/domain-error";
|
2
|
+
import { ValidationError } from "@/core/errors/validation.error";
|
3
|
+
import { ErrorPresenter } from "@/infra/presenters/error.presenter";
|
4
|
+
import {
|
5
|
+
ArgumentsHost,
|
6
|
+
BadRequestException,
|
7
|
+
Catch,
|
8
|
+
ExceptionFilter,
|
9
|
+
HttpException,
|
10
|
+
} from "@nestjs/common";
|
11
|
+
import { FastifyReply } from "fastify";
|
12
|
+
import { InternalServerError } from "../internal-server.error";
|
13
|
+
|
14
|
+
@Catch(DomainError)
|
15
|
+
export class DomainExceptionFilter implements ExceptionFilter {
|
16
|
+
catch(exception: DomainError, host: ArgumentsHost): void {
|
17
|
+
const ctx = host.switchToHttp();
|
18
|
+
const response = ctx.getResponse<FastifyReply>();
|
19
|
+
|
20
|
+
let httpException: HttpException;
|
21
|
+
|
22
|
+
switch (exception.constructor) {
|
23
|
+
case ValidationError:
|
24
|
+
httpException = new BadRequestException(
|
25
|
+
ErrorPresenter.toHttp(400, exception),
|
26
|
+
);
|
27
|
+
break;
|
28
|
+
|
29
|
+
default:
|
30
|
+
httpException = new InternalServerError(exception.message);
|
31
|
+
}
|
32
|
+
|
33
|
+
console.error(exception);
|
34
|
+
|
35
|
+
response
|
36
|
+
.status(httpException.getStatus())
|
37
|
+
.send(httpException.getResponse());
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { ErrorPresenter } from "@/infra/presenters/error.presenter";
|
2
|
+
import { HttpException } from "@nestjs/common";
|
3
|
+
|
4
|
+
export class InternalServerError extends HttpException {
|
5
|
+
constructor(debug: unknown) {
|
6
|
+
const statusCode = 500;
|
7
|
+
const presenter = ErrorPresenter.toHttp(statusCode, {
|
8
|
+
error: "InternalServerError",
|
9
|
+
message: "Desculpe, um erro inesperado ocorreu.",
|
10
|
+
debug,
|
11
|
+
});
|
12
|
+
|
13
|
+
super(presenter, statusCode);
|
14
|
+
}
|
15
|
+
}
|
@@ -2,20 +2,20 @@ import { Module } from "@nestjs/common";
|
|
2
2
|
import { APP_FILTER } from "@nestjs/core";
|
3
3
|
import { HelloMultipartController } from "./controllers/hello/hello-multipart.controller";
|
4
4
|
import { HelloController } from "./controllers/hello/hello.controller";
|
5
|
+
import { AllExceptionFilter } from "./errors/filters/all-exception.filter";
|
6
|
+
import { DomainExceptionFilter } from "./errors/filters/domain-exception.filter";
|
5
7
|
import { FastifyMulterEventModule } from "./events/fastify-multer.event.module";
|
6
|
-
import { DomainExceptionFilter } from "./filters/domain-exception.filter";
|
7
|
-
import { HttpExceptionFilter } from "./filters/http-exception.filter";
|
8
8
|
|
9
9
|
@Module({
|
10
10
|
imports: [FastifyMulterEventModule],
|
11
11
|
providers: [
|
12
12
|
{
|
13
13
|
provide: APP_FILTER,
|
14
|
-
useClass:
|
14
|
+
useClass: AllExceptionFilter,
|
15
15
|
},
|
16
16
|
{
|
17
17
|
provide: APP_FILTER,
|
18
|
-
useClass:
|
18
|
+
useClass: DomainExceptionFilter,
|
19
19
|
},
|
20
20
|
],
|
21
21
|
controllers: [HelloController, HelloMultipartController],
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import {
|
2
|
-
import { extendApi, generateSchema } from "@anatine/zod-openapi";
|
1
|
+
import { generateSchema } from "@anatine/zod-openapi";
|
3
2
|
import { UsePipes, applyDecorators } from "@nestjs/common";
|
4
3
|
import { ZodType } from "zod";
|
5
4
|
import {
|
@@ -15,10 +14,6 @@ export function zodSchemaToSwaggerSchema(schema: ZodType) {
|
|
15
14
|
return generateSchema(schema, false, "3.0") as SchemaObject;
|
16
15
|
}
|
17
16
|
|
18
|
-
export function zodSchemaToNestDto(schema: ZodType) {
|
19
|
-
return class Dto extends createZodDto(extendApi(schema)) {};
|
20
|
-
}
|
21
|
-
|
22
17
|
interface ZodSchemaPipeParams extends ZodValidationPipeSchemas {
|
23
18
|
isMultipart?: boolean;
|
24
19
|
response?: ZodType | Record<number, ZodType>;
|
@@ -38,17 +33,35 @@ export function ZodSchemaPipe({
|
|
38
33
|
const apiDecorators: NestSwaggerDecorator[] = [];
|
39
34
|
|
40
35
|
if (routeParams) {
|
41
|
-
|
42
|
-
|
43
|
-
)
|
36
|
+
const routeParamsSchema = zodSchemaToSwaggerSchema(routeParams);
|
37
|
+
|
38
|
+
for (const paramName in routeParams.shape) {
|
39
|
+
apiDecorators.push(
|
40
|
+
ApiParam({
|
41
|
+
name: paramName,
|
42
|
+
schema: zodSchemaToSwaggerSchema(routeParams.shape[paramName]),
|
43
|
+
required: routeParamsSchema.required?.includes(paramName) ?? false,
|
44
|
+
}),
|
45
|
+
);
|
46
|
+
}
|
44
47
|
}
|
45
48
|
|
46
49
|
if (queryParams) {
|
47
|
-
|
50
|
+
const queryParamsSchema = zodSchemaToSwaggerSchema(queryParams);
|
51
|
+
|
52
|
+
for (const paramName in queryParams.shape) {
|
53
|
+
apiDecorators.push(
|
54
|
+
ApiQuery({
|
55
|
+
name: paramName,
|
56
|
+
schema: zodSchemaToSwaggerSchema(queryParams.shape[paramName]),
|
57
|
+
required: queryParamsSchema.required?.includes(paramName) ?? false,
|
58
|
+
}),
|
59
|
+
);
|
60
|
+
}
|
48
61
|
}
|
49
62
|
|
50
63
|
if (body && !isMultipart) {
|
51
|
-
apiDecorators.push(ApiBody({
|
64
|
+
apiDecorators.push(ApiBody({ schema: zodSchemaToSwaggerSchema(body) }));
|
52
65
|
}
|
53
66
|
|
54
67
|
if (response) {
|
@@ -1,10 +1,10 @@
|
|
1
|
-
import { ValidationError } from "@/core/errors/
|
1
|
+
import { ValidationError } from "@/core/errors/validation.error";
|
2
2
|
import { ArgumentMetadata, PipeTransform } from "@nestjs/common";
|
3
|
-
import { ZodError, ZodType } from "zod";
|
3
|
+
import { ZodError, ZodObject, ZodRawShape, ZodType } from "zod";
|
4
4
|
|
5
5
|
export interface ZodValidationPipeSchemas {
|
6
|
-
routeParams?:
|
7
|
-
queryParams?:
|
6
|
+
routeParams?: ZodObject<ZodRawShape>;
|
7
|
+
queryParams?: ZodObject<ZodRawShape>;
|
8
8
|
body?: ZodType;
|
9
9
|
}
|
10
10
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { DomainError } from "@/core/errors/domain-error";
|
2
|
+
import { env } from "../env";
|
2
3
|
|
3
4
|
type CustomError = Pick<DomainError, "error" | "message" | "debug">;
|
4
5
|
|
@@ -8,7 +9,7 @@ export class ErrorPresenter {
|
|
8
9
|
error: error.error,
|
9
10
|
message: error.message,
|
10
11
|
statusCode,
|
11
|
-
debug: error.debug,
|
12
|
+
debug: env.NODE_ENV !== "production" ? error.debug : null,
|
12
13
|
};
|
13
14
|
}
|
14
15
|
}
|
@@ -1,53 +0,0 @@
|
|
1
|
-
import { DomainError } from "@/core/errors/domain-error";
|
2
|
-
import { ValidationError } from "@/core/errors/errors";
|
3
|
-
import { env } from "@/infra/env";
|
4
|
-
import { ErrorPresenter } from "@/infra/presenters/error.presenter";
|
5
|
-
import {
|
6
|
-
ArgumentsHost,
|
7
|
-
BadRequestException,
|
8
|
-
Catch,
|
9
|
-
ExceptionFilter,
|
10
|
-
HttpException,
|
11
|
-
HttpStatus,
|
12
|
-
InternalServerErrorException,
|
13
|
-
} from "@nestjs/common";
|
14
|
-
import { FastifyReply } from "fastify";
|
15
|
-
|
16
|
-
@Catch(DomainError)
|
17
|
-
export class DomainExceptionFilter implements ExceptionFilter {
|
18
|
-
catch(exception: DomainError, host: ArgumentsHost): void {
|
19
|
-
const ctx = host.switchToHttp();
|
20
|
-
const response = ctx.getResponse<FastifyReply>();
|
21
|
-
|
22
|
-
let httpException: HttpException;
|
23
|
-
|
24
|
-
switch (exception.constructor) {
|
25
|
-
case ValidationError:
|
26
|
-
httpException = new BadRequestException(
|
27
|
-
ErrorPresenter.toHttp(HttpStatus.BAD_REQUEST, exception),
|
28
|
-
);
|
29
|
-
break;
|
30
|
-
|
31
|
-
default:
|
32
|
-
httpException = new InternalServerErrorException(
|
33
|
-
ErrorPresenter.toHttp(HttpStatus.INTERNAL_SERVER_ERROR, {
|
34
|
-
error: "InternalServerError",
|
35
|
-
message: "Desculpe, um erro inesperado ocorreu.",
|
36
|
-
debug: exception.message,
|
37
|
-
}),
|
38
|
-
);
|
39
|
-
break;
|
40
|
-
}
|
41
|
-
|
42
|
-
const httpResponse = httpException.getResponse();
|
43
|
-
|
44
|
-
if (
|
45
|
-
env.NODE_ENV === "production" &&
|
46
|
-
typeof httpResponse === "object" &&
|
47
|
-
"debug" in httpResponse
|
48
|
-
)
|
49
|
-
delete httpResponse.debug;
|
50
|
-
|
51
|
-
response.status(httpException.getStatus()).send(httpResponse);
|
52
|
-
}
|
53
|
-
}
|
@@ -1,26 +0,0 @@
|
|
1
|
-
import { env } from "@/infra/env";
|
2
|
-
import {
|
3
|
-
ArgumentsHost,
|
4
|
-
Catch,
|
5
|
-
ExceptionFilter,
|
6
|
-
HttpException,
|
7
|
-
} from "@nestjs/common";
|
8
|
-
import { FastifyReply } from "fastify";
|
9
|
-
|
10
|
-
@Catch(HttpException)
|
11
|
-
export class HttpExceptionFilter implements ExceptionFilter {
|
12
|
-
catch(httpException: HttpException, host: ArgumentsHost): void {
|
13
|
-
const ctx = host.switchToHttp();
|
14
|
-
const response = ctx.getResponse<FastifyReply>();
|
15
|
-
const httpResponse = httpException.getResponse();
|
16
|
-
|
17
|
-
if (
|
18
|
-
env.NODE_ENV === "production" &&
|
19
|
-
typeof httpResponse === "object" &&
|
20
|
-
"debug" in httpResponse
|
21
|
-
)
|
22
|
-
delete httpResponse.debug;
|
23
|
-
|
24
|
-
response.status(httpException.getStatus()).send(httpResponse);
|
25
|
-
}
|
26
|
-
}
|