Trần Viết Sơn commited on
Commit
3cd6d2a
2 Parent(s): 22c310d ff6fe69

Merge pull request #7 from PBL6-team-CATS/feature/login

Browse files
backend/.env.example CHANGED
@@ -2,4 +2,5 @@ DB_HOST=dpg-cs6i9ll6l47c73ffheh0-a
2
  DB_PORT=5432
3
  DB_USER='pbl6_jw8s_user'
4
  DB_PASSWORD=''
5
- DB_NAME='pbl6_jw8s'
 
 
2
  DB_PORT=5432
3
  DB_USER='pbl6_jw8s_user'
4
  DB_PASSWORD=''
5
+ DB_NAME='pbl6_jw8s'
6
+ JWT_KEY = ''
backend/package-lock.json CHANGED
@@ -12,9 +12,12 @@
12
  "@nestjs/common": "^10.0.0",
13
  "@nestjs/config": "^3.2.3",
14
  "@nestjs/core": "^10.0.0",
 
15
  "@nestjs/mapped-types": "*",
16
  "@nestjs/platform-express": "^10.0.0",
17
  "@nestjs/typeorm": "^10.0.2",
 
 
18
  "dotenv": "^16.4.5",
19
  "mysql2": "^3.11.3",
20
  "nest-access-control": "^3.1.0",
@@ -1555,6 +1558,50 @@
1555
  "node": ">=8"
1556
  }
1557
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1558
  "node_modules/@nestjs/cli": {
1559
  "version": "10.4.5",
1560
  "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.5.tgz",
@@ -1692,6 +1739,19 @@
1692
  }
1693
  }
1694
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
1695
  "node_modules/@nestjs/mapped-types": {
1696
  "version": "2.0.5",
1697
  "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz",
@@ -2073,6 +2133,15 @@
2073
  "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
2074
  "dev": true
2075
  },
 
 
 
 
 
 
 
 
 
2076
  "node_modules/@types/methods": {
2077
  "version": "1.1.4",
2078
  "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz",
@@ -2089,7 +2158,6 @@
2089
  "version": "20.16.5",
2090
  "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz",
2091
  "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==",
2092
- "devOptional": true,
2093
  "dependencies": {
2094
  "undici-types": "~6.19.2"
2095
  }
@@ -2155,6 +2223,12 @@
2155
  "@types/superagent": "^8.1.0"
2156
  }
2157
  },
 
 
 
 
 
 
2158
  "node_modules/@types/yargs": {
2159
  "version": "17.0.33",
2160
  "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
@@ -2516,6 +2590,12 @@
2516
  "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
2517
  "dev": true
2518
  },
 
 
 
 
 
 
2519
  "node_modules/accepts": {
2520
  "version": "1.3.8",
2521
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
@@ -2579,6 +2659,18 @@
2579
  "node": ">=0.4.0"
2580
  }
2581
  },
 
 
 
 
 
 
 
 
 
 
 
 
2582
  "node_modules/ajv": {
2583
  "version": "8.12.0",
2584
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
@@ -2713,6 +2805,40 @@
2713
  "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
2714
  "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
2715
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2716
  "node_modules/arg": {
2717
  "version": "4.1.3",
2718
  "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -2905,6 +3031,20 @@
2905
  }
2906
  ]
2907
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2908
  "node_modules/binary-extensions": {
2909
  "version": "2.3.0",
2910
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -3075,6 +3215,12 @@
3075
  "ieee754": "^1.1.13"
3076
  }
3077
  },
 
 
 
 
 
 
3078
  "node_modules/buffer-from": {
3079
  "version": "1.1.2",
3080
  "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -3209,6 +3355,15 @@
3209
  "fsevents": "~2.3.2"
3210
  }
3211
  },
 
 
 
 
 
 
 
 
 
3212
  "node_modules/chrome-trace-event": {
3213
  "version": "1.0.4",
3214
  "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
@@ -3239,6 +3394,17 @@
3239
  "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
3240
  "dev": true
3241
  },
 
 
 
 
 
 
 
 
 
 
 
3242
  "node_modules/cli-cursor": {
3243
  "version": "3.1.0",
3244
  "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -3428,6 +3594,15 @@
3428
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3429
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3430
  },
 
 
 
 
 
 
 
 
 
3431
  "node_modules/combined-stream": {
3432
  "version": "1.0.8",
3433
  "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -3477,8 +3652,7 @@
3477
  "node_modules/concat-map": {
3478
  "version": "0.0.1",
3479
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3480
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
3481
- "dev": true
3482
  },
3483
  "node_modules/concat-stream": {
3484
  "version": "1.6.2",
@@ -3499,6 +3673,12 @@
3499
  "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
3500
  "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
3501
  },
 
 
 
 
 
 
3502
  "node_modules/content-disposition": {
3503
  "version": "0.5.4",
3504
  "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -3713,6 +3893,12 @@
3713
  "node": ">=0.4.0"
3714
  }
3715
  },
 
 
 
 
 
 
3716
  "node_modules/denque": {
3717
  "version": "2.1.0",
3718
  "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
@@ -3738,6 +3924,15 @@
3738
  "npm": "1.2.8000 || >= 1.4.16"
3739
  }
3740
  },
 
 
 
 
 
 
 
 
 
3741
  "node_modules/detect-newline": {
3742
  "version": "3.1.0",
3743
  "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
@@ -3811,6 +4006,15 @@
3811
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
3812
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
3813
  },
 
 
 
 
 
 
 
 
 
3814
  "node_modules/ee-first": {
3815
  "version": "1.1.1",
3816
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -4652,6 +4856,36 @@
4652
  "node": ">=12"
4653
  }
4654
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4655
  "node_modules/fs-monkey": {
4656
  "version": "1.0.6",
4657
  "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
@@ -4661,8 +4895,7 @@
4661
  "node_modules/fs.realpath": {
4662
  "version": "1.0.0",
4663
  "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
4664
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
4665
- "dev": true
4666
  },
4667
  "node_modules/fsevents": {
4668
  "version": "2.3.3",
@@ -4686,6 +4919,33 @@
4686
  "url": "https://github.com/sponsors/ljharb"
4687
  }
4688
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4689
  "node_modules/generate-function": {
4690
  "version": "2.3.1",
4691
  "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -4878,6 +5138,12 @@
4878
  "url": "https://github.com/sponsors/ljharb"
4879
  }
4880
  },
 
 
 
 
 
 
