├── .env ├── .gitignore ├── README.md ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── public └── vite.svg ├── src ├── assets │ └── react.svg ├── components │ ├── Address │ │ ├── AddressCreate.jsx │ │ └── AddressEdit.jsx │ ├── Contact │ │ ├── ContactCreate.jsx │ │ ├── ContactDetail.jsx │ │ ├── ContactEdit.jsx │ │ └── ContactList.jsx │ ├── DashboardLayout.jsx │ ├── Layout.jsx │ └── User │ │ ├── UserLogin.jsx │ │ ├── UserLogout.jsx │ │ ├── UserProfile.jsx │ │ └── UserRegister.jsx ├── lib │ ├── alert.js │ └── api │ │ ├── AddressApi.js │ │ ├── ContactApi.js │ │ └── UserApi.js └── main.jsx └── vite.config.js /.env: -------------------------------------------------------------------------------- 1 | VITE_API_PATH=http://localhost:3000/api -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | 10 | ## Expanding the ESLint configuration 11 | 12 | If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. 13 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import reactHooks from 'eslint-plugin-react-hooks' 4 | import reactRefresh from 'eslint-plugin-react-refresh' 5 | 6 | export default [ 7 | { ignores: ['dist'] }, 8 | { 9 | files: ['**/*.{js,jsx}'], 10 | languageOptions: { 11 | ecmaVersion: 2020, 12 | globals: globals.browser, 13 | parserOptions: { 14 | ecmaVersion: 'latest', 15 | ecmaFeatures: { jsx: true }, 16 | sourceType: 'module', 17 | }, 18 | }, 19 | plugins: { 20 | 'react-hooks': reactHooks, 21 | 'react-refresh': reactRefresh, 22 | }, 23 | rules: { 24 | ...js.configs.recommended.rules, 25 | ...reactHooks.configs.recommended.rules, 26 | 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], 27 | 'react-refresh/only-export-components': [ 28 | 'warn', 29 | { allowConstantExport: true }, 30 | ], 31 | }, 32 | }, 33 | ] 34 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Contact Management - Programmer Zaman Now 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 29 | 48 | 49 | 50 | 51 | 52 |
53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "belajar-reactjs-contact-management", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "belajar-reactjs-contact-management", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "react": "^19.1.0", 12 | "react-dom": "^19.1.0", 13 | "react-router": "^7.6.0", 14 | "react-use": "^17.6.0", 15 | "sweetalert2": "^11.21.1" 16 | }, 17 | "devDependencies": { 18 | "@eslint/js": "^9.25.0", 19 | "@types/react": "^19.1.2", 20 | "@types/react-dom": "^19.1.2", 21 | "@vitejs/plugin-react": "^4.4.1", 22 | "eslint": "^9.25.0", 23 | "eslint-plugin-react-hooks": "^5.2.0", 24 | "eslint-plugin-react-refresh": "^0.4.19", 25 | "globals": "^16.0.0", 26 | "vite": "^6.3.5" 27 | } 28 | }, 29 | "node_modules/@ampproject/remapping": { 30 | "version": "2.3.0", 31 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 32 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 33 | "dev": true, 34 | "license": "Apache-2.0", 35 | "dependencies": { 36 | "@jridgewell/gen-mapping": "^0.3.5", 37 | "@jridgewell/trace-mapping": "^0.3.24" 38 | }, 39 | "engines": { 40 | "node": ">=6.0.0" 41 | } 42 | }, 43 | "node_modules/@babel/code-frame": { 44 | "version": "7.27.1", 45 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 46 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 47 | "dev": true, 48 | "license": "MIT", 49 | "dependencies": { 50 | "@babel/helper-validator-identifier": "^7.27.1", 51 | "js-tokens": "^4.0.0", 52 | "picocolors": "^1.1.1" 53 | }, 54 | "engines": { 55 | "node": ">=6.9.0" 56 | } 57 | }, 58 | "node_modules/@babel/compat-data": { 59 | "version": "7.27.2", 60 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", 61 | "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", 62 | "dev": true, 63 | "license": "MIT", 64 | "engines": { 65 | "node": ">=6.9.0" 66 | } 67 | }, 68 | "node_modules/@babel/core": { 69 | "version": "7.27.1", 70 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", 71 | "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", 72 | "dev": true, 73 | "license": "MIT", 74 | "dependencies": { 75 | "@ampproject/remapping": "^2.2.0", 76 | "@babel/code-frame": "^7.27.1", 77 | "@babel/generator": "^7.27.1", 78 | "@babel/helper-compilation-targets": "^7.27.1", 79 | "@babel/helper-module-transforms": "^7.27.1", 80 | "@babel/helpers": "^7.27.1", 81 | "@babel/parser": "^7.27.1", 82 | "@babel/template": "^7.27.1", 83 | "@babel/traverse": "^7.27.1", 84 | "@babel/types": "^7.27.1", 85 | "convert-source-map": "^2.0.0", 86 | "debug": "^4.1.0", 87 | "gensync": "^1.0.0-beta.2", 88 | "json5": "^2.2.3", 89 | "semver": "^6.3.1" 90 | }, 91 | "engines": { 92 | "node": ">=6.9.0" 93 | }, 94 | "funding": { 95 | "type": "opencollective", 96 | "url": "https://opencollective.com/babel" 97 | } 98 | }, 99 | "node_modules/@babel/generator": { 100 | "version": "7.27.1", 101 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", 102 | "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", 103 | "dev": true, 104 | "license": "MIT", 105 | "dependencies": { 106 | "@babel/parser": "^7.27.1", 107 | "@babel/types": "^7.27.1", 108 | "@jridgewell/gen-mapping": "^0.3.5", 109 | "@jridgewell/trace-mapping": "^0.3.25", 110 | "jsesc": "^3.0.2" 111 | }, 112 | "engines": { 113 | "node": ">=6.9.0" 114 | } 115 | }, 116 | "node_modules/@babel/helper-compilation-targets": { 117 | "version": "7.27.2", 118 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 119 | "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 120 | "dev": true, 121 | "license": "MIT", 122 | "dependencies": { 123 | "@babel/compat-data": "^7.27.2", 124 | "@babel/helper-validator-option": "^7.27.1", 125 | "browserslist": "^4.24.0", 126 | "lru-cache": "^5.1.1", 127 | "semver": "^6.3.1" 128 | }, 129 | "engines": { 130 | "node": ">=6.9.0" 131 | } 132 | }, 133 | "node_modules/@babel/helper-module-imports": { 134 | "version": "7.27.1", 135 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 136 | "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 137 | "dev": true, 138 | "license": "MIT", 139 | "dependencies": { 140 | "@babel/traverse": "^7.27.1", 141 | "@babel/types": "^7.27.1" 142 | }, 143 | "engines": { 144 | "node": ">=6.9.0" 145 | } 146 | }, 147 | "node_modules/@babel/helper-module-transforms": { 148 | "version": "7.27.1", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", 150 | "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", 151 | "dev": true, 152 | "license": "MIT", 153 | "dependencies": { 154 | "@babel/helper-module-imports": "^7.27.1", 155 | "@babel/helper-validator-identifier": "^7.27.1", 156 | "@babel/traverse": "^7.27.1" 157 | }, 158 | "engines": { 159 | "node": ">=6.9.0" 160 | }, 161 | "peerDependencies": { 162 | "@babel/core": "^7.0.0" 163 | } 164 | }, 165 | "node_modules/@babel/helper-plugin-utils": { 166 | "version": "7.27.1", 167 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", 168 | "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", 169 | "dev": true, 170 | "license": "MIT", 171 | "engines": { 172 | "node": ">=6.9.0" 173 | } 174 | }, 175 | "node_modules/@babel/helper-string-parser": { 176 | "version": "7.27.1", 177 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 178 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 179 | "dev": true, 180 | "license": "MIT", 181 | "engines": { 182 | "node": ">=6.9.0" 183 | } 184 | }, 185 | "node_modules/@babel/helper-validator-identifier": { 186 | "version": "7.27.1", 187 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 188 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 189 | "dev": true, 190 | "license": "MIT", 191 | "engines": { 192 | "node": ">=6.9.0" 193 | } 194 | }, 195 | "node_modules/@babel/helper-validator-option": { 196 | "version": "7.27.1", 197 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 198 | "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 199 | "dev": true, 200 | "license": "MIT", 201 | "engines": { 202 | "node": ">=6.9.0" 203 | } 204 | }, 205 | "node_modules/@babel/helpers": { 206 | "version": "7.27.1", 207 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", 208 | "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", 209 | "dev": true, 210 | "license": "MIT", 211 | "dependencies": { 212 | "@babel/template": "^7.27.1", 213 | "@babel/types": "^7.27.1" 214 | }, 215 | "engines": { 216 | "node": ">=6.9.0" 217 | } 218 | }, 219 | "node_modules/@babel/parser": { 220 | "version": "7.27.2", 221 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", 222 | "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", 223 | "dev": true, 224 | "license": "MIT", 225 | "dependencies": { 226 | "@babel/types": "^7.27.1" 227 | }, 228 | "bin": { 229 | "parser": "bin/babel-parser.js" 230 | }, 231 | "engines": { 232 | "node": ">=6.0.0" 233 | } 234 | }, 235 | "node_modules/@babel/plugin-transform-react-jsx-self": { 236 | "version": "7.27.1", 237 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", 238 | "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", 239 | "dev": true, 240 | "license": "MIT", 241 | "dependencies": { 242 | "@babel/helper-plugin-utils": "^7.27.1" 243 | }, 244 | "engines": { 245 | "node": ">=6.9.0" 246 | }, 247 | "peerDependencies": { 248 | "@babel/core": "^7.0.0-0" 249 | } 250 | }, 251 | "node_modules/@babel/plugin-transform-react-jsx-source": { 252 | "version": "7.27.1", 253 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", 254 | "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", 255 | "dev": true, 256 | "license": "MIT", 257 | "dependencies": { 258 | "@babel/helper-plugin-utils": "^7.27.1" 259 | }, 260 | "engines": { 261 | "node": ">=6.9.0" 262 | }, 263 | "peerDependencies": { 264 | "@babel/core": "^7.0.0-0" 265 | } 266 | }, 267 | "node_modules/@babel/runtime": { 268 | "version": "7.27.1", 269 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", 270 | "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", 271 | "license": "MIT", 272 | "engines": { 273 | "node": ">=6.9.0" 274 | } 275 | }, 276 | "node_modules/@babel/template": { 277 | "version": "7.27.2", 278 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", 279 | "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 280 | "dev": true, 281 | "license": "MIT", 282 | "dependencies": { 283 | "@babel/code-frame": "^7.27.1", 284 | "@babel/parser": "^7.27.2", 285 | "@babel/types": "^7.27.1" 286 | }, 287 | "engines": { 288 | "node": ">=6.9.0" 289 | } 290 | }, 291 | "node_modules/@babel/traverse": { 292 | "version": "7.27.1", 293 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", 294 | "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", 295 | "dev": true, 296 | "license": "MIT", 297 | "dependencies": { 298 | "@babel/code-frame": "^7.27.1", 299 | "@babel/generator": "^7.27.1", 300 | "@babel/parser": "^7.27.1", 301 | "@babel/template": "^7.27.1", 302 | "@babel/types": "^7.27.1", 303 | "debug": "^4.3.1", 304 | "globals": "^11.1.0" 305 | }, 306 | "engines": { 307 | "node": ">=6.9.0" 308 | } 309 | }, 310 | "node_modules/@babel/traverse/node_modules/globals": { 311 | "version": "11.12.0", 312 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 313 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 314 | "dev": true, 315 | "license": "MIT", 316 | "engines": { 317 | "node": ">=4" 318 | } 319 | }, 320 | "node_modules/@babel/types": { 321 | "version": "7.27.1", 322 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", 323 | "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", 324 | "dev": true, 325 | "license": "MIT", 326 | "dependencies": { 327 | "@babel/helper-string-parser": "^7.27.1", 328 | "@babel/helper-validator-identifier": "^7.27.1" 329 | }, 330 | "engines": { 331 | "node": ">=6.9.0" 332 | } 333 | }, 334 | "node_modules/@esbuild/aix-ppc64": { 335 | "version": "0.25.4", 336 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 337 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 338 | "cpu": [ 339 | "ppc64" 340 | ], 341 | "dev": true, 342 | "license": "MIT", 343 | "optional": true, 344 | "os": [ 345 | "aix" 346 | ], 347 | "engines": { 348 | "node": ">=18" 349 | } 350 | }, 351 | "node_modules/@esbuild/android-arm": { 352 | "version": "0.25.4", 353 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 354 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 355 | "cpu": [ 356 | "arm" 357 | ], 358 | "dev": true, 359 | "license": "MIT", 360 | "optional": true, 361 | "os": [ 362 | "android" 363 | ], 364 | "engines": { 365 | "node": ">=18" 366 | } 367 | }, 368 | "node_modules/@esbuild/android-arm64": { 369 | "version": "0.25.4", 370 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 371 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 372 | "cpu": [ 373 | "arm64" 374 | ], 375 | "dev": true, 376 | "license": "MIT", 377 | "optional": true, 378 | "os": [ 379 | "android" 380 | ], 381 | "engines": { 382 | "node": ">=18" 383 | } 384 | }, 385 | "node_modules/@esbuild/android-x64": { 386 | "version": "0.25.4", 387 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 388 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 389 | "cpu": [ 390 | "x64" 391 | ], 392 | "dev": true, 393 | "license": "MIT", 394 | "optional": true, 395 | "os": [ 396 | "android" 397 | ], 398 | "engines": { 399 | "node": ">=18" 400 | } 401 | }, 402 | "node_modules/@esbuild/darwin-arm64": { 403 | "version": "0.25.4", 404 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 405 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 406 | "cpu": [ 407 | "arm64" 408 | ], 409 | "dev": true, 410 | "license": "MIT", 411 | "optional": true, 412 | "os": [ 413 | "darwin" 414 | ], 415 | "engines": { 416 | "node": ">=18" 417 | } 418 | }, 419 | "node_modules/@esbuild/darwin-x64": { 420 | "version": "0.25.4", 421 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 422 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 423 | "cpu": [ 424 | "x64" 425 | ], 426 | "dev": true, 427 | "license": "MIT", 428 | "optional": true, 429 | "os": [ 430 | "darwin" 431 | ], 432 | "engines": { 433 | "node": ">=18" 434 | } 435 | }, 436 | "node_modules/@esbuild/freebsd-arm64": { 437 | "version": "0.25.4", 438 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 439 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 440 | "cpu": [ 441 | "arm64" 442 | ], 443 | "dev": true, 444 | "license": "MIT", 445 | "optional": true, 446 | "os": [ 447 | "freebsd" 448 | ], 449 | "engines": { 450 | "node": ">=18" 451 | } 452 | }, 453 | "node_modules/@esbuild/freebsd-x64": { 454 | "version": "0.25.4", 455 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 456 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 457 | "cpu": [ 458 | "x64" 459 | ], 460 | "dev": true, 461 | "license": "MIT", 462 | "optional": true, 463 | "os": [ 464 | "freebsd" 465 | ], 466 | "engines": { 467 | "node": ">=18" 468 | } 469 | }, 470 | "node_modules/@esbuild/linux-arm": { 471 | "version": "0.25.4", 472 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 473 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 474 | "cpu": [ 475 | "arm" 476 | ], 477 | "dev": true, 478 | "license": "MIT", 479 | "optional": true, 480 | "os": [ 481 | "linux" 482 | ], 483 | "engines": { 484 | "node": ">=18" 485 | } 486 | }, 487 | "node_modules/@esbuild/linux-arm64": { 488 | "version": "0.25.4", 489 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 490 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 491 | "cpu": [ 492 | "arm64" 493 | ], 494 | "dev": true, 495 | "license": "MIT", 496 | "optional": true, 497 | "os": [ 498 | "linux" 499 | ], 500 | "engines": { 501 | "node": ">=18" 502 | } 503 | }, 504 | "node_modules/@esbuild/linux-ia32": { 505 | "version": "0.25.4", 506 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 507 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 508 | "cpu": [ 509 | "ia32" 510 | ], 511 | "dev": true, 512 | "license": "MIT", 513 | "optional": true, 514 | "os": [ 515 | "linux" 516 | ], 517 | "engines": { 518 | "node": ">=18" 519 | } 520 | }, 521 | "node_modules/@esbuild/linux-loong64": { 522 | "version": "0.25.4", 523 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 524 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 525 | "cpu": [ 526 | "loong64" 527 | ], 528 | "dev": true, 529 | "license": "MIT", 530 | "optional": true, 531 | "os": [ 532 | "linux" 533 | ], 534 | "engines": { 535 | "node": ">=18" 536 | } 537 | }, 538 | "node_modules/@esbuild/linux-mips64el": { 539 | "version": "0.25.4", 540 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 541 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 542 | "cpu": [ 543 | "mips64el" 544 | ], 545 | "dev": true, 546 | "license": "MIT", 547 | "optional": true, 548 | "os": [ 549 | "linux" 550 | ], 551 | "engines": { 552 | "node": ">=18" 553 | } 554 | }, 555 | "node_modules/@esbuild/linux-ppc64": { 556 | "version": "0.25.4", 557 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 558 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 559 | "cpu": [ 560 | "ppc64" 561 | ], 562 | "dev": true, 563 | "license": "MIT", 564 | "optional": true, 565 | "os": [ 566 | "linux" 567 | ], 568 | "engines": { 569 | "node": ">=18" 570 | } 571 | }, 572 | "node_modules/@esbuild/linux-riscv64": { 573 | "version": "0.25.4", 574 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 575 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 576 | "cpu": [ 577 | "riscv64" 578 | ], 579 | "dev": true, 580 | "license": "MIT", 581 | "optional": true, 582 | "os": [ 583 | "linux" 584 | ], 585 | "engines": { 586 | "node": ">=18" 587 | } 588 | }, 589 | "node_modules/@esbuild/linux-s390x": { 590 | "version": "0.25.4", 591 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 592 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 593 | "cpu": [ 594 | "s390x" 595 | ], 596 | "dev": true, 597 | "license": "MIT", 598 | "optional": true, 599 | "os": [ 600 | "linux" 601 | ], 602 | "engines": { 603 | "node": ">=18" 604 | } 605 | }, 606 | "node_modules/@esbuild/linux-x64": { 607 | "version": "0.25.4", 608 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 609 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 610 | "cpu": [ 611 | "x64" 612 | ], 613 | "dev": true, 614 | "license": "MIT", 615 | "optional": true, 616 | "os": [ 617 | "linux" 618 | ], 619 | "engines": { 620 | "node": ">=18" 621 | } 622 | }, 623 | "node_modules/@esbuild/netbsd-arm64": { 624 | "version": "0.25.4", 625 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 626 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 627 | "cpu": [ 628 | "arm64" 629 | ], 630 | "dev": true, 631 | "license": "MIT", 632 | "optional": true, 633 | "os": [ 634 | "netbsd" 635 | ], 636 | "engines": { 637 | "node": ">=18" 638 | } 639 | }, 640 | "node_modules/@esbuild/netbsd-x64": { 641 | "version": "0.25.4", 642 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 643 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 644 | "cpu": [ 645 | "x64" 646 | ], 647 | "dev": true, 648 | "license": "MIT", 649 | "optional": true, 650 | "os": [ 651 | "netbsd" 652 | ], 653 | "engines": { 654 | "node": ">=18" 655 | } 656 | }, 657 | "node_modules/@esbuild/openbsd-arm64": { 658 | "version": "0.25.4", 659 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 660 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 661 | "cpu": [ 662 | "arm64" 663 | ], 664 | "dev": true, 665 | "license": "MIT", 666 | "optional": true, 667 | "os": [ 668 | "openbsd" 669 | ], 670 | "engines": { 671 | "node": ">=18" 672 | } 673 | }, 674 | "node_modules/@esbuild/openbsd-x64": { 675 | "version": "0.25.4", 676 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 677 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 678 | "cpu": [ 679 | "x64" 680 | ], 681 | "dev": true, 682 | "license": "MIT", 683 | "optional": true, 684 | "os": [ 685 | "openbsd" 686 | ], 687 | "engines": { 688 | "node": ">=18" 689 | } 690 | }, 691 | "node_modules/@esbuild/sunos-x64": { 692 | "version": "0.25.4", 693 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 694 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 695 | "cpu": [ 696 | "x64" 697 | ], 698 | "dev": true, 699 | "license": "MIT", 700 | "optional": true, 701 | "os": [ 702 | "sunos" 703 | ], 704 | "engines": { 705 | "node": ">=18" 706 | } 707 | }, 708 | "node_modules/@esbuild/win32-arm64": { 709 | "version": "0.25.4", 710 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 711 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 712 | "cpu": [ 713 | "arm64" 714 | ], 715 | "dev": true, 716 | "license": "MIT", 717 | "optional": true, 718 | "os": [ 719 | "win32" 720 | ], 721 | "engines": { 722 | "node": ">=18" 723 | } 724 | }, 725 | "node_modules/@esbuild/win32-ia32": { 726 | "version": "0.25.4", 727 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 728 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 729 | "cpu": [ 730 | "ia32" 731 | ], 732 | "dev": true, 733 | "license": "MIT", 734 | "optional": true, 735 | "os": [ 736 | "win32" 737 | ], 738 | "engines": { 739 | "node": ">=18" 740 | } 741 | }, 742 | "node_modules/@esbuild/win32-x64": { 743 | "version": "0.25.4", 744 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 745 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 746 | "cpu": [ 747 | "x64" 748 | ], 749 | "dev": true, 750 | "license": "MIT", 751 | "optional": true, 752 | "os": [ 753 | "win32" 754 | ], 755 | "engines": { 756 | "node": ">=18" 757 | } 758 | }, 759 | "node_modules/@eslint-community/eslint-utils": { 760 | "version": "4.7.0", 761 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", 762 | "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 763 | "dev": true, 764 | "license": "MIT", 765 | "dependencies": { 766 | "eslint-visitor-keys": "^3.4.3" 767 | }, 768 | "engines": { 769 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 770 | }, 771 | "funding": { 772 | "url": "https://opencollective.com/eslint" 773 | }, 774 | "peerDependencies": { 775 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 776 | } 777 | }, 778 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 779 | "version": "3.4.3", 780 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 781 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 782 | "dev": true, 783 | "license": "Apache-2.0", 784 | "engines": { 785 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 786 | }, 787 | "funding": { 788 | "url": "https://opencollective.com/eslint" 789 | } 790 | }, 791 | "node_modules/@eslint-community/regexpp": { 792 | "version": "4.12.1", 793 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 794 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 795 | "dev": true, 796 | "license": "MIT", 797 | "engines": { 798 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 799 | } 800 | }, 801 | "node_modules/@eslint/config-array": { 802 | "version": "0.20.0", 803 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", 804 | "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", 805 | "dev": true, 806 | "license": "Apache-2.0", 807 | "dependencies": { 808 | "@eslint/object-schema": "^2.1.6", 809 | "debug": "^4.3.1", 810 | "minimatch": "^3.1.2" 811 | }, 812 | "engines": { 813 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 814 | } 815 | }, 816 | "node_modules/@eslint/config-helpers": { 817 | "version": "0.2.2", 818 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", 819 | "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", 820 | "dev": true, 821 | "license": "Apache-2.0", 822 | "engines": { 823 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 824 | } 825 | }, 826 | "node_modules/@eslint/core": { 827 | "version": "0.14.0", 828 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", 829 | "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", 830 | "dev": true, 831 | "license": "Apache-2.0", 832 | "dependencies": { 833 | "@types/json-schema": "^7.0.15" 834 | }, 835 | "engines": { 836 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 837 | } 838 | }, 839 | "node_modules/@eslint/eslintrc": { 840 | "version": "3.3.1", 841 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 842 | "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 843 | "dev": true, 844 | "license": "MIT", 845 | "dependencies": { 846 | "ajv": "^6.12.4", 847 | "debug": "^4.3.2", 848 | "espree": "^10.0.1", 849 | "globals": "^14.0.0", 850 | "ignore": "^5.2.0", 851 | "import-fresh": "^3.2.1", 852 | "js-yaml": "^4.1.0", 853 | "minimatch": "^3.1.2", 854 | "strip-json-comments": "^3.1.1" 855 | }, 856 | "engines": { 857 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 858 | }, 859 | "funding": { 860 | "url": "https://opencollective.com/eslint" 861 | } 862 | }, 863 | "node_modules/@eslint/eslintrc/node_modules/globals": { 864 | "version": "14.0.0", 865 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 866 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 867 | "dev": true, 868 | "license": "MIT", 869 | "engines": { 870 | "node": ">=18" 871 | }, 872 | "funding": { 873 | "url": "https://github.com/sponsors/sindresorhus" 874 | } 875 | }, 876 | "node_modules/@eslint/js": { 877 | "version": "9.27.0", 878 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", 879 | "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", 880 | "dev": true, 881 | "license": "MIT", 882 | "engines": { 883 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 884 | }, 885 | "funding": { 886 | "url": "https://eslint.org/donate" 887 | } 888 | }, 889 | "node_modules/@eslint/object-schema": { 890 | "version": "2.1.6", 891 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 892 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 893 | "dev": true, 894 | "license": "Apache-2.0", 895 | "engines": { 896 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 897 | } 898 | }, 899 | "node_modules/@eslint/plugin-kit": { 900 | "version": "0.3.1", 901 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", 902 | "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", 903 | "dev": true, 904 | "license": "Apache-2.0", 905 | "dependencies": { 906 | "@eslint/core": "^0.14.0", 907 | "levn": "^0.4.1" 908 | }, 909 | "engines": { 910 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 911 | } 912 | }, 913 | "node_modules/@humanfs/core": { 914 | "version": "0.19.1", 915 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 916 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 917 | "dev": true, 918 | "license": "Apache-2.0", 919 | "engines": { 920 | "node": ">=18.18.0" 921 | } 922 | }, 923 | "node_modules/@humanfs/node": { 924 | "version": "0.16.6", 925 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 926 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 927 | "dev": true, 928 | "license": "Apache-2.0", 929 | "dependencies": { 930 | "@humanfs/core": "^0.19.1", 931 | "@humanwhocodes/retry": "^0.3.0" 932 | }, 933 | "engines": { 934 | "node": ">=18.18.0" 935 | } 936 | }, 937 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 938 | "version": "0.3.1", 939 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 940 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 941 | "dev": true, 942 | "license": "Apache-2.0", 943 | "engines": { 944 | "node": ">=18.18" 945 | }, 946 | "funding": { 947 | "type": "github", 948 | "url": "https://github.com/sponsors/nzakas" 949 | } 950 | }, 951 | "node_modules/@humanwhocodes/module-importer": { 952 | "version": "1.0.1", 953 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 954 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 955 | "dev": true, 956 | "license": "Apache-2.0", 957 | "engines": { 958 | "node": ">=12.22" 959 | }, 960 | "funding": { 961 | "type": "github", 962 | "url": "https://github.com/sponsors/nzakas" 963 | } 964 | }, 965 | "node_modules/@humanwhocodes/retry": { 966 | "version": "0.4.3", 967 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 968 | "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 969 | "dev": true, 970 | "license": "Apache-2.0", 971 | "engines": { 972 | "node": ">=18.18" 973 | }, 974 | "funding": { 975 | "type": "github", 976 | "url": "https://github.com/sponsors/nzakas" 977 | } 978 | }, 979 | "node_modules/@jridgewell/gen-mapping": { 980 | "version": "0.3.8", 981 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 982 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 983 | "dev": true, 984 | "license": "MIT", 985 | "dependencies": { 986 | "@jridgewell/set-array": "^1.2.1", 987 | "@jridgewell/sourcemap-codec": "^1.4.10", 988 | "@jridgewell/trace-mapping": "^0.3.24" 989 | }, 990 | "engines": { 991 | "node": ">=6.0.0" 992 | } 993 | }, 994 | "node_modules/@jridgewell/resolve-uri": { 995 | "version": "3.1.2", 996 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 997 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "engines": { 1001 | "node": ">=6.0.0" 1002 | } 1003 | }, 1004 | "node_modules/@jridgewell/set-array": { 1005 | "version": "1.2.1", 1006 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 1007 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 1008 | "dev": true, 1009 | "license": "MIT", 1010 | "engines": { 1011 | "node": ">=6.0.0" 1012 | } 1013 | }, 1014 | "node_modules/@jridgewell/sourcemap-codec": { 1015 | "version": "1.5.0", 1016 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1017 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1018 | "license": "MIT" 1019 | }, 1020 | "node_modules/@jridgewell/trace-mapping": { 1021 | "version": "0.3.25", 1022 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1023 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1024 | "dev": true, 1025 | "license": "MIT", 1026 | "dependencies": { 1027 | "@jridgewell/resolve-uri": "^3.1.0", 1028 | "@jridgewell/sourcemap-codec": "^1.4.14" 1029 | } 1030 | }, 1031 | "node_modules/@rollup/rollup-android-arm-eabi": { 1032 | "version": "4.41.0", 1033 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", 1034 | "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", 1035 | "cpu": [ 1036 | "arm" 1037 | ], 1038 | "dev": true, 1039 | "license": "MIT", 1040 | "optional": true, 1041 | "os": [ 1042 | "android" 1043 | ] 1044 | }, 1045 | "node_modules/@rollup/rollup-android-arm64": { 1046 | "version": "4.41.0", 1047 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", 1048 | "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", 1049 | "cpu": [ 1050 | "arm64" 1051 | ], 1052 | "dev": true, 1053 | "license": "MIT", 1054 | "optional": true, 1055 | "os": [ 1056 | "android" 1057 | ] 1058 | }, 1059 | "node_modules/@rollup/rollup-darwin-arm64": { 1060 | "version": "4.41.0", 1061 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", 1062 | "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", 1063 | "cpu": [ 1064 | "arm64" 1065 | ], 1066 | "dev": true, 1067 | "license": "MIT", 1068 | "optional": true, 1069 | "os": [ 1070 | "darwin" 1071 | ] 1072 | }, 1073 | "node_modules/@rollup/rollup-darwin-x64": { 1074 | "version": "4.41.0", 1075 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", 1076 | "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", 1077 | "cpu": [ 1078 | "x64" 1079 | ], 1080 | "dev": true, 1081 | "license": "MIT", 1082 | "optional": true, 1083 | "os": [ 1084 | "darwin" 1085 | ] 1086 | }, 1087 | "node_modules/@rollup/rollup-freebsd-arm64": { 1088 | "version": "4.41.0", 1089 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", 1090 | "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", 1091 | "cpu": [ 1092 | "arm64" 1093 | ], 1094 | "dev": true, 1095 | "license": "MIT", 1096 | "optional": true, 1097 | "os": [ 1098 | "freebsd" 1099 | ] 1100 | }, 1101 | "node_modules/@rollup/rollup-freebsd-x64": { 1102 | "version": "4.41.0", 1103 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", 1104 | "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", 1105 | "cpu": [ 1106 | "x64" 1107 | ], 1108 | "dev": true, 1109 | "license": "MIT", 1110 | "optional": true, 1111 | "os": [ 1112 | "freebsd" 1113 | ] 1114 | }, 1115 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1116 | "version": "4.41.0", 1117 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", 1118 | "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", 1119 | "cpu": [ 1120 | "arm" 1121 | ], 1122 | "dev": true, 1123 | "license": "MIT", 1124 | "optional": true, 1125 | "os": [ 1126 | "linux" 1127 | ] 1128 | }, 1129 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1130 | "version": "4.41.0", 1131 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", 1132 | "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", 1133 | "cpu": [ 1134 | "arm" 1135 | ], 1136 | "dev": true, 1137 | "license": "MIT", 1138 | "optional": true, 1139 | "os": [ 1140 | "linux" 1141 | ] 1142 | }, 1143 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1144 | "version": "4.41.0", 1145 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", 1146 | "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", 1147 | "cpu": [ 1148 | "arm64" 1149 | ], 1150 | "dev": true, 1151 | "license": "MIT", 1152 | "optional": true, 1153 | "os": [ 1154 | "linux" 1155 | ] 1156 | }, 1157 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1158 | "version": "4.41.0", 1159 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", 1160 | "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", 1161 | "cpu": [ 1162 | "arm64" 1163 | ], 1164 | "dev": true, 1165 | "license": "MIT", 1166 | "optional": true, 1167 | "os": [ 1168 | "linux" 1169 | ] 1170 | }, 1171 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1172 | "version": "4.41.0", 1173 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", 1174 | "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", 1175 | "cpu": [ 1176 | "loong64" 1177 | ], 1178 | "dev": true, 1179 | "license": "MIT", 1180 | "optional": true, 1181 | "os": [ 1182 | "linux" 1183 | ] 1184 | }, 1185 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1186 | "version": "4.41.0", 1187 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", 1188 | "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", 1189 | "cpu": [ 1190 | "ppc64" 1191 | ], 1192 | "dev": true, 1193 | "license": "MIT", 1194 | "optional": true, 1195 | "os": [ 1196 | "linux" 1197 | ] 1198 | }, 1199 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1200 | "version": "4.41.0", 1201 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", 1202 | "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", 1203 | "cpu": [ 1204 | "riscv64" 1205 | ], 1206 | "dev": true, 1207 | "license": "MIT", 1208 | "optional": true, 1209 | "os": [ 1210 | "linux" 1211 | ] 1212 | }, 1213 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 1214 | "version": "4.41.0", 1215 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", 1216 | "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", 1217 | "cpu": [ 1218 | "riscv64" 1219 | ], 1220 | "dev": true, 1221 | "license": "MIT", 1222 | "optional": true, 1223 | "os": [ 1224 | "linux" 1225 | ] 1226 | }, 1227 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1228 | "version": "4.41.0", 1229 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", 1230 | "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", 1231 | "cpu": [ 1232 | "s390x" 1233 | ], 1234 | "dev": true, 1235 | "license": "MIT", 1236 | "optional": true, 1237 | "os": [ 1238 | "linux" 1239 | ] 1240 | }, 1241 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1242 | "version": "4.41.0", 1243 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", 1244 | "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", 1245 | "cpu": [ 1246 | "x64" 1247 | ], 1248 | "dev": true, 1249 | "license": "MIT", 1250 | "optional": true, 1251 | "os": [ 1252 | "linux" 1253 | ] 1254 | }, 1255 | "node_modules/@rollup/rollup-linux-x64-musl": { 1256 | "version": "4.41.0", 1257 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", 1258 | "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", 1259 | "cpu": [ 1260 | "x64" 1261 | ], 1262 | "dev": true, 1263 | "license": "MIT", 1264 | "optional": true, 1265 | "os": [ 1266 | "linux" 1267 | ] 1268 | }, 1269 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1270 | "version": "4.41.0", 1271 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", 1272 | "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", 1273 | "cpu": [ 1274 | "arm64" 1275 | ], 1276 | "dev": true, 1277 | "license": "MIT", 1278 | "optional": true, 1279 | "os": [ 1280 | "win32" 1281 | ] 1282 | }, 1283 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1284 | "version": "4.41.0", 1285 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", 1286 | "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", 1287 | "cpu": [ 1288 | "ia32" 1289 | ], 1290 | "dev": true, 1291 | "license": "MIT", 1292 | "optional": true, 1293 | "os": [ 1294 | "win32" 1295 | ] 1296 | }, 1297 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1298 | "version": "4.41.0", 1299 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", 1300 | "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", 1301 | "cpu": [ 1302 | "x64" 1303 | ], 1304 | "dev": true, 1305 | "license": "MIT", 1306 | "optional": true, 1307 | "os": [ 1308 | "win32" 1309 | ] 1310 | }, 1311 | "node_modules/@types/babel__core": { 1312 | "version": "7.20.5", 1313 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 1314 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1315 | "dev": true, 1316 | "license": "MIT", 1317 | "dependencies": { 1318 | "@babel/parser": "^7.20.7", 1319 | "@babel/types": "^7.20.7", 1320 | "@types/babel__generator": "*", 1321 | "@types/babel__template": "*", 1322 | "@types/babel__traverse": "*" 1323 | } 1324 | }, 1325 | "node_modules/@types/babel__generator": { 1326 | "version": "7.27.0", 1327 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", 1328 | "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 1329 | "dev": true, 1330 | "license": "MIT", 1331 | "dependencies": { 1332 | "@babel/types": "^7.0.0" 1333 | } 1334 | }, 1335 | "node_modules/@types/babel__template": { 1336 | "version": "7.4.4", 1337 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 1338 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1339 | "dev": true, 1340 | "license": "MIT", 1341 | "dependencies": { 1342 | "@babel/parser": "^7.1.0", 1343 | "@babel/types": "^7.0.0" 1344 | } 1345 | }, 1346 | "node_modules/@types/babel__traverse": { 1347 | "version": "7.20.7", 1348 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", 1349 | "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", 1350 | "dev": true, 1351 | "license": "MIT", 1352 | "dependencies": { 1353 | "@babel/types": "^7.20.7" 1354 | } 1355 | }, 1356 | "node_modules/@types/estree": { 1357 | "version": "1.0.7", 1358 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 1359 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1360 | "dev": true, 1361 | "license": "MIT" 1362 | }, 1363 | "node_modules/@types/js-cookie": { 1364 | "version": "2.2.7", 1365 | "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", 1366 | "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==", 1367 | "license": "MIT" 1368 | }, 1369 | "node_modules/@types/json-schema": { 1370 | "version": "7.0.15", 1371 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1372 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1373 | "dev": true, 1374 | "license": "MIT" 1375 | }, 1376 | "node_modules/@types/react": { 1377 | "version": "19.1.4", 1378 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.4.tgz", 1379 | "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", 1380 | "dev": true, 1381 | "license": "MIT", 1382 | "dependencies": { 1383 | "csstype": "^3.0.2" 1384 | } 1385 | }, 1386 | "node_modules/@types/react-dom": { 1387 | "version": "19.1.5", 1388 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", 1389 | "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", 1390 | "dev": true, 1391 | "license": "MIT", 1392 | "peerDependencies": { 1393 | "@types/react": "^19.0.0" 1394 | } 1395 | }, 1396 | "node_modules/@vitejs/plugin-react": { 1397 | "version": "4.4.1", 1398 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", 1399 | "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", 1400 | "dev": true, 1401 | "license": "MIT", 1402 | "dependencies": { 1403 | "@babel/core": "^7.26.10", 1404 | "@babel/plugin-transform-react-jsx-self": "^7.25.9", 1405 | "@babel/plugin-transform-react-jsx-source": "^7.25.9", 1406 | "@types/babel__core": "^7.20.5", 1407 | "react-refresh": "^0.17.0" 1408 | }, 1409 | "engines": { 1410 | "node": "^14.18.0 || >=16.0.0" 1411 | }, 1412 | "peerDependencies": { 1413 | "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" 1414 | } 1415 | }, 1416 | "node_modules/@xobotyi/scrollbar-width": { 1417 | "version": "1.9.5", 1418 | "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", 1419 | "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", 1420 | "license": "MIT" 1421 | }, 1422 | "node_modules/acorn": { 1423 | "version": "8.14.1", 1424 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 1425 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 1426 | "dev": true, 1427 | "license": "MIT", 1428 | "bin": { 1429 | "acorn": "bin/acorn" 1430 | }, 1431 | "engines": { 1432 | "node": ">=0.4.0" 1433 | } 1434 | }, 1435 | "node_modules/acorn-jsx": { 1436 | "version": "5.3.2", 1437 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1438 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1439 | "dev": true, 1440 | "license": "MIT", 1441 | "peerDependencies": { 1442 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1443 | } 1444 | }, 1445 | "node_modules/ajv": { 1446 | "version": "6.12.6", 1447 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1448 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1449 | "dev": true, 1450 | "license": "MIT", 1451 | "dependencies": { 1452 | "fast-deep-equal": "^3.1.1", 1453 | "fast-json-stable-stringify": "^2.0.0", 1454 | "json-schema-traverse": "^0.4.1", 1455 | "uri-js": "^4.2.2" 1456 | }, 1457 | "funding": { 1458 | "type": "github", 1459 | "url": "https://github.com/sponsors/epoberezkin" 1460 | } 1461 | }, 1462 | "node_modules/ansi-styles": { 1463 | "version": "4.3.0", 1464 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1465 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1466 | "dev": true, 1467 | "license": "MIT", 1468 | "dependencies": { 1469 | "color-convert": "^2.0.1" 1470 | }, 1471 | "engines": { 1472 | "node": ">=8" 1473 | }, 1474 | "funding": { 1475 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1476 | } 1477 | }, 1478 | "node_modules/argparse": { 1479 | "version": "2.0.1", 1480 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1481 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1482 | "dev": true, 1483 | "license": "Python-2.0" 1484 | }, 1485 | "node_modules/balanced-match": { 1486 | "version": "1.0.2", 1487 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1488 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1489 | "dev": true, 1490 | "license": "MIT" 1491 | }, 1492 | "node_modules/brace-expansion": { 1493 | "version": "1.1.11", 1494 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1495 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1496 | "dev": true, 1497 | "license": "MIT", 1498 | "dependencies": { 1499 | "balanced-match": "^1.0.0", 1500 | "concat-map": "0.0.1" 1501 | } 1502 | }, 1503 | "node_modules/browserslist": { 1504 | "version": "4.24.5", 1505 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", 1506 | "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", 1507 | "dev": true, 1508 | "funding": [ 1509 | { 1510 | "type": "opencollective", 1511 | "url": "https://opencollective.com/browserslist" 1512 | }, 1513 | { 1514 | "type": "tidelift", 1515 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1516 | }, 1517 | { 1518 | "type": "github", 1519 | "url": "https://github.com/sponsors/ai" 1520 | } 1521 | ], 1522 | "license": "MIT", 1523 | "dependencies": { 1524 | "caniuse-lite": "^1.0.30001716", 1525 | "electron-to-chromium": "^1.5.149", 1526 | "node-releases": "^2.0.19", 1527 | "update-browserslist-db": "^1.1.3" 1528 | }, 1529 | "bin": { 1530 | "browserslist": "cli.js" 1531 | }, 1532 | "engines": { 1533 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1534 | } 1535 | }, 1536 | "node_modules/callsites": { 1537 | "version": "3.1.0", 1538 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1539 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1540 | "dev": true, 1541 | "license": "MIT", 1542 | "engines": { 1543 | "node": ">=6" 1544 | } 1545 | }, 1546 | "node_modules/caniuse-lite": { 1547 | "version": "1.0.30001718", 1548 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", 1549 | "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", 1550 | "dev": true, 1551 | "funding": [ 1552 | { 1553 | "type": "opencollective", 1554 | "url": "https://opencollective.com/browserslist" 1555 | }, 1556 | { 1557 | "type": "tidelift", 1558 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1559 | }, 1560 | { 1561 | "type": "github", 1562 | "url": "https://github.com/sponsors/ai" 1563 | } 1564 | ], 1565 | "license": "CC-BY-4.0" 1566 | }, 1567 | "node_modules/chalk": { 1568 | "version": "4.1.2", 1569 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1570 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1571 | "dev": true, 1572 | "license": "MIT", 1573 | "dependencies": { 1574 | "ansi-styles": "^4.1.0", 1575 | "supports-color": "^7.1.0" 1576 | }, 1577 | "engines": { 1578 | "node": ">=10" 1579 | }, 1580 | "funding": { 1581 | "url": "https://github.com/chalk/chalk?sponsor=1" 1582 | } 1583 | }, 1584 | "node_modules/color-convert": { 1585 | "version": "2.0.1", 1586 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1587 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1588 | "dev": true, 1589 | "license": "MIT", 1590 | "dependencies": { 1591 | "color-name": "~1.1.4" 1592 | }, 1593 | "engines": { 1594 | "node": ">=7.0.0" 1595 | } 1596 | }, 1597 | "node_modules/color-name": { 1598 | "version": "1.1.4", 1599 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1600 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1601 | "dev": true, 1602 | "license": "MIT" 1603 | }, 1604 | "node_modules/concat-map": { 1605 | "version": "0.0.1", 1606 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1607 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1608 | "dev": true, 1609 | "license": "MIT" 1610 | }, 1611 | "node_modules/convert-source-map": { 1612 | "version": "2.0.0", 1613 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1614 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1615 | "dev": true, 1616 | "license": "MIT" 1617 | }, 1618 | "node_modules/cookie": { 1619 | "version": "1.0.2", 1620 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", 1621 | "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", 1622 | "license": "MIT", 1623 | "engines": { 1624 | "node": ">=18" 1625 | } 1626 | }, 1627 | "node_modules/copy-to-clipboard": { 1628 | "version": "3.3.3", 1629 | "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", 1630 | "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", 1631 | "license": "MIT", 1632 | "dependencies": { 1633 | "toggle-selection": "^1.0.6" 1634 | } 1635 | }, 1636 | "node_modules/cross-spawn": { 1637 | "version": "7.0.6", 1638 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1639 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1640 | "dev": true, 1641 | "license": "MIT", 1642 | "dependencies": { 1643 | "path-key": "^3.1.0", 1644 | "shebang-command": "^2.0.0", 1645 | "which": "^2.0.1" 1646 | }, 1647 | "engines": { 1648 | "node": ">= 8" 1649 | } 1650 | }, 1651 | "node_modules/css-in-js-utils": { 1652 | "version": "3.1.0", 1653 | "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", 1654 | "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", 1655 | "license": "MIT", 1656 | "dependencies": { 1657 | "hyphenate-style-name": "^1.0.3" 1658 | } 1659 | }, 1660 | "node_modules/css-tree": { 1661 | "version": "1.1.3", 1662 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", 1663 | "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", 1664 | "license": "MIT", 1665 | "dependencies": { 1666 | "mdn-data": "2.0.14", 1667 | "source-map": "^0.6.1" 1668 | }, 1669 | "engines": { 1670 | "node": ">=8.0.0" 1671 | } 1672 | }, 1673 | "node_modules/csstype": { 1674 | "version": "3.1.3", 1675 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1676 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1677 | "license": "MIT" 1678 | }, 1679 | "node_modules/debug": { 1680 | "version": "4.4.1", 1681 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 1682 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 1683 | "dev": true, 1684 | "license": "MIT", 1685 | "dependencies": { 1686 | "ms": "^2.1.3" 1687 | }, 1688 | "engines": { 1689 | "node": ">=6.0" 1690 | }, 1691 | "peerDependenciesMeta": { 1692 | "supports-color": { 1693 | "optional": true 1694 | } 1695 | } 1696 | }, 1697 | "node_modules/deep-is": { 1698 | "version": "0.1.4", 1699 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1700 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1701 | "dev": true, 1702 | "license": "MIT" 1703 | }, 1704 | "node_modules/electron-to-chromium": { 1705 | "version": "1.5.155", 1706 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", 1707 | "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", 1708 | "dev": true, 1709 | "license": "ISC" 1710 | }, 1711 | "node_modules/error-stack-parser": { 1712 | "version": "2.1.4", 1713 | "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", 1714 | "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", 1715 | "license": "MIT", 1716 | "dependencies": { 1717 | "stackframe": "^1.3.4" 1718 | } 1719 | }, 1720 | "node_modules/esbuild": { 1721 | "version": "0.25.4", 1722 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 1723 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 1724 | "dev": true, 1725 | "hasInstallScript": true, 1726 | "license": "MIT", 1727 | "bin": { 1728 | "esbuild": "bin/esbuild" 1729 | }, 1730 | "engines": { 1731 | "node": ">=18" 1732 | }, 1733 | "optionalDependencies": { 1734 | "@esbuild/aix-ppc64": "0.25.4", 1735 | "@esbuild/android-arm": "0.25.4", 1736 | "@esbuild/android-arm64": "0.25.4", 1737 | "@esbuild/android-x64": "0.25.4", 1738 | "@esbuild/darwin-arm64": "0.25.4", 1739 | "@esbuild/darwin-x64": "0.25.4", 1740 | "@esbuild/freebsd-arm64": "0.25.4", 1741 | "@esbuild/freebsd-x64": "0.25.4", 1742 | "@esbuild/linux-arm": "0.25.4", 1743 | "@esbuild/linux-arm64": "0.25.4", 1744 | "@esbuild/linux-ia32": "0.25.4", 1745 | "@esbuild/linux-loong64": "0.25.4", 1746 | "@esbuild/linux-mips64el": "0.25.4", 1747 | "@esbuild/linux-ppc64": "0.25.4", 1748 | "@esbuild/linux-riscv64": "0.25.4", 1749 | "@esbuild/linux-s390x": "0.25.4", 1750 | "@esbuild/linux-x64": "0.25.4", 1751 | "@esbuild/netbsd-arm64": "0.25.4", 1752 | "@esbuild/netbsd-x64": "0.25.4", 1753 | "@esbuild/openbsd-arm64": "0.25.4", 1754 | "@esbuild/openbsd-x64": "0.25.4", 1755 | "@esbuild/sunos-x64": "0.25.4", 1756 | "@esbuild/win32-arm64": "0.25.4", 1757 | "@esbuild/win32-ia32": "0.25.4", 1758 | "@esbuild/win32-x64": "0.25.4" 1759 | } 1760 | }, 1761 | "node_modules/escalade": { 1762 | "version": "3.2.0", 1763 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1764 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1765 | "dev": true, 1766 | "license": "MIT", 1767 | "engines": { 1768 | "node": ">=6" 1769 | } 1770 | }, 1771 | "node_modules/escape-string-regexp": { 1772 | "version": "4.0.0", 1773 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1774 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1775 | "dev": true, 1776 | "license": "MIT", 1777 | "engines": { 1778 | "node": ">=10" 1779 | }, 1780 | "funding": { 1781 | "url": "https://github.com/sponsors/sindresorhus" 1782 | } 1783 | }, 1784 | "node_modules/eslint": { 1785 | "version": "9.27.0", 1786 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", 1787 | "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", 1788 | "dev": true, 1789 | "license": "MIT", 1790 | "dependencies": { 1791 | "@eslint-community/eslint-utils": "^4.2.0", 1792 | "@eslint-community/regexpp": "^4.12.1", 1793 | "@eslint/config-array": "^0.20.0", 1794 | "@eslint/config-helpers": "^0.2.1", 1795 | "@eslint/core": "^0.14.0", 1796 | "@eslint/eslintrc": "^3.3.1", 1797 | "@eslint/js": "9.27.0", 1798 | "@eslint/plugin-kit": "^0.3.1", 1799 | "@humanfs/node": "^0.16.6", 1800 | "@humanwhocodes/module-importer": "^1.0.1", 1801 | "@humanwhocodes/retry": "^0.4.2", 1802 | "@types/estree": "^1.0.6", 1803 | "@types/json-schema": "^7.0.15", 1804 | "ajv": "^6.12.4", 1805 | "chalk": "^4.0.0", 1806 | "cross-spawn": "^7.0.6", 1807 | "debug": "^4.3.2", 1808 | "escape-string-regexp": "^4.0.0", 1809 | "eslint-scope": "^8.3.0", 1810 | "eslint-visitor-keys": "^4.2.0", 1811 | "espree": "^10.3.0", 1812 | "esquery": "^1.5.0", 1813 | "esutils": "^2.0.2", 1814 | "fast-deep-equal": "^3.1.3", 1815 | "file-entry-cache": "^8.0.0", 1816 | "find-up": "^5.0.0", 1817 | "glob-parent": "^6.0.2", 1818 | "ignore": "^5.2.0", 1819 | "imurmurhash": "^0.1.4", 1820 | "is-glob": "^4.0.0", 1821 | "json-stable-stringify-without-jsonify": "^1.0.1", 1822 | "lodash.merge": "^4.6.2", 1823 | "minimatch": "^3.1.2", 1824 | "natural-compare": "^1.4.0", 1825 | "optionator": "^0.9.3" 1826 | }, 1827 | "bin": { 1828 | "eslint": "bin/eslint.js" 1829 | }, 1830 | "engines": { 1831 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1832 | }, 1833 | "funding": { 1834 | "url": "https://eslint.org/donate" 1835 | }, 1836 | "peerDependencies": { 1837 | "jiti": "*" 1838 | }, 1839 | "peerDependenciesMeta": { 1840 | "jiti": { 1841 | "optional": true 1842 | } 1843 | } 1844 | }, 1845 | "node_modules/eslint-plugin-react-hooks": { 1846 | "version": "5.2.0", 1847 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", 1848 | "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", 1849 | "dev": true, 1850 | "license": "MIT", 1851 | "engines": { 1852 | "node": ">=10" 1853 | }, 1854 | "peerDependencies": { 1855 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 1856 | } 1857 | }, 1858 | "node_modules/eslint-plugin-react-refresh": { 1859 | "version": "0.4.20", 1860 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", 1861 | "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", 1862 | "dev": true, 1863 | "license": "MIT", 1864 | "peerDependencies": { 1865 | "eslint": ">=8.40" 1866 | } 1867 | }, 1868 | "node_modules/eslint-scope": { 1869 | "version": "8.3.0", 1870 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", 1871 | "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", 1872 | "dev": true, 1873 | "license": "BSD-2-Clause", 1874 | "dependencies": { 1875 | "esrecurse": "^4.3.0", 1876 | "estraverse": "^5.2.0" 1877 | }, 1878 | "engines": { 1879 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1880 | }, 1881 | "funding": { 1882 | "url": "https://opencollective.com/eslint" 1883 | } 1884 | }, 1885 | "node_modules/eslint-visitor-keys": { 1886 | "version": "4.2.0", 1887 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1888 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1889 | "dev": true, 1890 | "license": "Apache-2.0", 1891 | "engines": { 1892 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1893 | }, 1894 | "funding": { 1895 | "url": "https://opencollective.com/eslint" 1896 | } 1897 | }, 1898 | "node_modules/espree": { 1899 | "version": "10.3.0", 1900 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 1901 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 1902 | "dev": true, 1903 | "license": "BSD-2-Clause", 1904 | "dependencies": { 1905 | "acorn": "^8.14.0", 1906 | "acorn-jsx": "^5.3.2", 1907 | "eslint-visitor-keys": "^4.2.0" 1908 | }, 1909 | "engines": { 1910 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1911 | }, 1912 | "funding": { 1913 | "url": "https://opencollective.com/eslint" 1914 | } 1915 | }, 1916 | "node_modules/esquery": { 1917 | "version": "1.6.0", 1918 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1919 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1920 | "dev": true, 1921 | "license": "BSD-3-Clause", 1922 | "dependencies": { 1923 | "estraverse": "^5.1.0" 1924 | }, 1925 | "engines": { 1926 | "node": ">=0.10" 1927 | } 1928 | }, 1929 | "node_modules/esrecurse": { 1930 | "version": "4.3.0", 1931 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1932 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1933 | "dev": true, 1934 | "license": "BSD-2-Clause", 1935 | "dependencies": { 1936 | "estraverse": "^5.2.0" 1937 | }, 1938 | "engines": { 1939 | "node": ">=4.0" 1940 | } 1941 | }, 1942 | "node_modules/estraverse": { 1943 | "version": "5.3.0", 1944 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1945 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1946 | "dev": true, 1947 | "license": "BSD-2-Clause", 1948 | "engines": { 1949 | "node": ">=4.0" 1950 | } 1951 | }, 1952 | "node_modules/esutils": { 1953 | "version": "2.0.3", 1954 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1955 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1956 | "dev": true, 1957 | "license": "BSD-2-Clause", 1958 | "engines": { 1959 | "node": ">=0.10.0" 1960 | } 1961 | }, 1962 | "node_modules/fast-deep-equal": { 1963 | "version": "3.1.3", 1964 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1965 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1966 | "license": "MIT" 1967 | }, 1968 | "node_modules/fast-json-stable-stringify": { 1969 | "version": "2.1.0", 1970 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1971 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1972 | "dev": true, 1973 | "license": "MIT" 1974 | }, 1975 | "node_modules/fast-levenshtein": { 1976 | "version": "2.0.6", 1977 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1978 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1979 | "dev": true, 1980 | "license": "MIT" 1981 | }, 1982 | "node_modules/fast-shallow-equal": { 1983 | "version": "1.0.0", 1984 | "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", 1985 | "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" 1986 | }, 1987 | "node_modules/fastest-stable-stringify": { 1988 | "version": "2.0.2", 1989 | "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", 1990 | "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", 1991 | "license": "MIT" 1992 | }, 1993 | "node_modules/fdir": { 1994 | "version": "6.4.4", 1995 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 1996 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 1997 | "dev": true, 1998 | "license": "MIT", 1999 | "peerDependencies": { 2000 | "picomatch": "^3 || ^4" 2001 | }, 2002 | "peerDependenciesMeta": { 2003 | "picomatch": { 2004 | "optional": true 2005 | } 2006 | } 2007 | }, 2008 | "node_modules/file-entry-cache": { 2009 | "version": "8.0.0", 2010 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2011 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2012 | "dev": true, 2013 | "license": "MIT", 2014 | "dependencies": { 2015 | "flat-cache": "^4.0.0" 2016 | }, 2017 | "engines": { 2018 | "node": ">=16.0.0" 2019 | } 2020 | }, 2021 | "node_modules/find-up": { 2022 | "version": "5.0.0", 2023 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2024 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2025 | "dev": true, 2026 | "license": "MIT", 2027 | "dependencies": { 2028 | "locate-path": "^6.0.0", 2029 | "path-exists": "^4.0.0" 2030 | }, 2031 | "engines": { 2032 | "node": ">=10" 2033 | }, 2034 | "funding": { 2035 | "url": "https://github.com/sponsors/sindresorhus" 2036 | } 2037 | }, 2038 | "node_modules/flat-cache": { 2039 | "version": "4.0.1", 2040 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 2041 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2042 | "dev": true, 2043 | "license": "MIT", 2044 | "dependencies": { 2045 | "flatted": "^3.2.9", 2046 | "keyv": "^4.5.4" 2047 | }, 2048 | "engines": { 2049 | "node": ">=16" 2050 | } 2051 | }, 2052 | "node_modules/flatted": { 2053 | "version": "3.3.3", 2054 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 2055 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2056 | "dev": true, 2057 | "license": "ISC" 2058 | }, 2059 | "node_modules/fsevents": { 2060 | "version": "2.3.3", 2061 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2062 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2063 | "dev": true, 2064 | "hasInstallScript": true, 2065 | "license": "MIT", 2066 | "optional": true, 2067 | "os": [ 2068 | "darwin" 2069 | ], 2070 | "engines": { 2071 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2072 | } 2073 | }, 2074 | "node_modules/gensync": { 2075 | "version": "1.0.0-beta.2", 2076 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2077 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2078 | "dev": true, 2079 | "license": "MIT", 2080 | "engines": { 2081 | "node": ">=6.9.0" 2082 | } 2083 | }, 2084 | "node_modules/glob-parent": { 2085 | "version": "6.0.2", 2086 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2087 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2088 | "dev": true, 2089 | "license": "ISC", 2090 | "dependencies": { 2091 | "is-glob": "^4.0.3" 2092 | }, 2093 | "engines": { 2094 | "node": ">=10.13.0" 2095 | } 2096 | }, 2097 | "node_modules/globals": { 2098 | "version": "16.1.0", 2099 | "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", 2100 | "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", 2101 | "dev": true, 2102 | "license": "MIT", 2103 | "engines": { 2104 | "node": ">=18" 2105 | }, 2106 | "funding": { 2107 | "url": "https://github.com/sponsors/sindresorhus" 2108 | } 2109 | }, 2110 | "node_modules/has-flag": { 2111 | "version": "4.0.0", 2112 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2113 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2114 | "dev": true, 2115 | "license": "MIT", 2116 | "engines": { 2117 | "node": ">=8" 2118 | } 2119 | }, 2120 | "node_modules/hyphenate-style-name": { 2121 | "version": "1.1.0", 2122 | "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", 2123 | "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", 2124 | "license": "BSD-3-Clause" 2125 | }, 2126 | "node_modules/ignore": { 2127 | "version": "5.3.2", 2128 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 2129 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 2130 | "dev": true, 2131 | "license": "MIT", 2132 | "engines": { 2133 | "node": ">= 4" 2134 | } 2135 | }, 2136 | "node_modules/import-fresh": { 2137 | "version": "3.3.1", 2138 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 2139 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 2140 | "dev": true, 2141 | "license": "MIT", 2142 | "dependencies": { 2143 | "parent-module": "^1.0.0", 2144 | "resolve-from": "^4.0.0" 2145 | }, 2146 | "engines": { 2147 | "node": ">=6" 2148 | }, 2149 | "funding": { 2150 | "url": "https://github.com/sponsors/sindresorhus" 2151 | } 2152 | }, 2153 | "node_modules/imurmurhash": { 2154 | "version": "0.1.4", 2155 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2156 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2157 | "dev": true, 2158 | "license": "MIT", 2159 | "engines": { 2160 | "node": ">=0.8.19" 2161 | } 2162 | }, 2163 | "node_modules/inline-style-prefixer": { 2164 | "version": "7.0.1", 2165 | "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", 2166 | "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", 2167 | "license": "MIT", 2168 | "dependencies": { 2169 | "css-in-js-utils": "^3.1.0" 2170 | } 2171 | }, 2172 | "node_modules/is-extglob": { 2173 | "version": "2.1.1", 2174 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2175 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2176 | "dev": true, 2177 | "license": "MIT", 2178 | "engines": { 2179 | "node": ">=0.10.0" 2180 | } 2181 | }, 2182 | "node_modules/is-glob": { 2183 | "version": "4.0.3", 2184 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2185 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2186 | "dev": true, 2187 | "license": "MIT", 2188 | "dependencies": { 2189 | "is-extglob": "^2.1.1" 2190 | }, 2191 | "engines": { 2192 | "node": ">=0.10.0" 2193 | } 2194 | }, 2195 | "node_modules/isexe": { 2196 | "version": "2.0.0", 2197 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2198 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2199 | "dev": true, 2200 | "license": "ISC" 2201 | }, 2202 | "node_modules/js-cookie": { 2203 | "version": "2.2.1", 2204 | "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", 2205 | "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", 2206 | "license": "MIT" 2207 | }, 2208 | "node_modules/js-tokens": { 2209 | "version": "4.0.0", 2210 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2211 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2212 | "dev": true, 2213 | "license": "MIT" 2214 | }, 2215 | "node_modules/js-yaml": { 2216 | "version": "4.1.0", 2217 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2218 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2219 | "dev": true, 2220 | "license": "MIT", 2221 | "dependencies": { 2222 | "argparse": "^2.0.1" 2223 | }, 2224 | "bin": { 2225 | "js-yaml": "bin/js-yaml.js" 2226 | } 2227 | }, 2228 | "node_modules/jsesc": { 2229 | "version": "3.1.0", 2230 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 2231 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2232 | "dev": true, 2233 | "license": "MIT", 2234 | "bin": { 2235 | "jsesc": "bin/jsesc" 2236 | }, 2237 | "engines": { 2238 | "node": ">=6" 2239 | } 2240 | }, 2241 | "node_modules/json-buffer": { 2242 | "version": "3.0.1", 2243 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2244 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2245 | "dev": true, 2246 | "license": "MIT" 2247 | }, 2248 | "node_modules/json-schema-traverse": { 2249 | "version": "0.4.1", 2250 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2251 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2252 | "dev": true, 2253 | "license": "MIT" 2254 | }, 2255 | "node_modules/json-stable-stringify-without-jsonify": { 2256 | "version": "1.0.1", 2257 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2258 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2259 | "dev": true, 2260 | "license": "MIT" 2261 | }, 2262 | "node_modules/json5": { 2263 | "version": "2.2.3", 2264 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2265 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2266 | "dev": true, 2267 | "license": "MIT", 2268 | "bin": { 2269 | "json5": "lib/cli.js" 2270 | }, 2271 | "engines": { 2272 | "node": ">=6" 2273 | } 2274 | }, 2275 | "node_modules/keyv": { 2276 | "version": "4.5.4", 2277 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2278 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2279 | "dev": true, 2280 | "license": "MIT", 2281 | "dependencies": { 2282 | "json-buffer": "3.0.1" 2283 | } 2284 | }, 2285 | "node_modules/levn": { 2286 | "version": "0.4.1", 2287 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2288 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2289 | "dev": true, 2290 | "license": "MIT", 2291 | "dependencies": { 2292 | "prelude-ls": "^1.2.1", 2293 | "type-check": "~0.4.0" 2294 | }, 2295 | "engines": { 2296 | "node": ">= 0.8.0" 2297 | } 2298 | }, 2299 | "node_modules/locate-path": { 2300 | "version": "6.0.0", 2301 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2302 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2303 | "dev": true, 2304 | "license": "MIT", 2305 | "dependencies": { 2306 | "p-locate": "^5.0.0" 2307 | }, 2308 | "engines": { 2309 | "node": ">=10" 2310 | }, 2311 | "funding": { 2312 | "url": "https://github.com/sponsors/sindresorhus" 2313 | } 2314 | }, 2315 | "node_modules/lodash.merge": { 2316 | "version": "4.6.2", 2317 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2318 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2319 | "dev": true, 2320 | "license": "MIT" 2321 | }, 2322 | "node_modules/lru-cache": { 2323 | "version": "5.1.1", 2324 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2325 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2326 | "dev": true, 2327 | "license": "ISC", 2328 | "dependencies": { 2329 | "yallist": "^3.0.2" 2330 | } 2331 | }, 2332 | "node_modules/mdn-data": { 2333 | "version": "2.0.14", 2334 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", 2335 | "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", 2336 | "license": "CC0-1.0" 2337 | }, 2338 | "node_modules/minimatch": { 2339 | "version": "3.1.2", 2340 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2341 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2342 | "dev": true, 2343 | "license": "ISC", 2344 | "dependencies": { 2345 | "brace-expansion": "^1.1.7" 2346 | }, 2347 | "engines": { 2348 | "node": "*" 2349 | } 2350 | }, 2351 | "node_modules/ms": { 2352 | "version": "2.1.3", 2353 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2354 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2355 | "dev": true, 2356 | "license": "MIT" 2357 | }, 2358 | "node_modules/nano-css": { 2359 | "version": "5.6.2", 2360 | "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", 2361 | "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", 2362 | "license": "Unlicense", 2363 | "dependencies": { 2364 | "@jridgewell/sourcemap-codec": "^1.4.15", 2365 | "css-tree": "^1.1.2", 2366 | "csstype": "^3.1.2", 2367 | "fastest-stable-stringify": "^2.0.2", 2368 | "inline-style-prefixer": "^7.0.1", 2369 | "rtl-css-js": "^1.16.1", 2370 | "stacktrace-js": "^2.0.2", 2371 | "stylis": "^4.3.0" 2372 | }, 2373 | "peerDependencies": { 2374 | "react": "*", 2375 | "react-dom": "*" 2376 | } 2377 | }, 2378 | "node_modules/nanoid": { 2379 | "version": "3.3.11", 2380 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 2381 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 2382 | "dev": true, 2383 | "funding": [ 2384 | { 2385 | "type": "github", 2386 | "url": "https://github.com/sponsors/ai" 2387 | } 2388 | ], 2389 | "license": "MIT", 2390 | "bin": { 2391 | "nanoid": "bin/nanoid.cjs" 2392 | }, 2393 | "engines": { 2394 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2395 | } 2396 | }, 2397 | "node_modules/natural-compare": { 2398 | "version": "1.4.0", 2399 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2400 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2401 | "dev": true, 2402 | "license": "MIT" 2403 | }, 2404 | "node_modules/node-releases": { 2405 | "version": "2.0.19", 2406 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 2407 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2408 | "dev": true, 2409 | "license": "MIT" 2410 | }, 2411 | "node_modules/optionator": { 2412 | "version": "0.9.4", 2413 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 2414 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 2415 | "dev": true, 2416 | "license": "MIT", 2417 | "dependencies": { 2418 | "deep-is": "^0.1.3", 2419 | "fast-levenshtein": "^2.0.6", 2420 | "levn": "^0.4.1", 2421 | "prelude-ls": "^1.2.1", 2422 | "type-check": "^0.4.0", 2423 | "word-wrap": "^1.2.5" 2424 | }, 2425 | "engines": { 2426 | "node": ">= 0.8.0" 2427 | } 2428 | }, 2429 | "node_modules/p-limit": { 2430 | "version": "3.1.0", 2431 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2432 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2433 | "dev": true, 2434 | "license": "MIT", 2435 | "dependencies": { 2436 | "yocto-queue": "^0.1.0" 2437 | }, 2438 | "engines": { 2439 | "node": ">=10" 2440 | }, 2441 | "funding": { 2442 | "url": "https://github.com/sponsors/sindresorhus" 2443 | } 2444 | }, 2445 | "node_modules/p-locate": { 2446 | "version": "5.0.0", 2447 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2448 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2449 | "dev": true, 2450 | "license": "MIT", 2451 | "dependencies": { 2452 | "p-limit": "^3.0.2" 2453 | }, 2454 | "engines": { 2455 | "node": ">=10" 2456 | }, 2457 | "funding": { 2458 | "url": "https://github.com/sponsors/sindresorhus" 2459 | } 2460 | }, 2461 | "node_modules/parent-module": { 2462 | "version": "1.0.1", 2463 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2464 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2465 | "dev": true, 2466 | "license": "MIT", 2467 | "dependencies": { 2468 | "callsites": "^3.0.0" 2469 | }, 2470 | "engines": { 2471 | "node": ">=6" 2472 | } 2473 | }, 2474 | "node_modules/path-exists": { 2475 | "version": "4.0.0", 2476 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2477 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2478 | "dev": true, 2479 | "license": "MIT", 2480 | "engines": { 2481 | "node": ">=8" 2482 | } 2483 | }, 2484 | "node_modules/path-key": { 2485 | "version": "3.1.1", 2486 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2487 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2488 | "dev": true, 2489 | "license": "MIT", 2490 | "engines": { 2491 | "node": ">=8" 2492 | } 2493 | }, 2494 | "node_modules/picocolors": { 2495 | "version": "1.1.1", 2496 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2497 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2498 | "dev": true, 2499 | "license": "ISC" 2500 | }, 2501 | "node_modules/picomatch": { 2502 | "version": "4.0.2", 2503 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 2504 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 2505 | "dev": true, 2506 | "license": "MIT", 2507 | "engines": { 2508 | "node": ">=12" 2509 | }, 2510 | "funding": { 2511 | "url": "https://github.com/sponsors/jonschlinkert" 2512 | } 2513 | }, 2514 | "node_modules/postcss": { 2515 | "version": "8.5.3", 2516 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 2517 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 2518 | "dev": true, 2519 | "funding": [ 2520 | { 2521 | "type": "opencollective", 2522 | "url": "https://opencollective.com/postcss/" 2523 | }, 2524 | { 2525 | "type": "tidelift", 2526 | "url": "https://tidelift.com/funding/github/npm/postcss" 2527 | }, 2528 | { 2529 | "type": "github", 2530 | "url": "https://github.com/sponsors/ai" 2531 | } 2532 | ], 2533 | "license": "MIT", 2534 | "dependencies": { 2535 | "nanoid": "^3.3.8", 2536 | "picocolors": "^1.1.1", 2537 | "source-map-js": "^1.2.1" 2538 | }, 2539 | "engines": { 2540 | "node": "^10 || ^12 || >=14" 2541 | } 2542 | }, 2543 | "node_modules/prelude-ls": { 2544 | "version": "1.2.1", 2545 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2546 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2547 | "dev": true, 2548 | "license": "MIT", 2549 | "engines": { 2550 | "node": ">= 0.8.0" 2551 | } 2552 | }, 2553 | "node_modules/punycode": { 2554 | "version": "2.3.1", 2555 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2556 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2557 | "dev": true, 2558 | "license": "MIT", 2559 | "engines": { 2560 | "node": ">=6" 2561 | } 2562 | }, 2563 | "node_modules/react": { 2564 | "version": "19.1.0", 2565 | "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", 2566 | "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", 2567 | "license": "MIT", 2568 | "engines": { 2569 | "node": ">=0.10.0" 2570 | } 2571 | }, 2572 | "node_modules/react-dom": { 2573 | "version": "19.1.0", 2574 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", 2575 | "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", 2576 | "license": "MIT", 2577 | "dependencies": { 2578 | "scheduler": "^0.26.0" 2579 | }, 2580 | "peerDependencies": { 2581 | "react": "^19.1.0" 2582 | } 2583 | }, 2584 | "node_modules/react-refresh": { 2585 | "version": "0.17.0", 2586 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", 2587 | "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", 2588 | "dev": true, 2589 | "license": "MIT", 2590 | "engines": { 2591 | "node": ">=0.10.0" 2592 | } 2593 | }, 2594 | "node_modules/react-router": { 2595 | "version": "7.6.0", 2596 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", 2597 | "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", 2598 | "license": "MIT", 2599 | "dependencies": { 2600 | "cookie": "^1.0.1", 2601 | "set-cookie-parser": "^2.6.0" 2602 | }, 2603 | "engines": { 2604 | "node": ">=20.0.0" 2605 | }, 2606 | "peerDependencies": { 2607 | "react": ">=18", 2608 | "react-dom": ">=18" 2609 | }, 2610 | "peerDependenciesMeta": { 2611 | "react-dom": { 2612 | "optional": true 2613 | } 2614 | } 2615 | }, 2616 | "node_modules/react-universal-interface": { 2617 | "version": "0.6.2", 2618 | "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", 2619 | "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", 2620 | "peerDependencies": { 2621 | "react": "*", 2622 | "tslib": "*" 2623 | } 2624 | }, 2625 | "node_modules/react-use": { 2626 | "version": "17.6.0", 2627 | "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.0.tgz", 2628 | "integrity": "sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g==", 2629 | "license": "Unlicense", 2630 | "dependencies": { 2631 | "@types/js-cookie": "^2.2.6", 2632 | "@xobotyi/scrollbar-width": "^1.9.5", 2633 | "copy-to-clipboard": "^3.3.1", 2634 | "fast-deep-equal": "^3.1.3", 2635 | "fast-shallow-equal": "^1.0.0", 2636 | "js-cookie": "^2.2.1", 2637 | "nano-css": "^5.6.2", 2638 | "react-universal-interface": "^0.6.2", 2639 | "resize-observer-polyfill": "^1.5.1", 2640 | "screenfull": "^5.1.0", 2641 | "set-harmonic-interval": "^1.0.1", 2642 | "throttle-debounce": "^3.0.1", 2643 | "ts-easing": "^0.2.0", 2644 | "tslib": "^2.1.0" 2645 | }, 2646 | "peerDependencies": { 2647 | "react": "*", 2648 | "react-dom": "*" 2649 | } 2650 | }, 2651 | "node_modules/resize-observer-polyfill": { 2652 | "version": "1.5.1", 2653 | "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", 2654 | "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", 2655 | "license": "MIT" 2656 | }, 2657 | "node_modules/resolve-from": { 2658 | "version": "4.0.0", 2659 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2660 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2661 | "dev": true, 2662 | "license": "MIT", 2663 | "engines": { 2664 | "node": ">=4" 2665 | } 2666 | }, 2667 | "node_modules/rollup": { 2668 | "version": "4.41.0", 2669 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", 2670 | "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", 2671 | "dev": true, 2672 | "license": "MIT", 2673 | "dependencies": { 2674 | "@types/estree": "1.0.7" 2675 | }, 2676 | "bin": { 2677 | "rollup": "dist/bin/rollup" 2678 | }, 2679 | "engines": { 2680 | "node": ">=18.0.0", 2681 | "npm": ">=8.0.0" 2682 | }, 2683 | "optionalDependencies": { 2684 | "@rollup/rollup-android-arm-eabi": "4.41.0", 2685 | "@rollup/rollup-android-arm64": "4.41.0", 2686 | "@rollup/rollup-darwin-arm64": "4.41.0", 2687 | "@rollup/rollup-darwin-x64": "4.41.0", 2688 | "@rollup/rollup-freebsd-arm64": "4.41.0", 2689 | "@rollup/rollup-freebsd-x64": "4.41.0", 2690 | "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", 2691 | "@rollup/rollup-linux-arm-musleabihf": "4.41.0", 2692 | "@rollup/rollup-linux-arm64-gnu": "4.41.0", 2693 | "@rollup/rollup-linux-arm64-musl": "4.41.0", 2694 | "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", 2695 | "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", 2696 | "@rollup/rollup-linux-riscv64-gnu": "4.41.0", 2697 | "@rollup/rollup-linux-riscv64-musl": "4.41.0", 2698 | "@rollup/rollup-linux-s390x-gnu": "4.41.0", 2699 | "@rollup/rollup-linux-x64-gnu": "4.41.0", 2700 | "@rollup/rollup-linux-x64-musl": "4.41.0", 2701 | "@rollup/rollup-win32-arm64-msvc": "4.41.0", 2702 | "@rollup/rollup-win32-ia32-msvc": "4.41.0", 2703 | "@rollup/rollup-win32-x64-msvc": "4.41.0", 2704 | "fsevents": "~2.3.2" 2705 | } 2706 | }, 2707 | "node_modules/rtl-css-js": { 2708 | "version": "1.16.1", 2709 | "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", 2710 | "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", 2711 | "license": "MIT", 2712 | "dependencies": { 2713 | "@babel/runtime": "^7.1.2" 2714 | } 2715 | }, 2716 | "node_modules/scheduler": { 2717 | "version": "0.26.0", 2718 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", 2719 | "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", 2720 | "license": "MIT" 2721 | }, 2722 | "node_modules/screenfull": { 2723 | "version": "5.2.0", 2724 | "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", 2725 | "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", 2726 | "license": "MIT", 2727 | "engines": { 2728 | "node": ">=0.10.0" 2729 | }, 2730 | "funding": { 2731 | "url": "https://github.com/sponsors/sindresorhus" 2732 | } 2733 | }, 2734 | "node_modules/semver": { 2735 | "version": "6.3.1", 2736 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2737 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2738 | "dev": true, 2739 | "license": "ISC", 2740 | "bin": { 2741 | "semver": "bin/semver.js" 2742 | } 2743 | }, 2744 | "node_modules/set-cookie-parser": { 2745 | "version": "2.7.1", 2746 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", 2747 | "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", 2748 | "license": "MIT" 2749 | }, 2750 | "node_modules/set-harmonic-interval": { 2751 | "version": "1.0.1", 2752 | "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", 2753 | "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", 2754 | "license": "Unlicense", 2755 | "engines": { 2756 | "node": ">=6.9" 2757 | } 2758 | }, 2759 | "node_modules/shebang-command": { 2760 | "version": "2.0.0", 2761 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2762 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2763 | "dev": true, 2764 | "license": "MIT", 2765 | "dependencies": { 2766 | "shebang-regex": "^3.0.0" 2767 | }, 2768 | "engines": { 2769 | "node": ">=8" 2770 | } 2771 | }, 2772 | "node_modules/shebang-regex": { 2773 | "version": "3.0.0", 2774 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2775 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2776 | "dev": true, 2777 | "license": "MIT", 2778 | "engines": { 2779 | "node": ">=8" 2780 | } 2781 | }, 2782 | "node_modules/source-map": { 2783 | "version": "0.6.1", 2784 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2785 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2786 | "license": "BSD-3-Clause", 2787 | "engines": { 2788 | "node": ">=0.10.0" 2789 | } 2790 | }, 2791 | "node_modules/source-map-js": { 2792 | "version": "1.2.1", 2793 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2794 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2795 | "dev": true, 2796 | "license": "BSD-3-Clause", 2797 | "engines": { 2798 | "node": ">=0.10.0" 2799 | } 2800 | }, 2801 | "node_modules/stack-generator": { 2802 | "version": "2.0.10", 2803 | "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", 2804 | "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", 2805 | "license": "MIT", 2806 | "dependencies": { 2807 | "stackframe": "^1.3.4" 2808 | } 2809 | }, 2810 | "node_modules/stackframe": { 2811 | "version": "1.3.4", 2812 | "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", 2813 | "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", 2814 | "license": "MIT" 2815 | }, 2816 | "node_modules/stacktrace-gps": { 2817 | "version": "3.1.2", 2818 | "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", 2819 | "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", 2820 | "license": "MIT", 2821 | "dependencies": { 2822 | "source-map": "0.5.6", 2823 | "stackframe": "^1.3.4" 2824 | } 2825 | }, 2826 | "node_modules/stacktrace-gps/node_modules/source-map": { 2827 | "version": "0.5.6", 2828 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 2829 | "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", 2830 | "license": "BSD-3-Clause", 2831 | "engines": { 2832 | "node": ">=0.10.0" 2833 | } 2834 | }, 2835 | "node_modules/stacktrace-js": { 2836 | "version": "2.0.2", 2837 | "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", 2838 | "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", 2839 | "license": "MIT", 2840 | "dependencies": { 2841 | "error-stack-parser": "^2.0.6", 2842 | "stack-generator": "^2.0.5", 2843 | "stacktrace-gps": "^3.0.4" 2844 | } 2845 | }, 2846 | "node_modules/strip-json-comments": { 2847 | "version": "3.1.1", 2848 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2849 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2850 | "dev": true, 2851 | "license": "MIT", 2852 | "engines": { 2853 | "node": ">=8" 2854 | }, 2855 | "funding": { 2856 | "url": "https://github.com/sponsors/sindresorhus" 2857 | } 2858 | }, 2859 | "node_modules/stylis": { 2860 | "version": "4.3.6", 2861 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", 2862 | "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", 2863 | "license": "MIT" 2864 | }, 2865 | "node_modules/supports-color": { 2866 | "version": "7.2.0", 2867 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2868 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2869 | "dev": true, 2870 | "license": "MIT", 2871 | "dependencies": { 2872 | "has-flag": "^4.0.0" 2873 | }, 2874 | "engines": { 2875 | "node": ">=8" 2876 | } 2877 | }, 2878 | "node_modules/sweetalert2": { 2879 | "version": "11.21.1", 2880 | "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.21.1.tgz", 2881 | "integrity": "sha512-V34x1q5xdwJr64p24AQQ5EzTMJa2ru3xsIUznhYuZf3vumw2xM9BPHvv2Nx9ya25SSUFe2JAnLtaGfgcLLNfCw==", 2882 | "license": "MIT", 2883 | "funding": { 2884 | "type": "individual", 2885 | "url": "https://github.com/sponsors/limonte" 2886 | } 2887 | }, 2888 | "node_modules/throttle-debounce": { 2889 | "version": "3.0.1", 2890 | "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", 2891 | "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", 2892 | "license": "MIT", 2893 | "engines": { 2894 | "node": ">=10" 2895 | } 2896 | }, 2897 | "node_modules/tinyglobby": { 2898 | "version": "0.2.13", 2899 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 2900 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 2901 | "dev": true, 2902 | "license": "MIT", 2903 | "dependencies": { 2904 | "fdir": "^6.4.4", 2905 | "picomatch": "^4.0.2" 2906 | }, 2907 | "engines": { 2908 | "node": ">=12.0.0" 2909 | }, 2910 | "funding": { 2911 | "url": "https://github.com/sponsors/SuperchupuDev" 2912 | } 2913 | }, 2914 | "node_modules/toggle-selection": { 2915 | "version": "1.0.6", 2916 | "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", 2917 | "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", 2918 | "license": "MIT" 2919 | }, 2920 | "node_modules/ts-easing": { 2921 | "version": "0.2.0", 2922 | "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", 2923 | "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", 2924 | "license": "Unlicense" 2925 | }, 2926 | "node_modules/tslib": { 2927 | "version": "2.8.1", 2928 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2929 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2930 | "license": "0BSD" 2931 | }, 2932 | "node_modules/type-check": { 2933 | "version": "0.4.0", 2934 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2935 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2936 | "dev": true, 2937 | "license": "MIT", 2938 | "dependencies": { 2939 | "prelude-ls": "^1.2.1" 2940 | }, 2941 | "engines": { 2942 | "node": ">= 0.8.0" 2943 | } 2944 | }, 2945 | "node_modules/update-browserslist-db": { 2946 | "version": "1.1.3", 2947 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 2948 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 2949 | "dev": true, 2950 | "funding": [ 2951 | { 2952 | "type": "opencollective", 2953 | "url": "https://opencollective.com/browserslist" 2954 | }, 2955 | { 2956 | "type": "tidelift", 2957 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2958 | }, 2959 | { 2960 | "type": "github", 2961 | "url": "https://github.com/sponsors/ai" 2962 | } 2963 | ], 2964 | "license": "MIT", 2965 | "dependencies": { 2966 | "escalade": "^3.2.0", 2967 | "picocolors": "^1.1.1" 2968 | }, 2969 | "bin": { 2970 | "update-browserslist-db": "cli.js" 2971 | }, 2972 | "peerDependencies": { 2973 | "browserslist": ">= 4.21.0" 2974 | } 2975 | }, 2976 | "node_modules/uri-js": { 2977 | "version": "4.4.1", 2978 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2979 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2980 | "dev": true, 2981 | "license": "BSD-2-Clause", 2982 | "dependencies": { 2983 | "punycode": "^2.1.0" 2984 | } 2985 | }, 2986 | "node_modules/vite": { 2987 | "version": "6.3.5", 2988 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", 2989 | "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 2990 | "dev": true, 2991 | "license": "MIT", 2992 | "dependencies": { 2993 | "esbuild": "^0.25.0", 2994 | "fdir": "^6.4.4", 2995 | "picomatch": "^4.0.2", 2996 | "postcss": "^8.5.3", 2997 | "rollup": "^4.34.9", 2998 | "tinyglobby": "^0.2.13" 2999 | }, 3000 | "bin": { 3001 | "vite": "bin/vite.js" 3002 | }, 3003 | "engines": { 3004 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3005 | }, 3006 | "funding": { 3007 | "url": "https://github.com/vitejs/vite?sponsor=1" 3008 | }, 3009 | "optionalDependencies": { 3010 | "fsevents": "~2.3.3" 3011 | }, 3012 | "peerDependencies": { 3013 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3014 | "jiti": ">=1.21.0", 3015 | "less": "*", 3016 | "lightningcss": "^1.21.0", 3017 | "sass": "*", 3018 | "sass-embedded": "*", 3019 | "stylus": "*", 3020 | "sugarss": "*", 3021 | "terser": "^5.16.0", 3022 | "tsx": "^4.8.1", 3023 | "yaml": "^2.4.2" 3024 | }, 3025 | "peerDependenciesMeta": { 3026 | "@types/node": { 3027 | "optional": true 3028 | }, 3029 | "jiti": { 3030 | "optional": true 3031 | }, 3032 | "less": { 3033 | "optional": true 3034 | }, 3035 | "lightningcss": { 3036 | "optional": true 3037 | }, 3038 | "sass": { 3039 | "optional": true 3040 | }, 3041 | "sass-embedded": { 3042 | "optional": true 3043 | }, 3044 | "stylus": { 3045 | "optional": true 3046 | }, 3047 | "sugarss": { 3048 | "optional": true 3049 | }, 3050 | "terser": { 3051 | "optional": true 3052 | }, 3053 | "tsx": { 3054 | "optional": true 3055 | }, 3056 | "yaml": { 3057 | "optional": true 3058 | } 3059 | } 3060 | }, 3061 | "node_modules/which": { 3062 | "version": "2.0.2", 3063 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3064 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3065 | "dev": true, 3066 | "license": "ISC", 3067 | "dependencies": { 3068 | "isexe": "^2.0.0" 3069 | }, 3070 | "bin": { 3071 | "node-which": "bin/node-which" 3072 | }, 3073 | "engines": { 3074 | "node": ">= 8" 3075 | } 3076 | }, 3077 | "node_modules/word-wrap": { 3078 | "version": "1.2.5", 3079 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 3080 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 3081 | "dev": true, 3082 | "license": "MIT", 3083 | "engines": { 3084 | "node": ">=0.10.0" 3085 | } 3086 | }, 3087 | "node_modules/yallist": { 3088 | "version": "3.1.1", 3089 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3090 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3091 | "dev": true, 3092 | "license": "ISC" 3093 | }, 3094 | "node_modules/yocto-queue": { 3095 | "version": "0.1.0", 3096 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3097 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3098 | "dev": true, 3099 | "license": "MIT", 3100 | "engines": { 3101 | "node": ">=10" 3102 | }, 3103 | "funding": { 3104 | "url": "https://github.com/sponsors/sindresorhus" 3105 | } 3106 | } 3107 | } 3108 | } 3109 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "belajar-reactjs-contact-management", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^19.1.0", 14 | "react-dom": "^19.1.0", 15 | "react-router": "^7.6.0", 16 | "react-use": "^17.6.0", 17 | "sweetalert2": "^11.21.1" 18 | }, 19 | "devDependencies": { 20 | "@eslint/js": "^9.25.0", 21 | "@types/react": "^19.1.2", 22 | "@types/react-dom": "^19.1.2", 23 | "@vitejs/plugin-react": "^4.4.1", 24 | "eslint": "^9.25.0", 25 | "eslint-plugin-react-hooks": "^5.2.0", 26 | "eslint-plugin-react-refresh": "^0.4.19", 27 | "globals": "^16.0.0", 28 | "vite": "^6.3.5" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Address/AddressCreate.jsx: -------------------------------------------------------------------------------- 1 | import {Link, useNavigate, useParams} from "react-router"; 2 | import {useEffectOnce, useLocalStorage} from "react-use"; 3 | import {useState} from "react"; 4 | import {contactDetail} from "../../lib/api/ContactApi.js"; 5 | import {alertError, alertSuccess} from "../../lib/alert.js"; 6 | import {addressCreate} from "../../lib/api/AddressApi.js"; 7 | 8 | export default function AddressCreate() { 9 | 10 | const [token, _] = useLocalStorage("token", ""); 11 | const {id} = useParams(); 12 | const [contact, setContact] = useState({}); 13 | const [street, setStreet] = useState(''); 14 | const [city, setCity] = useState(''); 15 | const [province, setProvince] = useState(''); 16 | const [country, setCountry] = useState(''); 17 | const [postal_code, setPostalCode] = useState(''); 18 | const navigate = useNavigate(); 19 | 20 | async function handleSubmit(e) { 21 | e.preventDefault(); 22 | 23 | const response = await addressCreate(token, id, {street, city, province, country, postal_code}); 24 | const responseBody = await response.json(); 25 | console.log(responseBody); 26 | 27 | if (response.status === 200) { 28 | await alertSuccess("Address created successfully"); 29 | await navigate({ 30 | pathname: `/dashboard/contacts/${id}` 31 | }) 32 | } else { 33 | await alertError(responseBody.errors); 34 | } 35 | } 36 | 37 | async function fetchContact() { 38 | const response = await contactDetail(token, id); 39 | const responseBody = await response.json(); 40 | console.log(responseBody); 41 | 42 | if (response.status === 200) { 43 | setContact(responseBody.data); 44 | } else { 45 | await alertError(responseBody.errors); 46 | } 47 | } 48 | 49 | useEffectOnce(() => { 50 | fetchContact() 51 | .then(() => console.log("Contact detail fetched successfully")); 52 | }) 53 | 54 | return <> 55 |
56 | 58 | Back to Contact Details 59 | 60 |

61 | Add New Address 62 |

63 |
64 | 65 |
67 |
68 |
69 |
70 |
71 | 72 |
73 |
74 |

{contact.first_name} {contact.last_name}

75 |

{contact.email} • {contact.phone}

76 |
77 |
78 |
79 | 80 |
81 |
82 | 83 |
84 |
85 | 86 |
87 | setStreet(e.target.value)}/> 91 |
92 |
93 | 94 |
95 |
96 | 97 |
98 |
99 | 100 |
101 | setCity(e.target.value)}/> 105 |
106 |
107 |
108 | 109 |
110 |
111 | 112 |
113 | setProvince(e.target.value)}/> 117 |
118 |
119 |
120 | 121 |
122 |
123 | 124 |
125 |
126 | 127 |
128 | setCountry(e.target.value)}/> 132 |
133 |
134 |
135 | 136 |
137 |
138 | 139 |
140 | setPostalCode(e.target.value)}/> 144 |
145 |
146 |
147 | 148 |
149 | 151 | Cancel 152 | 153 | 157 |
158 |
159 |
160 |
161 | 162 | } -------------------------------------------------------------------------------- /src/components/Address/AddressEdit.jsx: -------------------------------------------------------------------------------- 1 | import {Link, useParams} from "react-router"; 2 | import {useEffectOnce, useLocalStorage} from "react-use"; 3 | import {useState} from "react"; 4 | import {addressDetail, addressUpdate} from "../../lib/api/AddressApi.js"; 5 | import {alertError, alertSuccess} from "../../lib/alert.js"; 6 | import {contactDetail} from "../../lib/api/ContactApi.js"; 7 | 8 | export default function AddressEdit() { 9 | 10 | const {id, addressId} = useParams(); 11 | const [token, _] = useLocalStorage("token", ""); 12 | const [contact, setContact] = useState({}); 13 | const [street, setStreet] = useState(''); 14 | const [city, setCity] = useState(''); 15 | const [province, setProvince] = useState(''); 16 | const [country, setCountry] = useState(''); 17 | const [postal_code, setPostalCode] = useState(''); 18 | 19 | async function handleSubmit(e) { 20 | e.preventDefault(); 21 | 22 | const response = await addressUpdate(token, id, {addressId, street, city, province, country, postal_code}); 23 | const responseBody = await response.json(); 24 | console.log(responseBody); 25 | 26 | if (response.status === 200) { 27 | await alertSuccess("Address updated successfully"); 28 | } else { 29 | await alertError(responseBody.errors); 30 | } 31 | } 32 | 33 | async function fetchContact() { 34 | const response = await contactDetail(token, id); 35 | const responseBody = await response.json(); 36 | console.log(responseBody); 37 | 38 | if (response.status === 200) { 39 | setContact(responseBody.data); 40 | } else { 41 | await alertError(responseBody.errors); 42 | } 43 | } 44 | 45 | async function fetchAddress() { 46 | const response = await addressDetail(token, id, addressId); 47 | const responseBody = await response.json(); 48 | console.log(responseBody); 49 | 50 | if (response.status === 200) { 51 | setStreet(responseBody.data.street); 52 | setCity(responseBody.data.city); 53 | setProvince(responseBody.data.province); 54 | setCountry(responseBody.data.country); 55 | setPostalCode(responseBody.data.postal_code); 56 | } else { 57 | await alertError(responseBody.errors); 58 | } 59 | } 60 | 61 | useEffectOnce(() => { 62 | fetchContact() 63 | .then(() => console.log("Contact detail fetched successfully")); 64 | 65 | fetchAddress() 66 | .then(() => console.log("Address detail fetched successfully")); 67 | }) 68 | 69 | return <> 70 |
71 | 73 | Back to Contact Details 74 | 75 |

76 | Edit Address 77 |

78 |
79 | 80 |
82 |
83 |
84 |
85 |
86 | 87 |
88 |
89 |

{contact.first_name} {contact.last_name}

90 |

{contact.email} • {contact.phone}

91 |
92 |
93 |
94 | 95 |
96 |
97 | 98 |
99 |
100 | 101 |
102 | setStreet(e.target.value)}/> 106 |
107 |
108 | 109 |
110 |
111 | 112 |
113 |
114 | 115 |
116 | setCity(e.target.value)}/> 120 |
121 |
122 |
123 | 124 |
125 |
126 | 127 |
128 | setProvince(e.target.value)}/> 132 |
133 |
134 |
135 | 136 |
137 |
138 | 139 |
140 |
141 | 142 |
143 | setCountry(e.target.value)}/> 147 |
148 |
149 |
150 | 151 |
152 |
153 | 154 |
155 | setPostalCode(e.target.value)}/> 159 |
160 |
161 |
162 | 163 |
164 | 166 | Cancel 167 | 168 | 172 |
173 |
174 |
175 |
176 | 177 | } -------------------------------------------------------------------------------- /src/components/Contact/ContactCreate.jsx: -------------------------------------------------------------------------------- 1 | import {Link, useNavigate} from "react-router"; 2 | import {useState} from "react"; 3 | import {contactCreate} from "../../lib/api/ContactApi.js"; 4 | import {useLocalStorage} from "react-use"; 5 | import {alertError, alertSuccess} from "../../lib/alert.js"; 6 | 7 | export default function ContactCreate() { 8 | 9 | const [token, _] = useLocalStorage("token", ""); 10 | const navigate = useNavigate(); 11 | const [first_name, setFirstName] = useState(''); 12 | const [last_name, setLastName] = useState(''); 13 | const [email, setEmail] = useState(''); 14 | const [phone, setPhone] = useState(''); 15 | 16 | async function handleSubmit(e) { 17 | e.preventDefault(); 18 | 19 | const response = await contactCreate(token, {first_name, last_name, email, phone}); 20 | const responseBody = await response.json(); 21 | console.log(responseBody); 22 | 23 | if (response.status === 200) { 24 | await alertSuccess("Contact created successfully"); 25 | navigate({ 26 | pathname: "/dashboard/contacts" 27 | }); 28 | } else { 29 | await alertError(responseBody.errors); 30 | } 31 | } 32 | 33 | return <> 34 |
35 | 37 | Back to Contacts 38 | 39 |

40 | Create New Contact 41 |

42 |
43 | 44 |
46 |
47 |
48 |
49 |
50 | 51 |
52 |
53 | 54 |
55 | setFirstName(e.target.value)}/> 59 |
60 |
61 |
62 | 63 |
64 |
65 | 66 |
67 | setLastName(e.target.value)}/> 71 |
72 |
73 |
74 | 75 |
76 | 77 |
78 |
79 | 80 |
81 | setEmail(e.target.value)}/> 85 |
86 |
87 | 88 |
89 | 90 |
91 |
92 | 93 |
94 | setPhone(e.target.value)}/> 98 |
99 |
100 | 101 |
102 | 104 | Cancel 105 | 106 | 110 |
111 |
112 |
113 |
114 | 115 | } -------------------------------------------------------------------------------- /src/components/Contact/ContactDetail.jsx: -------------------------------------------------------------------------------- 1 | import {Link, useParams} from "react-router"; 2 | import {useState} from "react"; 3 | import {contactDetail} from "../../lib/api/ContactApi.js"; 4 | import {alertConfirm, alertError, alertSuccess} from "../../lib/alert.js"; 5 | import {useEffectOnce, useLocalStorage} from "react-use"; 6 | import {addressDelete, addressList} from "../../lib/api/AddressApi.js"; 7 | 8 | export default function ContactDetail() { 9 | 10 | const [token, _] = useLocalStorage("token", ""); 11 | const {id} = useParams(); 12 | const [contact, setContact] = useState({}); 13 | const [addresses, setAddresses] = useState([]); 14 | 15 | async function fetchContact() { 16 | const response = await contactDetail(token, id); 17 | const responseBody = await response.json(); 18 | console.log(responseBody); 19 | 20 | if (response.status === 200) { 21 | setContact(responseBody.data); 22 | } else { 23 | await alertError(responseBody.errors); 24 | } 25 | } 26 | 27 | async function fetchAddresses() { 28 | const response = await addressList(token, id); 29 | const responseBody = await response.json(); 30 | console.log(responseBody); 31 | 32 | if (response.status === 200) { 33 | setAddresses(responseBody.data); 34 | } else { 35 | await alertError(responseBody.errors); 36 | } 37 | } 38 | 39 | async function handleDeleteAddress(addressId) { 40 | if (!await alertConfirm("Are you sure you want to delete this address?")) { 41 | return; 42 | } 43 | 44 | const response = await addressDelete(token, id, addressId); 45 | const responseBody = await response.json(); 46 | console.log(responseBody); 47 | 48 | if (response.status === 200) { 49 | await alertSuccess("Address deleted successfully"); 50 | await fetchAddresses(); 51 | } else { 52 | await alertError(responseBody.errors); 53 | } 54 | } 55 | 56 | useEffectOnce(() => { 57 | fetchContact() 58 | .then(() => console.log("Contact detail fetched successfully")); 59 | 60 | fetchAddresses() 61 | .then(() => console.log("Addresses fetched successfully")); 62 | }) 63 | 64 | return <> 65 |
66 | 68 | Back to Contacts 69 | 70 |

71 | Contact Details 72 |

73 |
74 | 75 |
77 |
78 |
79 |
80 | 81 |
82 |

{contact.first_name} {contact.last_name}

83 |
84 |
85 | 86 |
87 |
88 |
90 |
91 | 92 |

First Name

93 |
94 |

{contact.first_name}

95 |
96 |
98 |
99 | 100 |

Last Name

101 |
102 |

{contact.last_name}

103 |
104 |
105 | 106 |
108 |
109 | 110 |

Email

111 |
112 |

{contact.email}

113 |
114 | 115 |
117 |
118 | 119 |

Phone

120 |
121 |

{contact.phone}

122 |
123 |
124 | 125 |
126 |
127 | 128 |

Addresses

129 |
130 |
131 |
133 | 134 |
135 |
137 | 138 |
139 |

Add Address

140 |
141 | 142 |
143 | 144 | {addresses.map(address => ( 145 |
147 |
148 |
149 | 150 |
151 |

Home Address

152 |
153 |
154 |

155 | 156 | Street: 157 | {address.street} 158 |

159 |

160 | 161 | City: 162 | {address.city} 163 |

164 |

165 | 166 | Province: 167 | {address.province} 168 |

169 |

170 | 171 | Country: 172 | {address.country} 173 |

174 |

175 | 176 | Postal Code: 177 | {address.postal_code} 178 |

179 |
180 |
181 | 183 | Edit 184 | 185 | 189 |
190 |
191 | ))} 192 | 193 | 194 |
195 |
196 | 197 |
198 | 200 | Back 201 | 202 | 204 | Edit Contact 205 | 206 |
207 |
208 |
209 | 210 | } -------------------------------------------------------------------------------- /src/components/Contact/ContactEdit.jsx: -------------------------------------------------------------------------------- 1 | import {Link, useParams} from "react-router"; 2 | import {useState} from "react"; 3 | import {contactDetail, contactUpdate} from "../../lib/api/ContactApi.js"; 4 | import {useEffectOnce, useLocalStorage} from "react-use"; 5 | import {alertError, alertSuccess} from "../../lib/alert.js"; 6 | 7 | export default function ContactEdit() { 8 | 9 | const [token, _] = useLocalStorage("token", ""); 10 | const {id} = useParams(); 11 | const [first_name, setFirstName] = useState(''); 12 | const [last_name, setLastName] = useState(''); 13 | const [email, setEmail] = useState(''); 14 | const [phone, setPhone] = useState(''); 15 | 16 | async function fetchContact() { 17 | const response = await contactDetail(token, id); 18 | const responseBody = await response.json(); 19 | console.log(responseBody); 20 | 21 | if (response.status === 200) { 22 | setFirstName(responseBody.data.first_name); 23 | setLastName(responseBody.data.last_name); 24 | setEmail(responseBody.data.email); 25 | setPhone(responseBody.data.phone); 26 | } else { 27 | await alertError(responseBody.errors); 28 | } 29 | } 30 | 31 | async function handleSubmit(e) { 32 | e.preventDefault(); 33 | 34 | const response = await contactUpdate(token, {id, first_name, last_name, email, phone}); 35 | const responseBody = await response.json(); 36 | console.log(responseBody); 37 | 38 | if (response.status === 200) { 39 | await alertSuccess("Contact updated successfully"); 40 | } else { 41 | await alertError(responseBody.errors); 42 | } 43 | } 44 | 45 | useEffectOnce(() => { 46 | fetchContact() 47 | .then(() => console.log("Contact detail fetched successfully")); 48 | }) 49 | 50 | return <> 51 |
52 | 54 | Back to Contacts 55 | 56 |

57 | Edit Contact 58 |

59 |
60 | 61 |
63 |
64 |
65 |
66 |
67 | 68 |
69 |
70 | 71 |
72 | setFirstName(e.target.value)}/> 76 |
77 |
78 |
79 | 80 |
81 |
82 | 83 |
84 | setLastName(e.target.value)}/> 88 |
89 |
90 |
91 | 92 |
93 | 94 |
95 |
96 | 97 |
98 | setEmail(e.target.value)}/> 102 |
103 |
104 | 105 |
106 | 107 |
108 |
109 | 110 |
111 | setPhone(e.target.value)}/> 115 |
116 |
117 | 118 |
119 | 121 | Cancel 122 | 123 | 127 |
128 |
129 |
130 |
131 | 132 | } -------------------------------------------------------------------------------- /src/components/Contact/ContactList.jsx: -------------------------------------------------------------------------------- 1 | import {useEffectOnce, useLocalStorage} from "react-use"; 2 | import {useEffect, useState} from "react"; 3 | import {contactDelete, contactList} from "../../lib/api/ContactApi.js"; 4 | import {alertConfirm, alertError, alertSuccess} from "../../lib/alert.js"; 5 | import {Link} from "react-router"; 6 | 7 | export default function ContactList() { 8 | 9 | const [token, _] = useLocalStorage("token", ""); 10 | const [name, setName] = useState(""); 11 | const [email, setEmail] = useState(""); 12 | const [phone, setPhone] = useState(""); 13 | const [page, setPage] = useState(1); 14 | const [totalPage, setTotalPage] = useState(1); 15 | const [contacts, setContacts] = useState([]); 16 | const [reload, setReload] = useState(false); 17 | 18 | function getPages() { 19 | const pages = []; 20 | for (let i = 1; i <= totalPage; i++) { 21 | pages.push(i); 22 | } 23 | return pages; 24 | } 25 | 26 | async function handleSearchContacts(e) { 27 | e.preventDefault(); 28 | setPage(1); 29 | setReload(!reload); 30 | } 31 | 32 | async function handlePageChange(page) { 33 | setPage(page); 34 | setReload(!reload); 35 | } 36 | 37 | async function fetchContacts() { 38 | const response = await contactList(token, {name, phone, email, page}); 39 | const responseBody = await response.json(); 40 | console.log(responseBody); 41 | 42 | if (response.status === 200) { 43 | setContacts(responseBody.data); 44 | setTotalPage(responseBody.paging.total_page); 45 | } else { 46 | await alertError(responseBody.errors); 47 | } 48 | } 49 | 50 | async function handleContactDelete(id) { 51 | if (!await alertConfirm("Are you sure you want to delete this contact?")) { 52 | return; 53 | } 54 | 55 | const response = await contactDelete(token, id); 56 | const responseBody = await response.json(); 57 | console.log(responseBody); 58 | 59 | if (response.status === 200) { 60 | await alertSuccess("Contact deleted successfully"); 61 | setReload(!reload); 62 | } else { 63 | await alertError(responseBody.errors); 64 | } 65 | } 66 | 67 | useEffect(() => { 68 | fetchContacts() 69 | .then(() => console.log("Contacts fetched")); 70 | }, [reload]) 71 | 72 | useEffectOnce(() => { 73 | const toggleButton = document.getElementById('toggleSearchForm'); 74 | const searchFormContent = document.getElementById('searchFormContent'); 75 | const toggleIcon = document.getElementById('toggleSearchIcon'); 76 | 77 | // Add transition for smooth animation 78 | searchFormContent.style.transition = 'max-height 0.3s ease-in-out, opacity 0.3s ease-in-out, margin 0.3s ease-in-out'; 79 | searchFormContent.style.overflow = 'hidden'; 80 | searchFormContent.style.maxHeight = '0px'; 81 | searchFormContent.style.opacity = '0'; 82 | searchFormContent.style.marginTop = '0'; 83 | 84 | function toggleSearchForm() { 85 | if (searchFormContent.style.maxHeight !== '0px') { 86 | // Hide the form 87 | searchFormContent.style.maxHeight = '0px'; 88 | searchFormContent.style.opacity = '0'; 89 | searchFormContent.style.marginTop = '0'; 90 | toggleIcon.classList.remove('fa-chevron-up'); 91 | toggleIcon.classList.add('fa-chevron-down'); 92 | } else { 93 | // Show the form 94 | searchFormContent.style.maxHeight = searchFormContent.scrollHeight + 'px'; 95 | searchFormContent.style.opacity = '1'; 96 | searchFormContent.style.marginTop = '1rem'; 97 | toggleIcon.classList.remove('fa-chevron-down'); 98 | toggleIcon.classList.add('fa-chevron-up'); 99 | } 100 | } 101 | 102 | toggleButton.addEventListener('click', toggleSearchForm); 103 | 104 | return () => { 105 | toggleButton.removeEventListener('click', toggleSearchForm); 106 | } 107 | }) 108 | 109 | return <> 110 |
111 | 112 |

My Contacts

113 |
114 | 115 |
116 |
117 |
118 | 119 |

Search Contacts

120 |
121 | 125 |
126 |
127 |
128 |
129 |
130 | 131 |
132 |
133 | 134 |
135 | setName(e.target.value)}/> 139 |
140 |
141 |
142 | 143 |
144 |
145 | 146 |
147 | setEmail(e.target.value)}/> 151 |
152 |
153 |
154 | 155 |
156 |
157 | 158 |
159 | setPhone(e.target.value)}/> 163 |
164 |
165 |
166 |
167 | 171 |
172 |
173 |
174 |
175 | 176 |
177 |
179 | 180 |
181 |
183 | 184 |
185 |

