add eslint to be able to handle sorting imports

+7 -2
deno.json
··· 18 18 "compile": { 19 19 "command": "deno compile --include=./dist --no-check --allow-read=./dist --allow-net='0.0.0.0:3001' ./src/server/main.ts", 20 20 "dependencies": ["build"] 21 - } 21 + }, 22 + "format:imports": "deno run -A npm:eslint --fix 'src/**/*.{ts,tsx}'", 23 + "format": "deno run format:imports && deno fmt" 22 24 }, 23 25 24 26 "imports": { ··· 29 31 "@sitnik/nanoid": "jsr:@sitnik/nanoid@^5.1.5", 30 32 "@types/react": "npm:@types/react@^19.1.6", 31 33 "@types/react-dom": "npm:@types/react-dom@^19.1.6", 34 + "@typescript-eslint/parser": "npm:@typescript-eslint/parser@^8.34.0", 32 35 "@vitejs/plugin-react": "npm:@vitejs/plugin-react@^4.4.1", 36 + "eslint-plugin-simple-import-sort": "npm:eslint-plugin-simple-import-sort@^12.1.1", 33 37 "react": "npm:react@^19.1.0", 34 38 "react-dom": "npm:react-dom@^19.1.0", 35 39 "react-router-dom": "npm:react-router-dom@^7.5.1", 36 40 "vite": "npm:vite@^6.3.2", 37 - "zod": "npm:zod@3" 41 + "zod": "npm:zod@3", 42 + "zustand": "npm:zustand@^5.0.5" 38 43 }, 39 44 "nodeModulesDir": "auto", 40 45
+832 -10
deno.lock
··· 20 20 "npm:@types/node@*": "22.15.15", 21 21 "npm:@types/react-dom@^19.1.6": "19.1.6_@types+react@19.1.6", 22 22 "npm:@types/react@^19.1.6": "19.1.6", 23 + "npm:@typescript-eslint/parser@^8.34.0": "8.34.0_eslint@9.28.0_typescript@5.8.3", 23 24 "npm:@vitejs/plugin-react@^4.4.1": "4.5.1_vite@6.3.5__picomatch@4.0.2_@babel+core@7.27.4_@types+node@22.15.15", 25 + "npm:eslint-plugin-simple-import-sort@^12.1.1": "12.1.1_eslint@9.28.0", 26 + "npm:eslint@*": "9.28.0", 27 + "npm:eslint@8.57.0": "8.57.0", 24 28 "npm:path-to-regexp@^6.3.0": "6.3.0", 25 29 "npm:react-dom@^19.1.0": "19.1.0_react@19.1.0", 26 30 "npm:react-router-dom@^7.5.1": "7.6.2_react@19.1.0_react-dom@19.1.0__react@19.1.0", 27 31 "npm:react@^19.1.0": "19.1.0", 28 32 "npm:vite@^6.3.2": "6.3.5_picomatch@4.0.2_@types+node@22.15.15", 29 - "npm:zod@3": "3.25.53" 33 + "npm:zod@3": "3.25.53", 34 + "npm:zustand@^5.0.5": "5.0.5_@types+react@19.1.6_react@19.1.0" 30 35 }, 31 36 "jsr": { 32 37 "@oak/commons@1.0.1": { ··· 125 130 "debug", 126 131 "gensync", 127 132 "json5", 128 - "semver" 133 + "semver@6.3.1" 129 134 ] 130 135 }, 131 136 "@babel/generator@7.27.5": { ··· 145 150 "@babel/helper-validator-option", 146 151 "browserslist", 147 152 "lru-cache", 148 - "semver" 153 + "semver@6.3.1" 149 154 ] 150 155 }, 151 156 "@babel/helper-module-imports@7.27.1": { ··· 221 226 "@babel/template", 222 227 "@babel/types", 223 228 "debug", 224 - "globals" 229 + "globals@11.12.0" 225 230 ] 226 231 }, 227 232 "@babel/types@7.27.6": { ··· 368 373 "os": ["win32"], 369 374 "cpu": ["x64"] 370 375 }, 376 + "@eslint-community/eslint-utils@4.7.0_eslint@8.57.0": { 377 + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 378 + "dependencies": [ 379 + "eslint@8.57.0", 380 + "eslint-visitor-keys@3.4.3" 381 + ] 382 + }, 383 + "@eslint-community/eslint-utils@4.7.0_eslint@9.28.0": { 384 + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 385 + "dependencies": [ 386 + "eslint@9.28.0", 387 + "eslint-visitor-keys@3.4.3" 388 + ] 389 + }, 390 + "@eslint-community/regexpp@4.12.1": { 391 + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==" 392 + }, 393 + "@eslint/config-array@0.20.0": { 394 + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", 395 + "dependencies": [ 396 + "@eslint/object-schema", 397 + "debug", 398 + "minimatch@3.1.2" 399 + ] 400 + }, 401 + "@eslint/config-helpers@0.2.2": { 402 + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==" 403 + }, 404 + "@eslint/core@0.14.0": { 405 + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", 406 + "dependencies": [ 407 + "@types/json-schema" 408 + ] 409 + }, 410 + "@eslint/eslintrc@2.1.4": { 411 + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 412 + "dependencies": [ 413 + "ajv", 414 + "debug", 415 + "espree@9.6.1_acorn@8.15.0", 416 + "globals@13.24.0", 417 + "ignore", 418 + "import-fresh", 419 + "js-yaml", 420 + "minimatch@3.1.2", 421 + "strip-json-comments" 422 + ] 423 + }, 424 + "@eslint/eslintrc@3.3.1": { 425 + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 426 + "dependencies": [ 427 + "ajv", 428 + "debug", 429 + "espree@10.4.0_acorn@8.15.0", 430 + "globals@14.0.0", 431 + "ignore", 432 + "import-fresh", 433 + "js-yaml", 434 + "minimatch@3.1.2", 435 + "strip-json-comments" 436 + ] 437 + }, 438 + "@eslint/js@8.57.0": { 439 + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==" 440 + }, 441 + "@eslint/js@9.28.0": { 442 + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==" 443 + }, 444 + "@eslint/object-schema@2.1.6": { 445 + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==" 446 + }, 447 + "@eslint/plugin-kit@0.3.1": { 448 + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", 449 + "dependencies": [ 450 + "@eslint/core", 451 + "levn" 452 + ] 453 + }, 454 + "@humanfs/core@0.19.1": { 455 + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" 456 + }, 457 + "@humanfs/node@0.16.6": { 458 + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 459 + "dependencies": [ 460 + "@humanfs/core", 461 + "@humanwhocodes/retry@0.3.1" 462 + ] 463 + }, 464 + "@humanwhocodes/config-array@0.11.14": { 465 + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", 466 + "dependencies": [ 467 + "@humanwhocodes/object-schema", 468 + "debug", 469 + "minimatch@3.1.2" 470 + ], 471 + "deprecated": true 472 + }, 473 + "@humanwhocodes/module-importer@1.0.1": { 474 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" 475 + }, 476 + "@humanwhocodes/object-schema@2.0.3": { 477 + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 478 + "deprecated": true 479 + }, 480 + "@humanwhocodes/retry@0.3.1": { 481 + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==" 482 + }, 483 + "@humanwhocodes/retry@0.4.3": { 484 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" 485 + }, 371 486 "@jridgewell/gen-mapping@0.3.8": { 372 487 "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 373 488 "dependencies": [ ··· 390 505 "dependencies": [ 391 506 "@jridgewell/resolve-uri", 392 507 "@jridgewell/sourcemap-codec" 508 + ] 509 + }, 510 + "@nodelib/fs.scandir@2.1.5": { 511 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 512 + "dependencies": [ 513 + "@nodelib/fs.stat", 514 + "run-parallel" 515 + ] 516 + }, 517 + "@nodelib/fs.stat@2.0.5": { 518 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 519 + }, 520 + "@nodelib/fs.walk@1.2.8": { 521 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 522 + "dependencies": [ 523 + "@nodelib/fs.scandir", 524 + "fastq" 393 525 ] 394 526 }, 395 527 "@rolldown/pluginutils@1.0.0-beta.9": { ··· 527 659 "@types/estree@1.0.7": { 528 660 "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" 529 661 }, 662 + "@types/json-schema@7.0.15": { 663 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" 664 + }, 530 665 "@types/node@22.15.15": { 531 666 "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", 532 667 "dependencies": [ ··· 545 680 "csstype" 546 681 ] 547 682 }, 683 + "@typescript-eslint/parser@8.34.0_eslint@9.28.0_typescript@5.8.3": { 684 + "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", 685 + "dependencies": [ 686 + "@typescript-eslint/scope-manager", 687 + "@typescript-eslint/types", 688 + "@typescript-eslint/typescript-estree", 689 + "@typescript-eslint/visitor-keys", 690 + "debug", 691 + "eslint@9.28.0", 692 + "typescript" 693 + ] 694 + }, 695 + "@typescript-eslint/project-service@8.34.0_typescript@5.8.3": { 696 + "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", 697 + "dependencies": [ 698 + "@typescript-eslint/tsconfig-utils", 699 + "@typescript-eslint/types", 700 + "debug", 701 + "typescript" 702 + ] 703 + }, 704 + "@typescript-eslint/scope-manager@8.34.0": { 705 + "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", 706 + "dependencies": [ 707 + "@typescript-eslint/types", 708 + "@typescript-eslint/visitor-keys" 709 + ] 710 + }, 711 + "@typescript-eslint/tsconfig-utils@8.34.0_typescript@5.8.3": { 712 + "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", 713 + "dependencies": [ 714 + "typescript" 715 + ] 716 + }, 717 + "@typescript-eslint/types@8.34.0": { 718 + "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==" 719 + }, 720 + "@typescript-eslint/typescript-estree@8.34.0_typescript@5.8.3": { 721 + "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", 722 + "dependencies": [ 723 + "@typescript-eslint/project-service", 724 + "@typescript-eslint/tsconfig-utils", 725 + "@typescript-eslint/types", 726 + "@typescript-eslint/visitor-keys", 727 + "debug", 728 + "fast-glob", 729 + "is-glob", 730 + "minimatch@9.0.5", 731 + "semver@7.7.2", 732 + "ts-api-utils", 733 + "typescript" 734 + ] 735 + }, 736 + "@typescript-eslint/visitor-keys@8.34.0": { 737 + "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", 738 + "dependencies": [ 739 + "@typescript-eslint/types", 740 + "eslint-visitor-keys@4.2.1" 741 + ] 742 + }, 743 + "@ungap/structured-clone@1.3.0": { 744 + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" 745 + }, 548 746 "@vitejs/plugin-react@4.5.1_vite@6.3.5__picomatch@4.0.2_@babel+core@7.27.4": { 549 747 "integrity": "sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==", 550 748 "dependencies": [ ··· 569 767 "vite@6.3.5_picomatch@4.0.2_@types+node@22.15.15" 570 768 ] 571 769 }, 770 + "acorn-jsx@5.3.2_acorn@8.15.0": { 771 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 772 + "dependencies": [ 773 + "acorn" 774 + ] 775 + }, 776 + "acorn@8.15.0": { 777 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 778 + "bin": true 779 + }, 780 + "ajv@6.12.6": { 781 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 782 + "dependencies": [ 783 + "fast-deep-equal", 784 + "fast-json-stable-stringify", 785 + "json-schema-traverse", 786 + "uri-js" 787 + ] 788 + }, 789 + "ansi-regex@5.0.1": { 790 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 791 + }, 792 + "ansi-styles@4.3.0": { 793 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 794 + "dependencies": [ 795 + "color-convert" 796 + ] 797 + }, 798 + "argparse@2.0.1": { 799 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 800 + }, 801 + "balanced-match@1.0.2": { 802 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 803 + }, 804 + "brace-expansion@1.1.11": { 805 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 806 + "dependencies": [ 807 + "balanced-match", 808 + "concat-map" 809 + ] 810 + }, 811 + "brace-expansion@2.0.1": { 812 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 813 + "dependencies": [ 814 + "balanced-match" 815 + ] 816 + }, 817 + "braces@3.0.3": { 818 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 819 + "dependencies": [ 820 + "fill-range" 821 + ] 822 + }, 572 823 "browserslist@4.25.0": { 573 824 "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", 574 825 "dependencies": [ ··· 579 830 ], 580 831 "bin": true 581 832 }, 833 + "callsites@3.1.0": { 834 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 835 + }, 582 836 "caniuse-lite@1.0.30001721": { 583 837 "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==" 584 838 }, 839 + "chalk@4.1.2": { 840 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 841 + "dependencies": [ 842 + "ansi-styles", 843 + "supports-color" 844 + ] 845 + }, 846 + "color-convert@2.0.1": { 847 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 848 + "dependencies": [ 849 + "color-name" 850 + ] 851 + }, 852 + "color-name@1.1.4": { 853 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 854 + }, 855 + "concat-map@0.0.1": { 856 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 857 + }, 585 858 "convert-source-map@2.0.0": { 586 859 "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 587 860 }, 588 861 "cookie@1.0.2": { 589 862 "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" 590 863 }, 864 + "cross-spawn@7.0.6": { 865 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 866 + "dependencies": [ 867 + "path-key", 868 + "shebang-command", 869 + "which" 870 + ] 871 + }, 591 872 "csstype@3.1.3": { 592 873 "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 593 874 }, ··· 597 878 "ms" 598 879 ] 599 880 }, 881 + "deep-is@0.1.4": { 882 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" 883 + }, 884 + "doctrine@3.0.0": { 885 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 886 + "dependencies": [ 887 + "esutils" 888 + ] 889 + }, 600 890 "electron-to-chromium@1.5.165": { 601 891 "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==" 602 892 }, ··· 635 925 "escalade@3.2.0": { 636 926 "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" 637 927 }, 928 + "escape-string-regexp@4.0.0": { 929 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 930 + }, 931 + "eslint-plugin-simple-import-sort@12.1.1_eslint@9.28.0": { 932 + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", 933 + "dependencies": [ 934 + "eslint@9.28.0" 935 + ] 936 + }, 937 + "eslint-scope@7.2.2": { 938 + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 939 + "dependencies": [ 940 + "esrecurse", 941 + "estraverse" 942 + ] 943 + }, 944 + "eslint-scope@8.4.0": { 945 + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 946 + "dependencies": [ 947 + "esrecurse", 948 + "estraverse" 949 + ] 950 + }, 951 + "eslint-visitor-keys@3.4.3": { 952 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" 953 + }, 954 + "eslint-visitor-keys@4.2.1": { 955 + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" 956 + }, 957 + "eslint@8.57.0": { 958 + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", 959 + "dependencies": [ 960 + "@eslint-community/eslint-utils@4.7.0_eslint@8.57.0", 961 + "@eslint-community/regexpp", 962 + "@eslint/eslintrc@2.1.4", 963 + "@eslint/js@8.57.0", 964 + "@humanwhocodes/config-array", 965 + "@humanwhocodes/module-importer", 966 + "@nodelib/fs.walk", 967 + "@ungap/structured-clone", 968 + "ajv", 969 + "chalk", 970 + "cross-spawn", 971 + "debug", 972 + "doctrine", 973 + "escape-string-regexp", 974 + "eslint-scope@7.2.2", 975 + "eslint-visitor-keys@3.4.3", 976 + "espree@9.6.1_acorn@8.15.0", 977 + "esquery", 978 + "esutils", 979 + "fast-deep-equal", 980 + "file-entry-cache@6.0.1", 981 + "find-up", 982 + "glob-parent@6.0.2", 983 + "globals@13.24.0", 984 + "graphemer", 985 + "ignore", 986 + "imurmurhash", 987 + "is-glob", 988 + "is-path-inside", 989 + "js-yaml", 990 + "json-stable-stringify-without-jsonify", 991 + "levn", 992 + "lodash.merge", 993 + "minimatch@3.1.2", 994 + "natural-compare", 995 + "optionator", 996 + "strip-ansi", 997 + "text-table" 998 + ], 999 + "deprecated": true, 1000 + "bin": true 1001 + }, 1002 + "eslint@9.28.0": { 1003 + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", 1004 + "dependencies": [ 1005 + "@eslint-community/eslint-utils@4.7.0_eslint@9.28.0", 1006 + "@eslint-community/regexpp", 1007 + "@eslint/config-array", 1008 + "@eslint/config-helpers", 1009 + "@eslint/core", 1010 + "@eslint/eslintrc@3.3.1", 1011 + "@eslint/js@9.28.0", 1012 + "@eslint/plugin-kit", 1013 + "@humanfs/node", 1014 + "@humanwhocodes/module-importer", 1015 + "@humanwhocodes/retry@0.4.3", 1016 + "@types/estree", 1017 + "@types/json-schema", 1018 + "ajv", 1019 + "chalk", 1020 + "cross-spawn", 1021 + "debug", 1022 + "escape-string-regexp", 1023 + "eslint-scope@8.4.0", 1024 + "eslint-visitor-keys@4.2.1", 1025 + "espree@10.4.0_acorn@8.15.0", 1026 + "esquery", 1027 + "esutils", 1028 + "fast-deep-equal", 1029 + "file-entry-cache@8.0.0", 1030 + "find-up", 1031 + "glob-parent@6.0.2", 1032 + "ignore", 1033 + "imurmurhash", 1034 + "is-glob", 1035 + "json-stable-stringify-without-jsonify", 1036 + "lodash.merge", 1037 + "minimatch@3.1.2", 1038 + "natural-compare", 1039 + "optionator" 1040 + ], 1041 + "bin": true 1042 + }, 1043 + "espree@10.4.0_acorn@8.15.0": { 1044 + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 1045 + "dependencies": [ 1046 + "acorn", 1047 + "acorn-jsx", 1048 + "eslint-visitor-keys@4.2.1" 1049 + ] 1050 + }, 1051 + "espree@9.6.1_acorn@8.15.0": { 1052 + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1053 + "dependencies": [ 1054 + "acorn", 1055 + "acorn-jsx", 1056 + "eslint-visitor-keys@3.4.3" 1057 + ] 1058 + }, 1059 + "esquery@1.6.0": { 1060 + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1061 + "dependencies": [ 1062 + "estraverse" 1063 + ] 1064 + }, 1065 + "esrecurse@4.3.0": { 1066 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1067 + "dependencies": [ 1068 + "estraverse" 1069 + ] 1070 + }, 1071 + "estraverse@5.3.0": { 1072 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" 1073 + }, 1074 + "esutils@2.0.3": { 1075 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 1076 + }, 1077 + "fast-deep-equal@3.1.3": { 1078 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 1079 + }, 1080 + "fast-glob@3.3.3": { 1081 + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1082 + "dependencies": [ 1083 + "@nodelib/fs.stat", 1084 + "@nodelib/fs.walk", 1085 + "glob-parent@5.1.2", 1086 + "merge2", 1087 + "micromatch" 1088 + ] 1089 + }, 1090 + "fast-json-stable-stringify@2.1.0": { 1091 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1092 + }, 1093 + "fast-levenshtein@2.0.6": { 1094 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" 1095 + }, 1096 + "fastq@1.19.1": { 1097 + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 1098 + "dependencies": [ 1099 + "reusify" 1100 + ] 1101 + }, 638 1102 "fdir@6.4.5_picomatch@4.0.2": { 639 1103 "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", 640 1104 "dependencies": [ 641 - "picomatch" 1105 + "picomatch@4.0.2" 642 1106 ], 643 1107 "optionalPeers": [ 644 - "picomatch" 1108 + "picomatch@4.0.2" 1109 + ] 1110 + }, 1111 + "file-entry-cache@6.0.1": { 1112 + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1113 + "dependencies": [ 1114 + "flat-cache@3.2.0" 1115 + ] 1116 + }, 1117 + "file-entry-cache@8.0.0": { 1118 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1119 + "dependencies": [ 1120 + "flat-cache@4.0.1" 1121 + ] 1122 + }, 1123 + "fill-range@7.1.1": { 1124 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1125 + "dependencies": [ 1126 + "to-regex-range" 1127 + ] 1128 + }, 1129 + "find-up@5.0.0": { 1130 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1131 + "dependencies": [ 1132 + "locate-path", 1133 + "path-exists" 1134 + ] 1135 + }, 1136 + "flat-cache@3.2.0": { 1137 + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1138 + "dependencies": [ 1139 + "flatted", 1140 + "keyv", 1141 + "rimraf" 645 1142 ] 646 1143 }, 1144 + "flat-cache@4.0.1": { 1145 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1146 + "dependencies": [ 1147 + "flatted", 1148 + "keyv" 1149 + ] 1150 + }, 1151 + "flatted@3.3.3": { 1152 + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" 1153 + }, 1154 + "fs.realpath@1.0.0": { 1155 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 1156 + }, 647 1157 "fsevents@2.3.3": { 648 1158 "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 649 1159 "os": ["darwin"], ··· 652 1162 "gensync@1.0.0-beta.2": { 653 1163 "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" 654 1164 }, 1165 + "glob-parent@5.1.2": { 1166 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1167 + "dependencies": [ 1168 + "is-glob" 1169 + ] 1170 + }, 1171 + "glob-parent@6.0.2": { 1172 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1173 + "dependencies": [ 1174 + "is-glob" 1175 + ] 1176 + }, 1177 + "glob@7.2.3": { 1178 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1179 + "dependencies": [ 1180 + "fs.realpath", 1181 + "inflight", 1182 + "inherits", 1183 + "minimatch@3.1.2", 1184 + "once", 1185 + "path-is-absolute" 1186 + ], 1187 + "deprecated": true 1188 + }, 655 1189 "globals@11.12.0": { 656 1190 "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" 657 1191 }, 1192 + "globals@13.24.0": { 1193 + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1194 + "dependencies": [ 1195 + "type-fest" 1196 + ] 1197 + }, 1198 + "globals@14.0.0": { 1199 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" 1200 + }, 1201 + "graphemer@1.4.0": { 1202 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 1203 + }, 1204 + "has-flag@4.0.0": { 1205 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1206 + }, 1207 + "ignore@5.3.2": { 1208 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" 1209 + }, 1210 + "import-fresh@3.3.1": { 1211 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1212 + "dependencies": [ 1213 + "parent-module", 1214 + "resolve-from" 1215 + ] 1216 + }, 1217 + "imurmurhash@0.1.4": { 1218 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" 1219 + }, 1220 + "inflight@1.0.6": { 1221 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1222 + "dependencies": [ 1223 + "once", 1224 + "wrappy" 1225 + ], 1226 + "deprecated": true 1227 + }, 1228 + "inherits@2.0.4": { 1229 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1230 + }, 1231 + "is-extglob@2.1.1": { 1232 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 1233 + }, 1234 + "is-glob@4.0.3": { 1235 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1236 + "dependencies": [ 1237 + "is-extglob" 1238 + ] 1239 + }, 1240 + "is-number@7.0.0": { 1241 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1242 + }, 1243 + "is-path-inside@3.0.3": { 1244 + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" 1245 + }, 1246 + "isexe@2.0.0": { 1247 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1248 + }, 658 1249 "js-tokens@4.0.0": { 659 1250 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 660 1251 }, 1252 + "js-yaml@4.1.0": { 1253 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1254 + "dependencies": [ 1255 + "argparse" 1256 + ], 1257 + "bin": true 1258 + }, 661 1259 "jsesc@3.1.0": { 662 1260 "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 663 1261 "bin": true 1262 + }, 1263 + "json-buffer@3.0.1": { 1264 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 1265 + }, 1266 + "json-schema-traverse@0.4.1": { 1267 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1268 + }, 1269 + "json-stable-stringify-without-jsonify@1.0.1": { 1270 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" 664 1271 }, 665 1272 "json5@2.2.3": { 666 1273 "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 667 1274 "bin": true 668 1275 }, 1276 + "keyv@4.5.4": { 1277 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1278 + "dependencies": [ 1279 + "json-buffer" 1280 + ] 1281 + }, 1282 + "levn@0.4.1": { 1283 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1284 + "dependencies": [ 1285 + "prelude-ls", 1286 + "type-check" 1287 + ] 1288 + }, 1289 + "locate-path@6.0.0": { 1290 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1291 + "dependencies": [ 1292 + "p-locate" 1293 + ] 1294 + }, 1295 + "lodash.merge@4.6.2": { 1296 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 1297 + }, 669 1298 "lru-cache@5.1.1": { 670 1299 "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 671 1300 "dependencies": [ 672 1301 "yallist" 673 1302 ] 674 1303 }, 1304 + "merge2@1.4.1": { 1305 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 1306 + }, 1307 + "micromatch@4.0.8": { 1308 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1309 + "dependencies": [ 1310 + "braces", 1311 + "picomatch@2.3.1" 1312 + ] 1313 + }, 1314 + "minimatch@3.1.2": { 1315 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1316 + "dependencies": [ 1317 + "brace-expansion@1.1.11" 1318 + ] 1319 + }, 1320 + "minimatch@9.0.5": { 1321 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1322 + "dependencies": [ 1323 + "brace-expansion@2.0.1" 1324 + ] 1325 + }, 675 1326 "ms@2.1.3": { 676 1327 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 677 1328 }, 678 1329 "nanoid@3.3.11": { 679 1330 "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 680 1331 "bin": true 1332 + }, 1333 + "natural-compare@1.4.0": { 1334 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" 681 1335 }, 682 1336 "node-releases@2.0.19": { 683 1337 "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" 684 1338 }, 1339 + "once@1.4.0": { 1340 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1341 + "dependencies": [ 1342 + "wrappy" 1343 + ] 1344 + }, 1345 + "optionator@0.9.4": { 1346 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1347 + "dependencies": [ 1348 + "deep-is", 1349 + "fast-levenshtein", 1350 + "levn", 1351 + "prelude-ls", 1352 + "type-check", 1353 + "word-wrap" 1354 + ] 1355 + }, 1356 + "p-limit@3.1.0": { 1357 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1358 + "dependencies": [ 1359 + "yocto-queue" 1360 + ] 1361 + }, 1362 + "p-locate@5.0.0": { 1363 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1364 + "dependencies": [ 1365 + "p-limit" 1366 + ] 1367 + }, 1368 + "parent-module@1.0.1": { 1369 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1370 + "dependencies": [ 1371 + "callsites" 1372 + ] 1373 + }, 1374 + "path-exists@4.0.0": { 1375 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 1376 + }, 1377 + "path-is-absolute@1.0.1": { 1378 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" 1379 + }, 1380 + "path-key@3.1.1": { 1381 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 1382 + }, 685 1383 "path-to-regexp@6.3.0": { 686 1384 "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" 687 1385 }, 688 1386 "picocolors@1.1.1": { 689 1387 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 690 1388 }, 1389 + "picomatch@2.3.1": { 1390 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1391 + }, 691 1392 "picomatch@4.0.2": { 692 1393 "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" 693 1394 }, ··· 698 1399 "picocolors", 699 1400 "source-map-js" 700 1401 ] 1402 + }, 1403 + "prelude-ls@1.2.1": { 1404 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" 1405 + }, 1406 + "punycode@2.3.1": { 1407 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" 1408 + }, 1409 + "queue-microtask@1.2.3": { 1410 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 701 1411 }, 702 1412 "react-dom@19.1.0_react@19.1.0": { 703 1413 "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", ··· 732 1442 "react@19.1.0": { 733 1443 "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==" 734 1444 }, 1445 + "resolve-from@4.0.0": { 1446 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1447 + }, 1448 + "reusify@1.1.0": { 1449 + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" 1450 + }, 1451 + "rimraf@3.0.2": { 1452 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1453 + "dependencies": [ 1454 + "glob" 1455 + ], 1456 + "deprecated": true, 1457 + "bin": true 1458 + }, 735 1459 "rollup@4.41.1": { 736 1460 "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", 737 1461 "dependencies": [ ··· 762 1486 ], 763 1487 "bin": true 764 1488 }, 1489 + "run-parallel@1.2.0": { 1490 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1491 + "dependencies": [ 1492 + "queue-microtask" 1493 + ] 1494 + }, 765 1495 "scheduler@0.26.0": { 766 1496 "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" 767 1497 }, ··· 769 1499 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 770 1500 "bin": true 771 1501 }, 1502 + "semver@7.7.2": { 1503 + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1504 + "bin": true 1505 + }, 772 1506 "set-cookie-parser@2.7.1": { 773 1507 "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" 774 1508 }, 1509 + "shebang-command@2.0.0": { 1510 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1511 + "dependencies": [ 1512 + "shebang-regex" 1513 + ] 1514 + }, 1515 + "shebang-regex@3.0.0": { 1516 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1517 + }, 775 1518 "source-map-js@1.2.1": { 776 1519 "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 777 1520 }, 1521 + "strip-ansi@6.0.1": { 1522 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1523 + "dependencies": [ 1524 + "ansi-regex" 1525 + ] 1526 + }, 1527 + "strip-json-comments@3.1.1": { 1528 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" 1529 + }, 1530 + "supports-color@7.2.0": { 1531 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1532 + "dependencies": [ 1533 + "has-flag" 1534 + ] 1535 + }, 1536 + "text-table@0.2.0": { 1537 + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" 1538 + }, 778 1539 "tinyglobby@0.2.14_picomatch@4.0.2": { 779 1540 "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 780 1541 "dependencies": [ 781 1542 "fdir", 782 - "picomatch" 1543 + "picomatch@4.0.2" 1544 + ] 1545 + }, 1546 + "to-regex-range@5.0.1": { 1547 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1548 + "dependencies": [ 1549 + "is-number" 1550 + ] 1551 + }, 1552 + "ts-api-utils@2.1.0_typescript@5.8.3": { 1553 + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", 1554 + "dependencies": [ 1555 + "typescript" 1556 + ] 1557 + }, 1558 + "type-check@0.4.0": { 1559 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1560 + "dependencies": [ 1561 + "prelude-ls" 783 1562 ] 1563 + }, 1564 + "type-fest@0.20.2": { 1565 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" 1566 + }, 1567 + "typescript@5.8.3": { 1568 + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1569 + "bin": true 784 1570 }, 785 1571 "undici-types@6.21.0": { 786 1572 "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" ··· 794 1580 ], 795 1581 "bin": true 796 1582 }, 1583 + "uri-js@4.4.1": { 1584 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1585 + "dependencies": [ 1586 + "punycode" 1587 + ] 1588 + }, 797 1589 "vite@6.3.5_picomatch@4.0.2": { 798 1590 "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 799 1591 "dependencies": [ 800 1592 "esbuild", 801 1593 "fdir", 802 - "picomatch", 1594 + "picomatch@4.0.2", 803 1595 "postcss", 804 1596 "rollup", 805 1597 "tinyglobby" ··· 815 1607 "@types/node", 816 1608 "esbuild", 817 1609 "fdir", 818 - "picomatch", 1610 + "picomatch@4.0.2", 819 1611 "postcss", 820 1612 "rollup", 821 1613 "tinyglobby" ··· 828 1620 ], 829 1621 "bin": true 830 1622 }, 1623 + "which@2.0.2": { 1624 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1625 + "dependencies": [ 1626 + "isexe" 1627 + ], 1628 + "bin": true 1629 + }, 1630 + "word-wrap@1.2.5": { 1631 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" 1632 + }, 1633 + "wrappy@1.0.2": { 1634 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1635 + }, 831 1636 "yallist@3.1.1": { 832 1637 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 833 1638 }, 1639 + "yocto-queue@0.1.0": { 1640 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 1641 + }, 834 1642 "zod@3.25.53": { 835 1643 "integrity": "sha512-BKOKoY3XcGUVkqaalCtFK15LhwR0G0i65AClFpWSXLN2gJNBGlTktukHgwexCTa/dAacPPp9ReryXPWyeZF4LQ==" 1644 + }, 1645 + "zustand@5.0.5_@types+react@19.1.6_react@19.1.0": { 1646 + "integrity": "sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==", 1647 + "dependencies": [ 1648 + "@types/react", 1649 + "react" 1650 + ], 1651 + "optionalPeers": [ 1652 + "@types/react", 1653 + "react" 1654 + ] 836 1655 } 837 1656 }, 838 1657 "workspace": { ··· 843 1662 "npm:@deno/vite-plugin@^1.0.4", 844 1663 "npm:@types/react-dom@^19.1.6", 845 1664 "npm:@types/react@^19.1.6", 1665 + "npm:@typescript-eslint/parser@^8.34.0", 846 1666 "npm:@vitejs/plugin-react@^4.4.1", 1667 + "npm:eslint-plugin-simple-import-sort@^12.1.1", 847 1668 "npm:react-dom@^19.1.0", 848 1669 "npm:react-router-dom@^7.5.1", 849 1670 "npm:react@^19.1.0", 850 1671 "npm:vite@^6.3.2", 851 - "npm:zod@3" 1672 + "npm:zod@3", 1673 + "npm:zustand@^5.0.5" 852 1674 ] 853 1675 } 854 1676 }
+20
eslint.config.js
··· 1 + import tsParser from "@typescript-eslint/parser"; 2 + import simpleImportSort from "eslint-plugin-simple-import-sort"; 3 + 4 + export default [ 5 + { 6 + files: ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], 7 + languageOptions: { 8 + parser: tsParser, 9 + ecmaVersion: "latest", 10 + sourceType: "module", 11 + }, 12 + plugins: { 13 + "simple-import-sort": simpleImportSort, 14 + }, 15 + rules: { 16 + "simple-import-sort/imports": "error", 17 + "simple-import-sort/exports": "error", 18 + }, 19 + }, 20 + ];
+2 -1
src/client/src/App.tsx
··· 1 + import "./App.css"; 2 + 1 3 import { useState } from "react"; 2 - import "./App.css"; 3 4 4 5 function App() { 5 6 const [count, setCount] = useState(0);
+3 -1
src/client/src/main.tsx
··· 1 + import "./index.css"; 2 + 1 3 import { StrictMode } from "react"; 2 4 import { createRoot } from "react-dom/client"; 3 - import "./index.css"; 5 + 4 6 import App from "./App.tsx"; 5 7 6 8 createRoot(document.getElementById("root")!).render(
+2 -1
src/common/crypto-enc.ts
··· 1 + import { base64url } from "@panva/jose"; 1 2 import { nanoid } from "@sitnik/nanoid"; 3 + 2 4 import { encrAlgo } from "./crypto-algos.ts"; 3 - import { base64url } from "@panva/jose"; 4 5 5 6 export interface Cipher { 6 7 encrypt(input: string): Promise<string>;
+2 -2
src/common/crypto-sig.ts
··· 1 1 import { decodeJwt, importJWK, JWTPayload, jwtVerify, JWTVerifyResult } from "@panva/jose"; 2 - import { generateKeyPair } from "@panva/jose/key/generate/keypair"; 3 2 import { calculateJwkThumbprint } from "@panva/jose/jwk/thumbprint"; 4 3 import { exportJWK } from "@panva/jose/key/export"; 5 - import { z, ZodError } from "zod/v4"; 4 + import { generateKeyPair } from "@panva/jose/key/generate/keypair"; 6 5 import { signAlgo } from "@repo/common/crypto-algos.ts"; 6 + import { z, ZodError } from "zod/v4"; 7 7 8 8 const CLOCK_TOLERANCE_S = 30; 9 9
+1 -1
src/common/socket.ts
··· 1 1 import { BlockingAtom } from "./blocking-atom.ts"; 2 2 import { BlockingQueue } from "./blocking-queue.ts"; 3 - import { makeGate } from "./gate.ts"; 4 3 import { CancellationError } from "./errors.ts"; 4 + import { makeGate } from "./gate.ts"; 5 5 6 6 const STREAM_CONFIG_DEFAULT = { 7 7 signal: undefined as AbortSignal | undefined,
+2 -1
src/schema/proto.ts
··· 1 + import { jwkSchema } from "@repo/common/crypto-sig.ts"; 1 2 import { z } from "zod/v4"; 2 - import { jwkSchema } from "@repo/common/crypto-sig.ts"; 3 + 3 4 import { identIdSchema, realmIdSchema } from "./state.ts"; 4 5 5 6 export const preauthAuthnMessageSchema = z.object({
+1 -1
src/server/main.ts
··· 1 - import { parseArgs } from "jsr:@std/cli/parse-args"; 2 1 import { Application } from "@oak/oak/application"; 2 + import { parseArgs } from "jsr:@std/cli/parse-args"; 3 3 4 4 import { apiMiddleware } from "./routes-api/middleware.ts"; 5 5 import { notFound } from "./routes-error.ts";
+1 -1
src/server/routes-socket/handler-error.ts
··· 1 - import { z } from "zod/v4"; 2 1 import { BaseError, ValidationError } from "@repo/common/errors.ts"; 2 + import { z } from "zod/v4"; 3 3 4 4 export function errorHandler(ws: WebSocket, e: unknown) { 5 5 if (e instanceof BaseError) {
+1 -2
src/server/routes-socket/handler-preauth.ts
··· 1 1 import { jwtVerify } from "@panva/jose"; 2 - 3 2 import { combineSignals, timeoutSignal } from "@repo/common/aborts.ts"; 3 + import { jwtDecodedSchema } from "@repo/common/crypto-sig.ts"; 4 4 import { AuthError, normalizeError } from "@repo/common/errors.ts"; 5 5 import { takeSocket } from "@repo/common/socket.ts"; 6 6 import { StrictMap } from "@repo/common/strict-map.ts"; 7 - import { jwtDecodedSchema } from "@repo/common/crypto-sig.ts"; 8 7 import { preauthAuthnMessageSchema } from "@repo/schema/proto.ts"; 9 8 import { parseIdentId, parseRealmId } from "@repo/schema/state.ts"; 10 9
+1 -1
src/server/routes-socket/handler-realm.ts
··· 1 - import { Realm, Session } from "./state.ts"; 2 1 import { streamSocket } from "../../common/socket.ts"; 2 + import { Realm, Session } from "./state.ts"; 3 3 4 4 export async function realmHandler(ws: WebSocket, realm: Realm, auth: Session, signal: AbortSignal) { 5 5 ws.send(`welcome ${auth.identid} to ${auth.realmid} - ${realm.identities.keys()} `);
+1 -1
src/server/routes-socket/handler.ts
··· 2 2 3 3 import { errorHandler } from "./handler-error.ts"; 4 4 import { preauthHandler } from "./handler-preauth.ts"; 5 - import { attachSocket, detachSocket } from "./state.ts"; 6 5 import { realmHandler } from "./handler-realm.ts"; 6 + import { attachSocket, detachSocket } from "./state.ts"; 7 7 8 8 export async function socketHandler(this: WebSocket) { 9 9 const controller = new AbortController();
+1
src/server/routes-socket/middleware.ts
··· 1 1 import { Middleware } from "@oak/oak/middleware"; 2 + 2 3 import { socketHandler } from "./handler.ts"; 3 4 4 5 export const socketMiddleware: (path: string) => Middleware = (pathname) => (ctx, next) => {
+1 -1
src/types/branded-id.ts
··· 1 - import { escape } from "jsr:@std/regexp/escape"; 2 1 import { nanoid } from "@sitnik/nanoid"; 2 + import { escape } from "jsr:@std/regexp/escape"; 3 3 import { z } from "zod/v4"; 4 4 5 5 /** result from a branded id maker invocation */
+2 -2
vite.config.ts
··· 1 - import { defineConfig } from "vite"; 2 - import react from "@vitejs/plugin-react"; 3 1 import deno from "@deno/vite-plugin"; 2 + import react from "@vitejs/plugin-react"; 3 + import { defineConfig } from "vite"; 4 4 5 5 export default defineConfig({ 6 6 root: "./src/client",