4881
  "node_modules/hasown": {
4882
  "version": "2.0.2",
4883
  "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -4927,6 +5193,19 @@
4927
  "node": ">= 0.8"
4928
  }
4929
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
4930
  "node_modules/human-signals": {
4931
  "version": "2.1.0",
4932
  "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -5024,7 +5303,6 @@
5024
  "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
5025
  "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
5026
  "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
5027
- "dev": true,
5028
  "dependencies": {
5029
  "once": "^1.3.0",
5030
  "wrappy": "1"
@@ -6099,6 +6377,49 @@
6099
  "graceful-fs": "^4.1.6"
6100
  }
6101
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6102
  "node_modules/keyv": {
6103
  "version": "4.5.4",
6104
  "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -6139,6 +6460,12 @@
6139
  "node": ">= 0.8.0"
6140
  }
6141
  },
 
 
 
 
 
 
6142
  "node_modules/lines-and-columns": {
6143
  "version": "1.2.4",
6144
  "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -6174,6 +6501,42 @@
6174
  "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
6175
  "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
6176
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6177
  "node_modules/lodash.memoize": {
6178
  "version": "4.1.2",
6179
  "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -6186,6 +6549,12 @@
6186
  "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
6187
  "dev": true
6188
  },
 
 
 
 
 
 
6189
  "node_modules/log-symbols": {
6190
  "version": "4.1.0",
6191
  "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -6417,6 +6786,37 @@
6417
  "node": ">=16 || 14 >=14.17"
6418
  }
6419
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6420
  "node_modules/mkdirp": {
6421
  "version": "0.5.6",
6422
  "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -6559,6 +6959,12 @@
6559
  "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
6560
  "dev": true
6561
  },
 
 
 
 
 
 
6562
  "node_modules/node-emoji": {
6563
  "version": "1.11.0",
6564
  "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
@@ -6599,6 +7005,21 @@
6599
  "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
6600
  "dev": true
6601
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6602
  "node_modules/normalize-path": {
6603
  "version": "3.0.0",
6604
  "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -6626,6 +7047,19 @@
6626
  "node": ">=8"
6627
  }
6628
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
6629
  "node_modules/object-assign": {
6630
  "version": "4.1.1",
6631
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6660,7 +7094,6 @@
6660
  "version": "1.4.0",
6661
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
6662
  "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
6663
- "dev": true,
6664
  "dependencies": {
6665
  "wrappy": "1"
6666
  }
@@ -6842,7 +7275,6 @@
6842
  "version": "1.0.1",
6843
  "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
6844
  "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
6845
- "dev": true,
6846
  "engines": {
6847
  "node": ">=0.10.0"
6848
  }
@@ -7475,7 +7907,6 @@
7475
  "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
7476
  "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
7477
  "deprecated": "Rimraf versions prior to v4 are no longer supported",
7478
- "dev": true,
7479
  "dependencies": {
7480
  "glob": "^7.1.3"
7481
  },
@@ -7490,7 +7921,6 @@
7490
  "version": "1.1.11",
7491
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
7492
  "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
7493
- "dev": true,
7494
  "dependencies": {
7495
  "balanced-match": "^1.0.0",
7496
  "concat-map": "0.0.1"
@@ -7501,7 +7931,6 @@
7501
  "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
7502
  "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
7503
  "deprecated": "Glob versions prior to v9 are no longer supported",
7504
- "dev": true,
7505
  "dependencies": {
7506
  "fs.realpath": "^1.0.0",
7507
  "inflight": "^1.0.4",
@@ -7521,7 +7950,6 @@
7521
  "version": "3.1.2",
7522
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
7523
  "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
7524
- "dev": true,
7525
  "dependencies": {
7526
  "brace-expansion": "^1.1.7"
7527
  },
@@ -7646,7 +8074,6 @@
7646
  "version": "7.6.3",
7647
  "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
7648
  "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
7649
- "dev": true,
7650
  "bin": {
7651
  "semver": "bin/semver.js"
7652
  },
@@ -7726,6 +8153,12 @@
7726
  "node": ">= 0.8.0"
7727
  }
7728
  },
 
 
 
 
 
 
7729
  "node_modules/set-function-length": {
7730
  "version": "1.2.2",
7731
  "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
@@ -8117,6 +8550,50 @@
8117
  "node": ">=6"
8118
  }
8119
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8120
  "node_modules/terser": {
8121
  "version": "5.33.0",
8122
  "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz",
@@ -8738,8 +9215,7 @@
8738
  "node_modules/undici-types": {
8739
  "version": "6.19.8",
8740
  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
8741
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
8742
- "devOptional": true
8743
  },
8744
  "node_modules/universalify": {
8745
  "version": "2.0.1",
@@ -8842,6 +9318,15 @@
8842
  "node": ">=10.12.0"
8843
  }
8844
  },
 
 
 
 
 
 
 
 
 
8845
  "node_modules/vary": {
8846
  "version": "1.1.2",
8847
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -8995,6 +9480,15 @@
8995
  "node": ">= 8"
8996
  }
8997
  },
 
 
 
 
 
 
 
 
 
8998
  "node_modules/word-wrap": {
8999
  "version": "1.2.5",
9000
  "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
@@ -9038,8 +9532,7 @@
9038
  "node_modules/wrappy": {
9039
  "version": "1.0.2",
9040
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
9041
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
9042
- "dev": true
9043
  },
9044
  "node_modules/write-file-atomic": {
9045
  "version": "4.0.2",
 
12
  "@nestjs/common": "^10.0.0",
13
  "@nestjs/config": "^3.2.3",
14
  "@nestjs/core": "^10.0.0",
15
+ "@nestjs/jwt": "^10.2.0",
16
  "@nestjs/mapped-types": "*",
17
  "@nestjs/platform-express": "^10.0.0",
18
  "@nestjs/typeorm": "^10.0.2",
19
+ "bcrypt": "^5.1.1",
20
+ "class-validator": "^0.14.1",
21
  "dotenv": "^16.4.5",
22
  "mysql2": "^3.11.3",
23
  "nest-access-control": "^3.1.0",
 
1558
  "node": ">=8"
1559
  }
1560
  },
1561
+ "node_modules/@mapbox/node-pre-gyp": {
1562
+ "version": "1.0.11",
1563
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
1564
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
1565
+ "license": "BSD-3-Clause",
1566
+ "dependencies": {
1567
+ "detect-libc": "^2.0.0",
1568
+ "https-proxy-agent": "^5.0.0",
1569
+ "make-dir": "^3.1.0",
1570
+ "node-fetch": "^2.6.7",
1571
+ "nopt": "^5.0.0",
1572
+ "npmlog": "^5.0.1",
1573
+ "rimraf": "^3.0.2",
1574
+ "semver": "^7.3.5",
1575
+ "tar": "^6.1.11"
1576
+ },
1577
+ "bin": {
1578
+ "node-pre-gyp": "bin/node-pre-gyp"
1579
+ }
1580
+ },
1581
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": {
1582
+ "version": "3.1.0",
1583
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1584
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1585
+ "license": "MIT",
1586
+ "dependencies": {
1587
+ "semver": "^6.0.0"
1588
+ },
1589
+ "engines": {
1590
+ "node": ">=8"
1591
+ },
1592
+ "funding": {
1593
+ "url": "https://github.com/sponsors/sindresorhus"
1594
+ }
1595
+ },
1596
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": {
1597
+ "version": "6.3.1",
1598
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1599
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1600
+ "license": "ISC",
1601
+ "bin": {
1602
+ "semver": "bin/semver.js"
1603
+ }
1604
+ },
1605
  "node_modules/@nestjs/cli": {
1606
  "version": "10.4.5",
1607
  "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.5.tgz",
 
1739
  }
