diff --git a/apps/abstraxion-dashboard/components/ModalViews/AddAuthenticators/AddAuthenticatorsForm.tsx b/apps/abstraxion-dashboard/components/ModalViews/AddAuthenticators/AddAuthenticatorsForm.tsx index 0dd818cb..fd413ec0 100644 --- a/apps/abstraxion-dashboard/components/ModalViews/AddAuthenticators/AddAuthenticatorsForm.tsx +++ b/apps/abstraxion-dashboard/components/ModalViews/AddAuthenticators/AddAuthenticatorsForm.tsx @@ -9,6 +9,7 @@ import Image from "next/image"; import { WalletType, useAccount, useSuggestChainAndConnect } from "graz"; import { useQuery } from "@apollo/client"; import { useStytchUser } from "@stytch/nextjs"; +import { create } from "@github/webauthn-json/browser-ponyfill"; import { Button, KeplrLogo, @@ -25,7 +26,7 @@ import { encodeHex } from "@/utils"; import { AllSmartWalletQuery } from "@/utils/queries"; // TODO: Add webauthn to this and remove "disable" prop from button when implemented -type AuthenticatorStates = "none" | "keplr" | "metamask" | "okx"; +type AuthenticatorStates = "none" | "keplr" | "metamask" | "okx" | "passkey"; export function AddAuthenticatorsForm({ setIsOpen, @@ -110,6 +111,9 @@ export function AddAuthenticatorsForm({ case "okx": await addOkxAuthenticator(); break; + case "passkey": + await addWebauthnAuthenticator(); + break; default: break; } @@ -225,6 +229,78 @@ export function AddAuthenticatorsForm({ } } + const addWebauthnAuthenticator = async () => { + try { + setIsLoading(true); + const encoder = new TextEncoder(); + const challenge = Buffer.from(encoder.encode(abstractAccount?.id)); + const rpUrl = "http://localhost:3000"; // TODO: This will have to be pointing to current domain, ex. testnet-dashboard.xion.com OR mainnet-dashboard.xion.com + const options: CredentialCreationOptions = { + publicKey: { + rp: { + name: rpUrl, + }, + user: { + name: abstractAccount.id, + displayName: abstractAccount.id, + id: challenge, + }, + pubKeyCredParams: [{ type: "public-key", alg: -7 }], + challenge, + authenticatorSelection: { userVerification: "preferred" }, + timeout: 300000, // 5 minutes, + excludeCredentials: [], + }, + }; + + // What happens on a failed addAuthenticator tx, do we just delete the registered browser key or just leave it and let them try again? + + const publicKeyCredential = await create(options); + if (publicKeyCredential === null) { + console.log("null credential"); + return; + } + console.log("publicKeyCredential: ", publicKeyCredential); + const publicKeyCredentialJSON = JSON.stringify(publicKeyCredential); + // Encode Uint8Array as base64 + const base64EncodedCredential = Buffer.from( + encoder.encode(publicKeyCredentialJSON), + ).toString("base64"); + + const accountIndex = abstractAccount?.authenticators.nodes.length; // TODO: Be careful here, if indexer returns wrong number this can overwrite accounts + + const msg = { + add_auth_method: { + add_authenticator: { + Passkey: { + id: accountIndex, + url: rpUrl, + credential: base64EncodedCredential, + }, + }, + }, + }; + const res = await client?.addAbstractAccountAuthenticator(msg, "", { + amount: [{ amount: "0", denom: "uxion" }], + gas: "500000", + }); + + if (res?.rawLog?.includes("failed")) { + throw new Error(res.rawLog); + } + + console.log(res); + return res; + } catch (error) { + console.log(error); + setErrorMessage( + "Something went wrong trying to add Webauthn as authenticator", + ); + } finally { + setIsLoading(false); + } + }; + async function addEthAuthenticator() { if (!window.ethereum) { alert("Please install wallet extension"); @@ -351,9 +427,17 @@ export function AddAuthenticatorsForm({ alt="OKX Logo" /> - {/* */} + ) : null} diff --git a/apps/abstraxion-dashboard/package.json b/apps/abstraxion-dashboard/package.json index 6cc11690..51ab1605 100644 --- a/apps/abstraxion-dashboard/package.json +++ b/apps/abstraxion-dashboard/package.json @@ -35,6 +35,7 @@ }, "devDependencies": { "@burnt-labs/tsconfig": "workspace:*", + "@github/webauthn-json": "^2.1.1", "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", diff --git a/apps/abstraxion-settings/package.json b/apps/abstraxion-settings/package.json index 8c0b635a..b4ab7225 100644 --- a/apps/abstraxion-settings/package.json +++ b/apps/abstraxion-settings/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "dev": "vite --port 3000", + "dev": "vite --port 3002", "build": "vite build", "preview": "vite preview" }, @@ -35,4 +35,4 @@ "vite": "^4.3.2", "vite-plugin-node-polyfills": "^0.17.0" } -} \ No newline at end of file +} diff --git a/packages/signers/src/interfaces/smartAccount.ts b/packages/signers/src/interfaces/smartAccount.ts index 0264d4fe..7ad63e41 100644 --- a/packages/signers/src/interfaces/smartAccount.ts +++ b/packages/signers/src/interfaces/smartAccount.ts @@ -34,6 +34,8 @@ export enum AAAlgo { JWT = "jwt", ethWallet = "ethWallet", ETHWALLET = "EthWallet", + passkey = "passkey", + Passket = "Passkey", } export interface AddSecp256K1Authenticator { @@ -85,8 +87,21 @@ export interface AddJwtAuthenticator { }; } +export interface AddPasskeyAuthenticator { + add_auth_method: { + add_authenticator: { + Passkey: { + id: number; + url: string; + credential: string; // base64 encoded + }; + }; + }; +} + export type AddAuthenticator = | AddSecp256K1Authenticator | AddEd25519Authenticator | AddEthWalletAuthenticator - | AddJwtAuthenticator; + | AddJwtAuthenticator + | AddPasskeyAuthenticator; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b36d123c..814985a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: '@types/react': ^18.2.47 '@types/react-dom': ^18.2.18 @@ -103,6 +99,9 @@ importers: '@burnt-labs/tsconfig': specifier: workspace:* version: link:../../packages/tsconfig + '@github/webauthn-json': + specifier: ^2.1.1 + version: 2.1.1 '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.2.2) @@ -217,7 +216,7 @@ importers: version: 8.4.31 tailwindcss: specifier: ^3.2.4 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.2) typescript: specifier: ^5.2.2 version: 5.4.3 @@ -284,7 +283,7 @@ importers: version: 8.4.28 tailwindcss: specifier: ^3.2.4 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.2) typescript: specifier: ^5.2.2 version: 5.2.2 @@ -393,7 +392,7 @@ importers: version: 5.0.5 tailwindcss: specifier: ^3.2.4 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.2) ts-jest: specifier: ^29.1.2 version: 29.1.2(@babel/core@7.23.9)(esbuild@0.17.19)(jest@29.7.0)(typescript@5.2.2) @@ -599,7 +598,7 @@ importers: version: 5.0.5 tailwindcss: specifier: ^3.2.4 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.2) tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.3.3) @@ -654,7 +653,7 @@ importers: version: 2.1.0 tailwindcss: specifier: ^3.2.4 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.2) tsup: specifier: ^6.0.1 version: 6.7.0(postcss@8.4.28)(typescript@5.2.2) @@ -3355,7 +3354,6 @@ packages: /@github/webauthn-json@2.1.1: resolution: {integrity: sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==} hasBin: true - dev: false /@graphql-typed-document-node/core@3.2.0(graphql@16.8.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} @@ -4257,7 +4255,7 @@ packages: /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4280,7 +4278,7 @@ packages: /@radix-ui/react-context@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4294,8 +4292,8 @@ packages: /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: - '@types/react': ^18.2.47 - '@types/react-dom': ^18.2.18 + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: @@ -4328,8 +4326,8 @@ packages: /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: - '@types/react': ^18.2.47 - '@types/react-dom': ^18.2.18 + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: @@ -4353,7 +4351,7 @@ packages: /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4367,8 +4365,8 @@ packages: /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: - '@types/react': ^18.2.47 - '@types/react-dom': ^18.2.18 + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: @@ -4400,7 +4398,7 @@ packages: /@radix-ui/react-id@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4415,8 +4413,8 @@ packages: /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: - '@types/react': ^18.2.47 - '@types/react-dom': ^18.2.18 + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: @@ -4436,8 +4434,8 @@ packages: /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: - '@types/react': ^18.2.47 - '@types/react-dom': ^18.2.18 + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: @@ -4468,8 +4466,8 @@ packages: /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: - '@types/react': ^18.2.47 - '@types/react-dom': ^18.2.18 + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: @@ -4516,7 +4514,7 @@ packages: /@radix-ui/react-slot@1.0.2(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4555,7 +4553,7 @@ packages: /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4579,7 +4577,7 @@ packages: /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4594,7 +4592,7 @@ packages: /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -4618,7 +4616,7 @@ packages: /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.47)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': @@ -5809,9 +5807,9 @@ packages: eslint: 8.57.0 eslint-config-prettier: 9.0.0(eslint@8.57.0) eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.28.1) - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.57.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.57.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0) eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.57.0)(typescript@5.4.3) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.57.0) eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.2.3)(eslint@8.57.0) @@ -8039,7 +8037,7 @@ packages: eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) eslint-plugin-react: 7.33.2(eslint@8.48.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) @@ -8098,7 +8096,7 @@ packages: peerDependencies: eslint-plugin-import: '>=1.4.0' dependencies: - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.57.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0) dev: true /eslint-import-resolver-node@0.3.9: @@ -8122,7 +8120,7 @@ packages: enhanced-resolve: 5.15.0 eslint: 8.48.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0) fast-glob: 3.3.1 get-tsconfig: 4.7.0 is-core-module: 2.13.0 @@ -8157,29 +8155,6 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.57.0): - resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4(supports-color@5.5.0) - enhanced-resolve: 5.15.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.57.0) - fast-glob: 3.3.1 - get-tsconfig: 4.7.0 - is-core-module: 2.13.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -8240,64 +8215,6 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.57.0)(typescript@5.4.3) - debug: 3.2.7 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.57.0)(typescript@5.4.3) - debug: 3.2.7 - eslint: 8.57.0 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} @@ -8309,41 +8226,6 @@ packages: ignore: 5.3.0 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.48.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) - has: 1.0.3 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.57.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} @@ -8379,41 +8261,6 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.57.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.57.0)(typescript@5.4.3) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - has: 1.0.3 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11991,7 +11838,7 @@ packages: resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -12007,7 +11854,7 @@ packages: resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -12026,7 +11873,7 @@ packages: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -12961,38 +12808,7 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: - tailwindcss: 3.3.3 - dev: true - - /tailwindcss@3.3.3: - resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.1 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 15.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.2) - postcss-nested: 6.0.1(postcss@8.4.31) - postcss-selector-parser: 6.0.13 - resolve: 1.22.8 - sucrase: 3.34.0 - transitivePeerDependencies: - - ts-node + tailwindcss: 3.3.3(ts-node@10.9.2) dev: true /tailwindcss@3.3.3(ts-node@10.9.2): @@ -13691,7 +13507,7 @@ packages: resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -13706,7 +13522,7 @@ packages: resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': @@ -14190,7 +14006,7 @@ packages: resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} engines: {node: '>=12.7.0'} peerDependencies: - '@types/react': ^18.2.47 + '@types/react': '>=16.8' immer: '>=9.0' react: '>=16.8' peerDependenciesMeta: @@ -14205,3 +14021,7 @@ packages: react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false