Create New Contact

186 |

Add a new contact to your list

187 |
188 | 189 |
190 | 191 | {contacts.map(contact => ( 192 |
194 |
195 | 197 |
198 |
199 | 200 |
201 |

202 | {contact.first_name} {contact.last_name} 203 |

204 |
205 |
206 |

207 | 208 | First Name: 209 | {contact.first_name} 210 |

211 |

212 | 213 | Last Name: 214 | {contact.last_name} 215 |

216 |

217 | 218 | Email: 219 | {contact.email} 220 |

221 |

222 | 223 | Phone: 224 | {contact.phone} 225 |

226 |
227 | 228 |
229 | 231 | Edit 232 | 233 | 237 |
238 |
239 |
240 | ))} 241 | 242 |
243 | 244 |
245 | 273 |
274 | 275 | } -------------------------------------------------------------------------------- /src/components/DashboardLayout.jsx: -------------------------------------------------------------------------------- 1 | import {Link, Outlet} from "react-router"; 2 | 3 | export default function DashboardLayout() { 4 | return <> 5 |
6 |
7 |
8 | 9 | 10 |
Contact Management
11 | 12 | 30 |
31 |
32 | 33 |
34 | 35 | 36 | 37 |
38 |

© 2025 Contact Management. All rights reserved.

39 |
40 |
41 |
42 | 43 | } -------------------------------------------------------------------------------- /src/components/Layout.jsx: -------------------------------------------------------------------------------- 1 | import {Outlet} from "react-router"; 2 | 3 | export default function Layout() { 4 | return <> 5 |
6 | 7 |
8 | 9 | } -------------------------------------------------------------------------------- /src/components/User/UserLogin.jsx: -------------------------------------------------------------------------------- 1 | import {Link, useNavigate} from "react-router"; 2 | import {useState} from "react"; 3 | import {userLogin} from "../../lib/api/UserApi.js"; 4 | import {alertError} from "../../lib/alert.js"; 5 | import {useLocalStorage} from "react-use"; 6 | 7 | export default function UserLogin() { 8 | 9 | const [username, setUsername] = useState(''); 10 | const [password, setPassword] = useState(''); 11 | const navigate = useNavigate(); 12 | const [_, setToken] = useLocalStorage("token", "") 13 | 14 | async function handleSubmit(e) { 15 | e.preventDefault(); 16 | 17 | const response = await userLogin({username, password}); 18 | const responseBody = await response.json(); 19 | console.log(responseBody); 20 | 21 | if (response.status === 200) { 22 | const token = responseBody.data.token; 23 | setToken(token); 24 | await navigate({ 25 | pathname: "/dashboard/contacts" 26 | }); 27 | } else { 28 | await alertError(responseBody.errors); 29 | } 30 | } 31 | 32 | return <> 33 |
35 |
36 |
37 | 38 |
39 |

Contact Management

40 |

Sign in to your account

41 |
42 | 43 |
44 |
45 | 46 |
47 |
48 | 49 |
50 | setUsername(e.target.value)}/> 54 |
55 |
56 | 57 |
58 | 59 |
60 |
61 | 62 |
63 | setPassword(e.target.value)}/> 67 |
68 |
69 | 70 |
71 | 75 |
76 | 77 |
78 | Don't have an account? 79 | Sign up 81 |
82 |
83 |
84 | 85 | } -------------------------------------------------------------------------------- /src/components/User/UserLogout.jsx: -------------------------------------------------------------------------------- 1 | import {useEffectOnce, useLocalStorage} from "react-use"; 2 | import {userLogout} from "../../lib/api/UserApi.js"; 3 | import {alertError} from "../../lib/alert.js"; 4 | import {useNavigate} from "react-router"; 5 | 6 | export default function UserLogout() { 7 | 8 | const [token, setToken] = useLocalStorage("token", "") 9 | const navigate = useNavigate(); 10 | 11 | async function handleLogout() { 12 | const response = await userLogout(token); 13 | const responseBody = await response.json(); 14 | console.log(responseBody); 15 | 16 | if (response.status === 200) { 17 | setToken(""); 18 | await navigate({ 19 | pathname: "/login" 20 | }) 21 | } else { 22 | await alertError(responseBody.errors); 23 | } 24 | } 25 | 26 | useEffectOnce(() => { 27 | handleLogout() 28 | .then(() => console.log("User logged out successfully")); 29 | }) 30 | 31 | return <> 32 | 33 | } -------------------------------------------------------------------------------- /src/components/User/UserProfile.jsx: -------------------------------------------------------------------------------- 1 | import {useState} from "react"; 2 | import {userDetail, userUpdatePassword, userUpdateProfile} from "../../lib/api/UserApi.js"; 3 | import {useEffectOnce, useLocalStorage} from "react-use"; 4 | import {alertError, alertSuccess} from "../../lib/alert.js"; 5 | 6 | export default function UserProfile() { 7 | 8 | const [name, setName] = useState(''); 9 | const [password, setPassword] = useState(''); 10 | const [confirmPassword, setConfirmPassword] = useState(''); 11 | const [token, _] = useLocalStorage("token", ""); 12 | 13 | async function fetchUserDetail() { 14 | const response = await userDetail(token); 15 | const responseBody = await response.json(); 16 | console.log(responseBody); 17 | 18 | if (response.status === 200) { 19 | setName(responseBody.data.name); 20 | } else { 21 | await alertError(responseBody.errors); 22 | } 23 | } 24 | 25 | async function handleSubmitProfile(e) { 26 | e.preventDefault(); 27 | 28 | const response = await userUpdateProfile(token, {name}); 29 | const responseBody = await response.json(); 30 | console.log(responseBody); 31 | 32 | if (response.status === 200) { 33 | await alertSuccess("Profile updated successfully"); 34 | } else { 35 | await alertError(responseBody.errors); 36 | } 37 | } 38 | 39 | async function handleSubmitPassword(e) { 40 | e.preventDefault(); 41 | 42 | if (password !== confirmPassword) { 43 | await alertError("Passwords don't match"); 44 | return; 45 | } 46 | 47 | const response = await userUpdatePassword(token, {password}); 48 | const responseBody = await response.json(); 49 | console.log(responseBody); 50 | 51 | if (response.status === 200) { 52 | setPassword(''); 53 | setConfirmPassword(''); 54 | await alertSuccess("Password updated successfully"); 55 | } else { 56 | await alertError(responseBody.errors); 57 | } 58 | } 59 | 60 | useEffectOnce(() => { 61 | fetchUserDetail() 62 | .then(() => console.log("User detail fetched successfully")); 63 | }) 64 | 65 | return <> 66 |
67 | 68 |

My Profile

69 |
70 | 71 |
72 |
74 |
75 |
76 |
77 | 78 |
79 |

Edit Profile

80 |
81 |
82 |
83 | 84 |
85 |
86 | 87 |
88 | setName(e.target.value)}/> 92 |
93 |
94 | 95 |
96 | 100 |
101 |
102 |
103 |
104 | 105 |
107 |
108 |
109 |
110 | 111 |
112 |