1740
  }
1741
  },
1742
+ "node_modules/@nestjs/jwt": {
1743
+ "version": "10.2.0",
1744
+ "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.2.0.tgz",
1745
+ "integrity": "sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==",
1746
+ "license": "MIT",
1747
+ "dependencies": {
1748
+ "@types/jsonwebtoken": "9.0.5",
1749
+ "jsonwebtoken": "9.0.2"
1750
+ },
1751
+ "peerDependencies": {
1752
+ "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0"
1753
+ }
1754
+ },
1755
  "node_modules/@nestjs/mapped-types": {
1756
  "version": "2.0.5",
1757
  "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz",
 
2133
  "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
2134
  "dev": true
2135
  },
2136
+ "node_modules/@types/jsonwebtoken": {
2137
+ "version": "9.0.5",
2138
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz",
2139
+ "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==",
2140
+ "license": "MIT",
2141
+ "dependencies": {
2142
+ "@types/node": "*"
2143
+ }
2144
+ },
2145
  "node_modules/@types/methods": {
2146
  "version": "1.1.4",
2147
  "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz",
 
2158
  "version": "20.16.5",
2159
  "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz",
2160
  "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==",
 
2161
  "dependencies": {
2162
  "undici-types": "~6.19.2"
2163
  }
 
2223
  "@types/superagent": "^8.1.0"
2224
  }
2225
  },
2226
+ "node_modules/@types/validator": {
2227
+ "version": "13.12.2",
2228
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz",
2229
+ "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==",
2230
+ "license": "MIT"
2231
+ },
2232
  "node_modules/@types/yargs": {
2233
  "version": "17.0.33",
2234
  "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
 
2590
  "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
2591
  "dev": true
2592
  },
2593
+ "node_modules/abbrev": {
2594
+ "version": "1.1.1",
2595
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
2596
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
2597
+ "license": "ISC"
2598
+ },
2599
  "node_modules/accepts": {
2600
  "version": "1.3.8",
2601
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
 
2659
  "node": ">=0.4.0"
2660
  }
2661
  },
2662
+ "node_modules/agent-base": {
2663
+ "version": "6.0.2",
2664
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
2665
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
2666
+ "license": "MIT",
2667
+ "dependencies": {
2668
+ "debug": "4"
2669
+ },
2670
+ "engines": {
2671
+ "node": ">= 6.0.0"
2672
+ }
2673
+ },
2674
  "node_modules/ajv": {
2675
  "version": "8.12.0",
2676
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
 
2805
  "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
2806
  "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
2807
  },
2808
+ "node_modules/aproba": {
2809
+ "version": "2.0.0",
2810
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
2811
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
2812
+ "license": "ISC"
2813
+ },
2814
+ "node_modules/are-we-there-yet": {
2815
+ "version": "2.0.0",
2816
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
2817
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
2818
+ "deprecated": "This package is no longer supported.",
2819
+ "license": "ISC",
2820
+ "dependencies": {
2821
+ "delegates": "^1.0.0",
2822
+ "readable-stream": "^3.6.0"
2823
+ },
2824
+ "engines": {
2825
+ "node": ">=10"
2826
+ }
2827
+ },
2828
+ "node_modules/are-we-there-yet/node_modules/readable-stream": {
2829
+ "version": "3.6.2",
2830
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
2831
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
2832
+ "license": "MIT",
2833
+ "dependencies": {
2834
+ "inherits": "^2.0.3",
2835
+ "string_decoder": "^1.1.1",
2836
+ "util-deprecate": "^1.0.1"
2837
+ },
2838
+ "engines": {
2839
+ "node": ">= 6"
2840
+ }
2841
+ },
2842
  "node_modules/arg": {
2843
  "version": "4.1.3",
2844
  "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
 
3031
  }
3032
  ]
3033
  },
3034
+ "node_modules/bcrypt": {
3035
+ "version": "5.1.1",
3036
+ "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
3037
+ "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
3038
+ "hasInstallScript": true,
3039
+ "license": "MIT",
3040
+ "dependencies": {
3041
+ "@mapbox/node-pre-gyp": "^1.0.11",
3042
+ "node-addon-api": "^5.0.0"
3043
+ },
3044
+ "engines": {
3045
+ "node": ">= 10.0.0"
3046
+ }
3047
+ },
3048
  "node_modules/binary-extensions": {
3049
  "version": "2.3.0",
3050
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
 
3215
  "ieee754": "^1.1.13"
3216
  }
3217
  },