Change Password

113 |
114 |
115 |
116 | 118 |
119 |
120 | 121 |
122 | setPassword(e.target.value)}/> 126 |
127 |
128 | 129 |
130 | 132 |
133 |
134 | 135 |
136 | setConfirmPassword(e.target.value)}/> 140 |
141 |
142 | 143 |
144 | 148 |
149 |
150 |
151 |
152 |
153 | 154 | } -------------------------------------------------------------------------------- /src/components/User/UserRegister.jsx: -------------------------------------------------------------------------------- 1 | import {useState} from "react"; 2 | import {alertError, alertSuccess} from "../../lib/alert.js"; 3 | import {userRegister} from "../../lib/api/UserApi.js"; 4 | import {Link, useNavigate} from "react-router"; 5 | 6 | export default function UserRegister() { 7 | 8 | const [username, setUsername] = useState(''); 9 | const [name, setName] = useState(''); 10 | const [password, setPassword] = useState(''); 11 | const [confirmPassword, setConfirmPassword] = useState(''); 12 | const navigate = useNavigate(); 13 | 14 | async function handleSubmit(e) { 15 | e.preventDefault(); 16 | 17 | if (password !== confirmPassword) { 18 | await alertError("Passwords don't match"); 19 | return; 20 | } 21 | 22 | const response = await userRegister({ 23 | username: username, 24 | password: password, 25 | name: name 26 | }); 27 | const responseBody = await response.json(); 28 | console.log(responseBody); 29 | 30 | if (response.status === 200) { 31 | await alertSuccess("User created successfully"); 32 | await navigate({ 33 | pathname: "/login" 34 | }); 35 | } else { 36 | await alertError(responseBody.errors); 37 | } 38 | } 39 | 40 | return <> 41 |
43 |
44 |
45 | 46 |
47 |

Contact Management

48 |

Create a new account

49 |
50 | 51 |
52 |
53 | 54 |
55 |
56 | 57 |
58 | setUsername(e.target.value)}/> 62 |
63 |
64 | 65 |
66 | 67 |
68 |
69 | 70 |
71 | setName(e.target.value)}/> 74 |
75 |
76 | 77 |
78 | 79 |
80 |
81 | 82 |
83 | setPassword(e.target.value)}/> 87 |
88 |
89 | 90 |
91 | 93 |
94 |
95 | 96 |
97 | setConfirmPassword(e.target.value)}/> 101 |
102 |
103 | 104 |
105 | 109 |
110 | 111 |
112 | Already have an account? 113 | Sign 114 | in 115 |
116 |
117 |
118 | 119 | } -------------------------------------------------------------------------------- /src/lib/alert.js: -------------------------------------------------------------------------------- 1 | import Swal from "sweetalert2"; 2 | 3 | export const alertSuccess = async (message) => { 4 | return Swal.fire({ 5 | icon: 'success', 6 | title: "Success", 7 | text: message, 8 | }) 9 | } 10 | 11 | export const alertError = async (message) => { 12 | return Swal.fire({ 13 | icon: 'error', 14 | title: "Ups", 15 | text: message, 16 | }) 17 | } 18 | 19 | export const alertConfirm = async (message) => { 20 | const result = await Swal.fire({ 21 | icon: 'question', 22 | title: "Are you sure?", 23 | text: message, 24 | showCancelButton: true, 25 | confirmButtonColor: '#d33', 26 | cancelButtonColor: '#3085d6', 27 | confirmButtonText: 'Yes' 28 | }) 29 | return result.isConfirmed; 30 | } -------------------------------------------------------------------------------- /src/lib/api/AddressApi.js: -------------------------------------------------------------------------------- 1 | export const addressCreate = async (token, id, {street, city, province, country, postal_code}) => { 2 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}/addresses`, { 3 | method: 'POST', 4 | headers: { 5 | 'Content-Type': 'application/json', 6 | 'Accept': 'application/json', 7 | 'Authorization': token 8 | }, 9 | body: JSON.stringify({ 10 | street, 11 | city, 12 | province, 13 | country, 14 | postal_code 15 | }) 16 | }) 17 | } 18 | 19 | export const addressList = async (token, id) => { 20 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}/addresses`, { 21 | method: 'GET', 22 | headers: { 23 | 'Accept': 'application/json', 24 | 'Authorization': token 25 | } 26 | }) 27 | } 28 | 29 | export const addressDetail = async (token, id, addressId) => { 30 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}/addresses/${addressId}`, { 31 | method: 'GET', 32 | headers: { 33 | 'Accept': 'application/json', 34 | 'Authorization': token 35 | } 36 | }) 37 | } 38 | 39 | export const addressUpdate = async (token, id, {addressId, street, city, province, country, postal_code}) => { 40 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}/addresses/${addressId}`, { 41 | method: 'PUT', 42 | headers: { 43 | 'Content-Type': 'application/json', 44 | 'Accept': 'application/json', 45 | 'Authorization': token 46 | }, 47 | body: JSON.stringify({ 48 | street, 49 | city, 50 | province, 51 | country, 52 | postal_code 53 | }) 54 | }) 55 | } 56 | 57 | export const addressDelete = async (token, id, addressId) => { 58 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}/addresses/${addressId}`, { 59 | method: 'DELETE', 60 | headers: { 61 | 'Accept': 'application/json', 62 | 'Authorization': token 63 | } 64 | }) 65 | } -------------------------------------------------------------------------------- /src/lib/api/ContactApi.js: -------------------------------------------------------------------------------- 1 | export const contactCreate = async (token, {first_name, last_name, email, phone}) => { 2 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts`, { 3 | method: 'POST', 4 | headers: { 5 | 'Content-Type': 'application/json', 6 | 'Accept': 'application/json', 7 | 'Authorization': token 8 | }, 9 | body: JSON.stringify({ 10 | first_name, 11 | last_name, 12 | email, 13 | phone 14 | }) 15 | }) 16 | } 17 | 18 | export const contactList = async (token, {name, phone, email, page}) => { 19 | const url = new URL(`${import.meta.env.VITE_API_PATH}/contacts`); 20 | 21 | if (name) url.searchParams.append('name', name); 22 | if (phone) url.searchParams.append('phone', phone); 23 | if (email) url.searchParams.append('email', email); 24 | if (page) url.searchParams.append('page', page); 25 | 26 | return await fetch(url, { 27 | method: 'GET', 28 | headers: { 29 | 'Accept': 'application/json', 30 | 'Authorization': token 31 | } 32 | }) 33 | } 34 | 35 | export const contactDelete = async (token, id) => { 36 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}`, { 37 | method: 'DELETE', 38 | headers: { 39 | 'Accept': 'application/json', 40 | 'Authorization': token 41 | } 42 | }) 43 | } 44 | 45 | export const contactDetail = async (token, id) => { 46 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}`, { 47 | method: 'GET', 48 | headers: { 49 | 'Accept': 'application/json', 50 | 'Authorization': token 51 | } 52 | }) 53 | } 54 | 55 | export const contactUpdate = async (token, {id, first_name, last_name, email, phone}) => { 56 | return await fetch(`${import.meta.env.VITE_API_PATH}/contacts/${id}`, { 57 | method: 'PUT', 58 | headers: { 59 | 'Content-Type': 'application/json', 60 | 'Accept': 'application/json', 61 | 'Authorization': token 62 | }, 63 | body: JSON.stringify({ 64 | first_name, 65 | last_name, 66 | email, 67 | phone 68 | }) 69 | }) 70 | } -------------------------------------------------------------------------------- /src/lib/api/UserApi.js: -------------------------------------------------------------------------------- 1 | export const userRegister = async ({username, password, name}) => { 2 | return await fetch(`${import.meta.env.VITE_API_PATH}/users`, { 3 | method: 'POST', 4 | headers: { 5 | 'Content-Type': 'application/json', 6 | 'Accept': 'application/json', 7 | }, 8 | body: JSON.stringify({ 9 | username, 10 | password, 11 | name 12 | }), 13 | }) 14 | } 15 | 16 | export const userLogin = async ({username, password}) => { 17 | return await fetch(`${import.meta.env.VITE_API_PATH}/users/login`, { 18 | method: 'POST', 19 | headers: { 20 | 'Content-Type': 'application/json', 21 | 'Accept': 'application/json', 22 | }, 23 | body: JSON.stringify({ 24 | username, 25 | password 26 | }), 27 | }) 28 | } 29 | 30 | export const userUpdateProfile = async (token, {name}) => { 31 | return await fetch(`${import.meta.env.VITE_API_PATH}/users/current`, { 32 | method: 'PATCH', 33 | headers: { 34 | 'Content-Type': 'application/json', 35 | 'Accept': 'application/json', 36 | 'Authorization': token 37 | }, 38 | body: JSON.stringify({ 39 | name 40 | }), 41 | }) 42 | } 43 | 44 | export const userUpdatePassword = async (token, {password}) => { 45 | return await fetch(`${import.meta.env.VITE_API_PATH}/users/current`, { 46 | method: 'PATCH', 47 | headers: { 48 | 'Content-Type': 'application/json', 49 | 'Accept': 'application/json', 50 | 'Authorization': token 51 | }, 52 | body: JSON.stringify({ 53 | password 54 | }), 55 | }) 56 | } 57 | 58 | export const userDetail = async (token) => { 59 | return await fetch(`${import.meta.env.VITE_API_PATH}/users/current`, { 60 | method: 'GET', 61 | headers: { 62 | 'Accept': 'application/json', 63 | 'Authorization': token 64 | } 65 | }) 66 | } 67 | 68 | export const userLogout = async (token) => { 69 | return await fetch(`${import.meta.env.VITE_API_PATH}/users/logout`, { 70 | method: 'DELETE', 71 | headers: { 72 | 'Accept': 'application/json', 73 | 'Authorization': token 74 | } 75 | }) 76 | } -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import {StrictMode} from 'react' 2 | import {createRoot} from 'react-dom/client' 3 | import {BrowserRouter, Route, Routes} from "react-router"; 4 | import Layout from "./components/Layout.jsx"; 5 | import UserRegister from "./components/User/UserRegister.jsx"; 6 | import UserLogin from "./components/User/UserLogin.jsx"; 7 | import DashboardLayout from "./components/DashboardLayout.jsx"; 8 | import UserProfile from "./components/User/UserProfile.jsx"; 9 | import UserLogout from "./components/User/UserLogout.jsx"; 10 | import ContactCreate from "./components/Contact/ContactCreate.jsx"; 11 | import ContactList from "./components/Contact/ContactList.jsx"; 12 | import ContactEdit from "./components/Contact/ContactEdit.jsx"; 13 | import ContactDetail from "./components/Contact/ContactDetail.jsx"; 14 | import AddressCreate from "./components/Address/AddressCreate.jsx"; 15 | import AddressEdit from "./components/Address/AddressEdit.jsx"; 16 | 17 | createRoot(document.getElementById('root')).render( 18 | 19 | 20 | 21 | }> 22 | }/> 23 | }/> 24 | 25 | }> 26 | 27 | 28 | }/> 29 | }/> 30 | 31 | 32 | 33 | }/> 34 | }/> 35 | 36 | }/> 37 | }/> 38 | 39 | }/> 40 | }/> 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | , 49 | ) 50 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vite.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | --------------------------------------------------------------------------------