3218
+ "node_modules/buffer-equal-constant-time": {
3219
+ "version": "1.0.1",
3220
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
3221
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
3222
+ "license": "BSD-3-Clause"
3223
+ },
3224
  "node_modules/buffer-from": {
3225
  "version": "1.1.2",
3226
  "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
 
3355
  "fsevents": "~2.3.2"
3356
  }
3357
  },
3358
+ "node_modules/chownr": {
3359
+ "version": "2.0.0",
3360
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
3361
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
3362
+ "license": "ISC",
3363
+ "engines": {
3364
+ "node": ">=10"
3365
+ }
3366
+ },
3367
  "node_modules/chrome-trace-event": {
3368
  "version": "1.0.4",
3369
  "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
 
3394
  "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
3395
  "dev": true
3396
  },
3397
+ "node_modules/class-validator": {
3398
+ "version": "0.14.1",
3399
+ "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz",
3400
+ "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==",
3401
+ "license": "MIT",
3402
+ "dependencies": {
3403
+ "@types/validator": "^13.11.8",
3404
+ "libphonenumber-js": "^1.10.53",
3405
+ "validator": "^13.9.0"
3406
+ }
3407
+ },
3408
  "node_modules/cli-cursor": {
3409
  "version": "3.1.0",
3410
  "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
 
3594
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3595
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3596
  },
3597
+ "node_modules/color-support": {
3598
+ "version": "1.1.3",
3599
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
3600
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
3601
+ "license": "ISC",
3602
+ "bin": {
3603
+ "color-support": "bin.js"
3604
+ }
3605
+ },
3606
  "node_modules/combined-stream": {
3607
  "version": "1.0.8",
3608
  "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 
3652
  "node_modules/concat-map": {
3653
  "version": "0.0.1",
3654
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3655
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
 
3656
  },
3657
  "node_modules/concat-stream": {
3658
  "version": "1.6.2",
 
3673
  "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
3674
  "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
3675
  },
3676
+ "node_modules/console-control-strings": {
3677
+ "version": "1.1.0",
3678
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
3679
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
3680
+ "license": "ISC"
3681
+ },
3682
  "node_modules/content-disposition": {
3683
  "version": "0.5.4",
3684
  "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 
3893
  "node": ">=0.4.0"
3894
  }
3895
  },
3896
+ "node_modules/delegates": {
3897
+ "version": "1.0.0",
3898
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
3899
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
3900
+ "license": "MIT"
3901
+ },
3902
  "node_modules/denque": {
3903
  "version": "2.1.0",
3904
  "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
 
3924
  "npm": "1.2.8000 || >= 1.4.16"
3925
  }
3926
  },
3927
+ "node_modules/detect-libc": {
3928
+ "version": "2.0.3",
3929
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
3930
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
3931
+ "license": "Apache-2.0",
3932
+ "engines": {
3933
+ "node": ">=8"
3934
+ }
3935
+ },
3936
  "node_modules/detect-newline": {
3937
  "version": "3.1.0",
3938
  "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
 
4006
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
4007
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
4008
  },
4009
+ "node_modules/ecdsa-sig-formatter": {
4010
+ "version": "1.0.11",
4011
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
4012
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
4013
+ "license": "Apache-2.0",
4014
+ "dependencies": {
4015
+ "safe-buffer": "^5.0.1"
4016
+ }
4017
+ },
4018
  "node_modules/ee-first": {
4019
  "version": "1.1.1",
4020
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 
4856
  "node": ">=12"
4857
  }
4858
  },
4859
+ "node_modules/fs-minipass": {
4860
+ "version": "2.1.0",
4861
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
4862
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
4863
+ "license": "ISC",
4864
+ "dependencies": {
4865
+ "minipass": "^3.0.0"
4866
+ },
4867
+ "engines": {
4868
+ "node": ">= 8"
4869
+ }
4870
+ },
4871
+ "node_modules/fs-minipass/node_modules/minipass": {
4872
+ "version": "3.3.6",
4873
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
4874
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
4875
+ "license": "ISC",
4876
+ "dependencies": {
4877
+ "yallist": "^4.0.0"
4878
+ },
4879
+ "engines": {
4880
+ "node": ">=8"
4881
+ }
4882
+ },
4883
+ "node_modules/fs-minipass/node_modules/yallist": {
4884
+ "version": "4.0.0",
4885
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
4886
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
4887
+ "license": "ISC"
4888
+ },
4889
  "node_modules/fs-monkey": {
4890
  "version": "1.0.6",
4891
  "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
 
4895
  "node_modules/fs.realpath": {
4896
  "version": "1.0.0",
4897
  "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
4898
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
 
4899
  },
4900
  "node_modules/fsevents": {
4901
  "version": "2.3.3",
 
4919
  "url": "https://github.com/sponsors/ljharb"
4920
  }
4921
  },
4922
+ "node_modules/gauge": {
4923
+ "version": "3.0.2",
4924
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
4925
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
4926
+ "deprecated": "This package is no longer supported.",
4927
+ "license": "ISC",
4928
+ "dependencies": {
4929
+ "aproba": "^1.0.3 || ^2.0.0",
4930
+ "color-support": "^1.1.2",
4931
+ "console-control-strings": "^1.0.0",
4932
+ "has-unicode": "^2.0.1",
4933
+ "object-assign": "^4.1.1",
4934
+ "signal-exit": "^3.0.0",
4935
+ "string-width": "^4.2.3",
4936
+ "strip-ansi": "^6.0.1",
4937
+ "wide-align": "^1.1.2"
4938
+ },
4939
+ "engines": {
4940
+ "node": ">=10"
4941
+ }
4942
+ },
4943
+ "node_modules/gauge/node_modules/signal-exit": {
4944
+ "version": "3.0.7",
4945
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
4946
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
4947
+ "license": "ISC"
4948
+ },
4949
  "node_modules/generate-function": {
4950
  "version": "2.3.1",
4951
  "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
 
5138
  "url": "https://github.com/sponsors/ljharb"
5139
  }
5140
  },
5141
+ "node_modules/has-unicode": {
5142
+ "version": "2.0.1",
5143
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
5144
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
5145
+ "license": "ISC"
5146
+ },
5147
  "node_modules/hasown": {
5148
  "version": "2.0.2",
5149
  "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 
5193
  "node": ">= 0.8"
5194
  }
5195
  },
5196
+ "node_modules/https-proxy-agent": {
5197
+ "version": "5.0.1",
5198
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
5199
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
5200
+ "license": "MIT",
5201
+ "dependencies": {
5202
+ "agent-base": "6",
5203
+ "debug": "4"
5204
+ },
5205
+ "engines": {
5206
+ "node": ">= 6"
5207
+ }
5208
+ },
5209
  "node_modules/human-signals": {
5210
  "version": "2.1.0",
5211
  "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
 
5303
  "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
5304
  "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
5305
  "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
 
5306
  "dependencies": {
5307
  "once": "^1.3.0",
5308
  "wrappy": "1"
 
6377
  "graceful-fs": "^4.1.6"
6378
  }
6379
  },
6380
+ "node_modules/jsonwebtoken": {
6381
+ "version": "9.0.2",
6382
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
6383
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
6384
+ "license": "MIT",
6385
+ "dependencies": {
6386
+ "jws": "^3.2.2",
6387
+ "lodash.includes": "^4.3.0",
6388
+ "lodash.isboolean": "^3.0.3",
6389
+ "lodash.isinteger": "^4.0.4",
6390
+ "lodash.isnumber": "^3.0.3",
6391
+ "lodash.isplainobject": "^4.0.6",
6392
+ "lodash.isstring": "^4.0.1",
6393
+ "lodash.once": "^4.0.0",
6394
+ "ms": "^2.1.1",
6395
+ "semver": "^7.5.4"
6396
+ },
6397
+ "engines": {
6398
+ "node": ">=12",
6399
+ "npm": ">=6"
6400
+ }
6401
+ },
6402
+ "node_modules/jwa": {
6403
+ "version": "1.4.1",
6404
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
6405
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
6406
+ "license": "MIT",
6407
+ "dependencies": {
6408
+ "buffer-equal-constant-time": "1.0.1",
6409
+ "ecdsa-sig-formatter": "1.0.11",
6410
+ "safe-buffer": "^5.0.1"
6411
+ }
6412
+ },
6413
+ "node_modules/jws": {
6414
+ "version": "3.2.2",
6415
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
6416
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
6417
+ "license": "MIT",
6418
+ "dependencies": {
6419
+ "jwa": "^1.4.1",
6420
+ "safe-buffer": "^5.0.1"
6421
+ }
6422
+ },
6423
  "node_modules/keyv": {
6424
  "version": "4.5.4",
6425
  "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
 
6460
  "node": ">= 0.8.0"
6461
  }
6462
  },
6463
+ "node_modules/libphonenumber-js": {
6464
+ "version": "1.11.12",
6465
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.12.tgz",
6466
+ "integrity": "sha512-QkJn9/D7zZ1ucvT++TQSvZuSA2xAWeUytU+DiEQwbPKLyrDpvbul2AFs1CGbRAPpSCCk47aRAb5DX5mmcayp4g==",
6467
+ "license": "MIT"
6468
+ },
6469
  "node_modules/lines-and-columns": {
6470
  "version": "1.2.4",
6471
  "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
 
6501
  "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
6502
  "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
6503
  },
6504
+ "node_modules/lodash.includes": {
6505
+ "version": "4.3.0",
6506
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
6507
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
6508
+ "license": "MIT"
6509
+ },
6510
+ "node_modules/lodash.isboolean": {
6511
+ "version": "3.0.3",
6512
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
6513
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
6514
+ "license": "MIT"
6515
+ },
6516
+ "node_modules/lodash.isinteger": {
6517
+ "version": "4.0.4",
6518
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
6519
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
6520
+ "license": "MIT"
6521
+ },
6522
+ "node_modules/lodash.isnumber": {
6523
+ "version": "3.0.3",
6524
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
6525
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
6526
+ "license": "MIT"
6527
+ },
6528
+ "node_modules/lodash.isplainobject": {
6529
+ "version": "4.0.6",
6530
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
6531
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
6532
+ "license": "MIT"
6533
+ },
6534
+ "node_modules/lodash.isstring": {
6535
+ "version": "4.0.1",
6536
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
6537
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
6538
+ "license": "MIT"
6539
+ },
6540
  "node_modules/lodash.memoize": {
6541
  "version": "4.1.2",
6542
  "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
 
6549
  "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
6550
  "dev": true
6551
  },
6552
+ "node_modules/lodash.once": {
6553
+ "version": "4.1.1",
6554
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
6555
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
6556
+ "license": "MIT"
6557
+ },
6558
  "node_modules/log-symbols": {
6559
  "version": "4.1.0",
6560
  "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
 
6786
  "node": ">=16 || 14 >=14.17"
6787
  }
6788
  },
6789
+ "node_modules/minizlib": {
6790
+ "version": "2.1.2",
6791
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
6792
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
6793
+ "license": "MIT",
6794
+ "dependencies": {
6795
+ "minipass": "^3.0.0",
6796
+ "yallist": "^4.0.0"
6797
+ },
6798
+ "engines": {
6799
+ "node": ">= 8"
6800
+ }
6801
+ },
6802
+ "node_modules/minizlib/node_modules/minipass": {
6803
+ "version": "3.3.6",
6804
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
6805
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
6806
+ "license": "ISC",
6807
+ "dependencies": {
6808
+ "yallist": "^4.0.0"
6809
+ },
6810
+ "engines": {
6811
+ "node": ">=8"
6812
+ }
6813
+ },
6814
+ "node_modules/minizlib/node_modules/yallist": {
6815
+ "version": "4.0.0",
6816
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
6817
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
6818
+ "license": "ISC"
6819
+ },
6820
  "node_modules/mkdirp": {
6821
  "version": "0.5.6",
6822
  "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
 
6959
  "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
6960
  "dev": true
6961
  },
6962
+ "node_modules/node-addon-api": {
6963
+ "version": "5.1.0",
6964
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
6965
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
6966
+ "license": "MIT"
6967
+ },
6968
  "node_modules/node-emoji": {
6969
  "version": "1.11.0",
6970
  "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
 
7005
  "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
7006
  "dev": true
7007
  },
7008
+ "node_modules/nopt": {
7009
+ "version": "5.0.0",
7010
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
7011
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
7012
+ "license": "ISC",
7013
+ "dependencies": {
7014
+ "abbrev": "1"
7015
+ },
7016
+ "bin": {
7017
+ "nopt": "bin/nopt.js"
7018
+ },
7019
+ "engines": {
7020
+ "node": ">=6"
7021
+ }
7022
+ },
7023
  "node_modules/normalize-path": {
7024
  "version": "3.0.0",
7025
  "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
 
7047
  "node": ">=8"
7048
  }
7049
  },
7050
+ "node_modules/npmlog": {
7051
+ "version": "5.0.1",
7052
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
7053
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
7054
+ "deprecated": "This package is no longer supported.",
7055
+ "license": "ISC",
7056
+ "dependencies": {
7057
+ "are-we-there-yet": "^2.0.0",
7058
+ "console-control-strings": "^1.1.0",
7059
+ "gauge": "^3.0.0",
7060
+ "set-blocking": "^2.0.0"
7061
+ }
7062
+ },
7063
  "node_modules/object-assign": {
7064
  "version": "4.1.1",
7065
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 
7094
  "version": "1.4.0",
7095
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
7096
  "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
 
7097
  "dependencies": {
7098
  "wrappy": "1"
7099
  }
 
7275
  "version": "1.0.1",
7276
  "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
7277
  "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
 
7278
  "engines": {
7279
  "node": ">=0.10.0"
7280
  }
 
7907
  "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
7908
  "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
7909
  "deprecated": "Rimraf versions prior to v4 are no longer supported",
 
7910
  "dependencies": {
7911
  "glob": "^7.1.3"
7912
  },
 
7921
  "version": "1.1.11",
7922
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
7923
  "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
 
7924
  "dependencies": {
7925
  "balanced-match": "^1.0.0",
7926
  "concat-map": "0.0.1"
 
7931
  "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
7932
  "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
7933
  "deprecated": "Glob versions prior to v9 are no longer supported",
 
7934
  "dependencies": {
7935
  "fs.realpath": "^1.0.0",
7936
  "inflight": "^1.0.4",
 
7950
  "version": "3.1.2",
7951
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
7952
  "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 
7953
  "dependencies": {
7954
  "brace-expansion": "^1.1.7"
7955
  },
 
8074
  "version": "7.6.3",
8075
  "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
8076
  "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
 
8077
  "bin": {
8078
  "semver": "bin/semver.js"
8079
  },
 
8153
  "node": ">= 0.8.0"
8154
  }
8155
  },
8156
+ "node_modules/set-blocking": {
8157
+ "version": "2.0.0",
8158
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
8159
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
8160
+ "license": "ISC"
8161
+ },
8162
  "node_modules/set-function-length": {
8163
  "version": "1.2.2",
8164
  "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
 
8550
  "node": ">=6"
8551
  }
8552
  },
8553
+ "node_modules/tar": {
8554
+ "version": "6.2.1",
8555
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
8556
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
8557
+ "license": "ISC",
8558
+ "dependencies": {
8559
+ "chownr": "^2.0.0",
8560
+ "fs-minipass": "^2.0.0",
8561
+ "minipass": "^5.0.0",
8562
+ "minizlib": "^2.1.1",
8563
+ "mkdirp": "^1.0.3",
8564
+ "yallist": "^4.0.0"
8565
+ },
8566
+ "engines": {
8567
+ "node": ">=10"
8568
+ }
8569
+ },
8570
+ "node_modules/tar/node_modules/minipass": {
8571
+ "version": "5.0.0",
8572
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
8573
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
8574
+ "license": "ISC",
8575
+ "engines": {
8576
+ "node": ">=8"
8577
+ }
8578
+ },
8579
+ "node_modules/tar/node_modules/mkdirp": {
8580
+ "version": "1.0.4",
8581
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
8582
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
8583
+ "license": "MIT",
8584
+ "bin": {
8585
+ "mkdirp": "bin/cmd.js"
8586
+ },
8587
+ "engines": {
8588
+ "node": ">=10"
8589
+ }
8590
+ },
8591
+ "node_modules/tar/node_modules/yallist": {
8592
+ "version": "4.0.0",
8593
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
8594
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
8595
+ "license": "ISC"
8596
+ },
8597
  "node_modules/terser": {
8598
  "version": "5.33.0",
8599
  "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz",
 
9215
  "node_modules/undici-types": {
9216
  "version": "6.19.8",
9217
  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
9218
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
 
9219
  },
9220
  "node_modules/universalify": {
9221
  "version": "2.0.1",
 
9318
  "node": ">=10.12.0"
9319
  }
9320
  },
9321
+ "node_modules/validator": {
9322
+ "version": "13.12.0",
9323
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
9324
+ "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
9325
+ "license": "MIT",
9326
+ "engines": {
9327
+ "node": ">= 0.10"
9328
+ }
9329
+ },
9330
  "node_modules/vary": {
9331
  "version": "1.1.2",
9332
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 
9480
  "node": ">= 8"
9481
  }
9482
  },
9483
+ "node_modules/wide-align": {
9484
+ "version": "1.1.5",
9485
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
9486
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
9487
+ "license": "ISC",
9488
+ "dependencies": {
9489
+ "string-width": "^1.0.2 || 2 || 3 || 4"
9490
+ }
9491
+ },
9492
  "node_modules/word-wrap": {
9493
  "version": "1.2.5",
9494
  "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
 
9532
  "node_modules/wrappy": {
9533
  "version": "1.0.2",
9534
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
9535
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
 
9536
  },
9537
  "node_modules/write-file-atomic": {
9538
  "version": "4.0.2",
backend/package.json CHANGED
@@ -28,9 +28,12 @@
28
  "@nestjs/common": "^10.0.0",
29
  "@nestjs/config": "^3.2.3",
30
  "@nestjs/core": "^10.0.0",
 
31
  "@nestjs/mapped-types": "*",
32
  "@nestjs/platform-express": "^10.0.0",
33
  "@nestjs/typeorm": "^10.0.2",
 
 
34
  "dotenv": "^16.4.5",
35
  "mysql2": "^3.11.3",
36
  "nest-access-control": "^3.1.0",
 
28
  "@nestjs/common": "^10.0.0",
29
  "@nestjs/config": "^3.2.3",
30
  "@nestjs/core": "^10.0.0",
31
+ "@nestjs/jwt": "^10.2.0",
32
  "@nestjs/mapped-types": "*",
33
  "@nestjs/platform-express": "^10.0.0",
34
  "@nestjs/typeorm": "^10.0.2",
35
+ "bcrypt": "^5.1.1",
36
+ "class-validator": "^0.14.1",
37
  "dotenv": "^16.4.5",
38
  "mysql2": "^3.11.3",
39
  "nest-access-control": "^3.1.0",
backend/src/modules/authentication/authentication.controller.ts CHANGED
@@ -1,34 +1,31 @@
1
- import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
2
- import { AuthenticationService } from './authentication.service';
3
- import { CreateAuthenticationDto } from './dto/create-authentication.dto';
4
- import { UpdateAuthenticationDto } from './dto/update-authentication.dto';
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  @Controller('authentication')
7
  export class AuthenticationController {
8
- constructor(private readonly authenticationService: AuthenticationService) {}
9
-
10
- @Post()
11
- create(@Body() createAuthenticationDto: CreateAuthenticationDto) {
12
- return this.authenticationService.create(createAuthenticationDto);
13
- }
14
-
15
- @Get()
16
- findAll() {
17
- return this.authenticationService.findAll();
18
- }
19
-
20
- @Get(':id')
21
- findOne(@Param('id') id: string) {
22
- return this.authenticationService.findOne(+id);
23
- }
24
 
25
- @Patch(':id')
26
- update(@Param('id') id: string, @Body() updateAuthenticationDto: UpdateAuthenticationDto) {
27
- return this.authenticationService.update(+id, updateAuthenticationDto);
 
 
28
  }
29
 
30
- @Delete(':id')
31
- remove(@Param('id') id: string) {
32
- return this.authenticationService.remove(+id);
 
33
  }
34
  }
 
 
 
 
 
1
 
2
+ import {
3
+ Body,
4
+ Controller,
5
+ Get,
6
+ HttpCode,
7
+ HttpStatus,
8
+ Post,
9
+ Request,
10
+ UseGuards
11
+ } from '@nestjs/common';
12
+ import { AuthenticationGuard } from './authentication.guard';
13
+ import { AuthenticationService } from './authentication.service';
14
+ import { Public } from './authentication.decorator';
15
  @Controller('authentication')
16
  export class AuthenticationController {
17
+ constructor(private AuthenticationService: AuthenticationService) {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
+ @Public()
20
+ @HttpCode(HttpStatus.OK)
21
+ @Post('login')
22
+ signIn(@Body() signInDto: Record<string, any>) {
23
+ return this.AuthenticationService.signIn(signInDto.username, signInDto.password);
24
  }
25
 
26
+ // @UseGuards(AuthenticationGuard)
27
+ @Get('profile')
28
+ getProfile(@Request() req) {
29
+ return req.user;
30
  }
31
  }
backend/src/modules/authentication/authentication.decorator.ts ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+
2
+ import { SetMetadata } from '@nestjs/common';
3
+
4
+ export const IS_PUBLIC_KEY = 'isPublic';
5
+ export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
backend/src/modules/authentication/authentication.guard.ts ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import {
3
+ CanActivate,
4
+ ExecutionContext,
5
+ Injectable,
6
+ UnauthorizedException,
7
+ } from '@nestjs/common';
8
+ import { JwtService } from '@nestjs/jwt';
9
+ import { jwtConstants } from './constants';
10
+ import { Request } from 'express';
11
+ import { Reflector } from '@nestjs/core';
12
+ import { IS_PUBLIC_KEY } from './authentication.decorator';
13
+ @Injectable()
14
+ export class AuthenticationGuard implements CanActivate {
15
+ constructor(private jwtService: JwtService, private reflector: Reflector) {}
16
+
17
+ async canActivate(context: ExecutionContext): Promise<boolean> {
18
+ const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
19
+ context.getHandler(),
20
+ context.getClass(),
21
+ ]);
22
+ if (isPublic) {
23
+ // 💡 See this condition
24
+ return true;
25
+ }
26
+
27
+ const request = context.switchToHttp().getRequest();
28
+ const token = this.extractTokenFromHeader(request);
29
+ if (!token) {
30
+ throw new UnauthorizedException();
31
+ }
32
+ try {
33
+ const payload = await this.jwtService.verifyAsync(token, {
34
+ secret: jwtConstants.secret,
35
+ });
36
+ // 💡 We're assigning the payload to the request object here
37
+ // so that we can access it in our route handlers
38
+ request['user'] = payload;
39
+ } catch {
40
+ throw new UnauthorizedException();
41
+ }
42
+ return true;
43
+ }
44
+
45
+ private extractTokenFromHeader(request: Request): string | undefined {
46
+ const [type, token] = request.headers.authorization?.split(' ') ?? [];
47
+ return type === 'Bearer' ? token : undefined;
48
+ }
49
+ }
backend/src/modules/authentication/authentication.module.ts CHANGED
@@ -1,9 +1,29 @@
 
1
  import { Module } from '@nestjs/common';
2
  import { AuthenticationService } from './authentication.service';
 
 
3
  import { AuthenticationController } from './authentication.controller';
4
-
 
 
5
  @Module({
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  controllers: [AuthenticationController],
7
- providers: [AuthenticationService],
8
  })
9
  export class AuthenticationModule {}
 
1
+
2
  import { Module } from '@nestjs/common';
3
  import { AuthenticationService } from './authentication.service';
4
+ import { UserModule } from '../user/user.module';
5
+ import { JwtModule } from '@nestjs/jwt';
6
  import { AuthenticationController } from './authentication.controller';
7
+ import { jwtConstants } from './constants';
8
+ import { AuthenticationGuard } from './authentication.guard';
9
+ import { APP_GUARD } from '@nestjs/core';
10
  @Module({
11
+ imports: [
12
+ UserModule,
13
+ JwtModule.register({
14
+ global: true,
15
+ secret: jwtConstants.secret,
16
+ signOptions: { expiresIn: '90s' },
17
+ }),
18
+ ],
19
+ providers: [
20
+ AuthenticationService,
21
+ {
22
+ provide: APP_GUARD,
23
+ useClass: AuthenticationGuard,
24
+ }
25
+ ],
26
  controllers: [AuthenticationController],
27
+ exports: [AuthenticationService],
28
  })
29
  export class AuthenticationModule {}
backend/src/modules/authentication/authentication.service.ts CHANGED
@@ -1,26 +1,25 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { CreateAuthenticationDto } from './dto/create-authentication.dto';
3
- import { UpdateAuthenticationDto } from './dto/update-authentication.dto';
4
 
 
 
 
 
5
  @Injectable()
6
  export class AuthenticationService {
7
- create(createAuthenticationDto: CreateAuthenticationDto) {
8
- return 'This action adds a new authentication';
9
- }
10
-
11
- findAll() {
12
- return `This action returns all authentication`;
13
- }
14
-
15
- findOne(id: number) {
16
- return `This action returns a #${id} authentication`;
17
- }
18
-
19
- update(id: number, updateAuthenticationDto: UpdateAuthenticationDto) {
20
- return `This action updates a #${id} authentication`;
21
- }
22
 
23
- remove(id: number) {
24
- return `This action removes a #${id} authentication`;
 
 
 
 
 
 
 
 
 
25
  }
26
  }
 
 
 
 
1
 
2
+ import { Injectable, UnauthorizedException } from '@nestjs/common';
3
+ import { UserService } from '../user/user.service';
4
+ import * as bcrypt from 'bcrypt';
5
+ import { JwtService } from '@nestjs/jwt';
6
  @Injectable()
7
  export class AuthenticationService {
8
+ constructor(
9
+ private usersService: UserService,
10
+ private jwtService: JwtService
11
+ ) {}
 
 
 
 
 
 
 
 
 
 
 
12
 
13
+ async signIn(username: string, pass: string): Promise<{access_token: string}> {
14
+ const user = await this.usersService.findOne(username);
15
+ if (!user || await !bcrypt.compare(pass, user.hash_password)) {
16
+ throw new UnauthorizedException();
17
+ }
18
+ const payload = { sub: user.id, username: user.id };
19
+ // TODO: Generate a JWT and return it here
20
+ // instead of the user object
21
+ return {
22
+ access_token: await this.jwtService.signAsync(payload),
23
+ };
24
  }
25
  }
backend/src/modules/authentication/constants.ts ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+
2
+ export const jwtConstants = {
3
+ secret: process.env.JWT_SECRET,
4
+ };
5
+
backend/src/modules/authentication/dto/sign-in.dto.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import { IsString } from 'class-validator';
2
+
3
+ export class SignInDto {
4
+ @IsString()
5
+ username: string;
6
+
7
+ @IsString()
8
+ password: string;
9
+ }
backend/src/modules/user/user.controller.ts CHANGED
@@ -1,36 +1,13 @@
1
- import {
2
- Controller,
3
- Get,
4
- Post,
5
- Body,
6
- Patch,
7
- Param,
8
- Delete,
9
- } from '@nestjs/common';
10
- import { UserService } from './user.service.js';
11
- import { CreateUserDto } from './dto/create-user.dto.js';
12
 
13
  @Controller('users')
14
- export class UserController {
15
- constructor(private readonly userService: UserService) {}
16
 
17
- @Post()
18
- async create(@Body() createUserDto: CreateUserDto) {
19
- return this.userService.create(createUserDto);
20
- }
21
-
22
- @Get()
23
- async findAll() {
24
- return this.userService.findAll();
25
- }
26
-
27
- @Get(':id')
28
- async findOne(@Param('id') id: string) {
29
- return this.userService.findOne(id);
30
- }
31
-
32
- @Delete(':id')
33
- async remove(@Param('id') id: string) {
34
- return this.userService.remove(+id);
35
  }
36
  }
 
1
+ import { Controller, Get, Param } from '@nestjs/common';
2
+ import { UserService } from './user.service';
3
+ import { UserEntity } from 'src/entities/user.entity';
 
 
 
 
 
 
 
 
4
 
5
  @Controller('users')
6
+ export class UsersController {
7
+ constructor(private readonly usersService: UserService) {}
8
 
9
+ @Get(':username')
10
+ async getUser(@Param('username') username: string): Promise<UserEntity | undefined> {
11
+ return this.usersService.findOne(username);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  }
13
  }
backend/src/modules/user/user.module.ts CHANGED
@@ -1,9 +1,8 @@
1
  import { Module } from '@nestjs/common';
2
- import { UserService } from './user.service.js';
3
- import { UserController } from './user.controller.js';
4
 
5
  @Module({
6
- controllers: [UserController],
7
  providers: [UserService],
 
8
  })
9
  export class UserModule {}
 
1
  import { Module } from '@nestjs/common';
2
+ import { UserService } from './user.service';
 
3
 
4
  @Module({
 
5
  providers: [UserService],
6
+ exports: [UserService],
7
  })
8
  export class UserModule {}
backend/src/modules/user/user.service.ts CHANGED
@@ -1,26 +1,18 @@
1
  import { Injectable } from '@nestjs/common';
2
- import { CreateUserDto } from './dto/create-user.dto.js';
3
- import { UserEntity } from '../../entities/user.entity.js';
 
 
 
4
 
5
  @Injectable()
6
  export class UserService {
7
- async create(createUserDto: CreateUserDto) {
8
- const user = await UserEntity.create({
9
- ...createUserDto,
10
- }).save();
11
- return 'This action adds a new user';
12
- }
13
-
14
- async findAll() {
15
- const users = await UserEntity.find();
16
- return users;
17
- }
18
-
19
- async findOne(id: string) {
20
- return `This action returns a #${id} user`;
21
- }
22
 
23
- async remove(id: number) {
24
- return `This action removes a #${id} user`;
25
  }
26
  }
 
1
  import { Injectable } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { Repository } from 'typeorm';
4
+ import { UserEntity } from 'src/entities/user.entity'
5
+ // This should be a real class/interface representing a user entity
6
+ export type User = any;
7
 
8
  @Injectable()
9
  export class UserService {
10
+ constructor(
11
+ @InjectRepository(UserEntity)
12
+ private usersRepository: Repository<UserEntity>,
13
+ ) {}
 
 
 
 
 
 
 
 
 
 
 
14
 
15
+ async findOne(username: string): Promise<UserEntity | undefined> {
16
+ return this.usersRepository.findOne({ where: { id: username } });
17
  }
18
  }