From 735302b9f24b8fa4329a626d9914cab8ca6fa7d0 Mon Sep 17 00:00:00 2001 From: Tom Lanser Date: Fri, 22 Nov 2024 10:23:05 +0100 Subject: [PATCH] feat: OpenID Federation playground Signed-off-by: Tom Lanser --- agent/package.json | 10 ++--- agent/src/endpoints.ts | 27 ++++++++----- app/components/VerifyBlock.tsx | 47 ++++++++++++++++------- app/components/VerifyTab.tsx | 19 +++------- app/lib/api.ts | 3 ++ package.json | 5 +++ pnpm-lock.yaml | 69 +++++++++++++++++++--------------- 7 files changed, 108 insertions(+), 72 deletions(-) diff --git a/agent/package.json b/agent/package.json index def53d1..8655d40 100644 --- a/agent/package.json +++ b/agent/package.json @@ -1,10 +1,10 @@ { "name": "agent", "dependencies": { - "@credo-ts/askar": "0.6.0-alpha-20241119125554", - "@credo-ts/core": "0.6.0-alpha-20241119125554", - "@credo-ts/node": "0.6.0-alpha-20241119125554", - "@credo-ts/openid4vc": "0.6.0-alpha-20241119125554", + "@credo-ts/askar": "0.6.0-pr-2094-20241120112900", + "@credo-ts/core": "0.6.0-pr-2094-20241120112900", + "@credo-ts/node": "0.6.0-pr-2094-20241120112900", + "@credo-ts/openid4vc": "0.6.0-pr-2094-20241120112900", "@hyperledger/aries-askar-nodejs": "^0.2.3", "@animo-id/mdoc": "^0.2.38", "cors": "^2.8.5", @@ -24,6 +24,6 @@ "scripts": { "build": "tsc -p tsconfig.json", "start": "node dist/server.js", - "dev": "tsx watch -r dotenv/config src/server.ts dotenv_config_path=.env.development" + "dev": "tsx watch -r dotenv/config src/server.ts dotenv_config_path=.env.development dotenv_config_path=.env" } } diff --git a/agent/src/endpoints.ts b/agent/src/endpoints.ts index f8d69a0..03db0ab 100644 --- a/agent/src/endpoints.ts +++ b/agent/src/endpoints.ts @@ -180,17 +180,19 @@ apiRouter.get('/verifier', async (_, response: Response) => { }) const zCreatePresentationRequestBody = z.object({ + requestSignerType: z.enum(['x5c', 'openid-federation']), presentationDefinitionId: z.string(), requestScheme: z.string(), responseMode: z.enum(['direct_post.jwt', 'direct_post']), }) apiRouter.post('/requests/create', async (request: Request, response: Response) => { - const createPresentationRequestBody = zCreatePresentationRequestBody.parse(request.body) + const { presentationDefinitionId, requestScheme, responseMode, requestSignerType } = + await zCreatePresentationRequestBody.parseAsync(request.body) const x509Certificate = getX509Certificate() - const definitionId = createPresentationRequestBody.presentationDefinitionId + const definitionId = presentationDefinitionId const definition = allDefinitions.find((d) => d.id === definitionId) if (!definition) { return response.status(404).json({ @@ -209,22 +211,27 @@ apiRouter.post('/requests/create', async (request: Request, response: Response) const { authorizationRequest, verificationSession } = await agent.modules.openId4VcVerifier.createAuthorizationRequest({ verifierId: verifier.verifierId, - requestSigner: { - method: 'x5c', - x5c: [x509Certificate], - // FIXME: remove issuer param from credo as we can infer it from the url - issuer: `${AGENT_HOST}/siop/${verifier.verifierId}/authorize`, - }, + requestSigner: + requestSignerType === 'x5c' + ? { + method: 'x5c', + x5c: [x509Certificate], + // FIXME: remove issuer param from credo as we can infer it from the url + issuer: `${AGENT_HOST}/siop/${verifier.verifierId}/authorize`, + } + : { + method: 'openid-federation', + }, presentationExchange: { definition, }, - responseMode: createPresentationRequestBody.responseMode, + responseMode, }) console.log(authorizationRequest) return response.json({ - authorizationRequestUri: authorizationRequest.replace('openid4vp://', createPresentationRequestBody.requestScheme), + authorizationRequestUri: authorizationRequest.replace('openid4vp://', requestScheme), verificationSessionId: verificationSession.id, }) }) diff --git a/app/components/VerifyBlock.tsx b/app/components/VerifyBlock.tsx index 1f1b883..d3c36c9 100644 --- a/app/components/VerifyBlock.tsx +++ b/app/components/VerifyBlock.tsx @@ -5,6 +5,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@radix import Link from 'next/link' import { type FormEvent, useEffect, useState } from 'react' import QRCode from 'react-qr-code' +import type { CreateRequestOptions, CreateRequestResponse } from './VerifyTab' import { HighLight } from './highLight' import { Alert, AlertDescription, AlertTitle } from './ui/alert' import { Button } from './ui/button' @@ -19,20 +20,11 @@ export type ResponseMode = 'direct_post' | 'direct_post.jwt' type VerifyBlockProps = { flowName: string x509Certificate?: string - createRequest: ({ - presentationDefinitionId, - requestScheme, - responseMode, - }: { - presentationDefinitionId: string - requestScheme: string - responseMode: ResponseMode - }) => Promise<{ - verificationSessionId: string - authorizationRequestUri: string - }> + createRequest: (options: CreateRequestOptions) => Promise } +type RequestSignerType = CreateRequestOptions['requestSignerType'] + export const VerifyBlock: React.FC = ({ createRequest, flowName, x509Certificate }) => { const [authorizationRequestUri, setAuthorizationRequestUri] = useState() const [verificationSessionId, setVerificationSessionId] = useState() @@ -62,6 +54,7 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam const isSuccess = requestStatus?.responseStatus === 'ResponseVerified' const [presentationDefinitionId, setPresentationDefinitionId] = useState() const [requestScheme, setRequestScheme] = useState('openid4vp://') + const [requestSignerType, setRequestSignerType] = useState('x5c') useEffect(() => { getVerifier().then(setVerifier) @@ -90,7 +83,12 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam if (!id) { throw new Error('No definition') } - const request = await createRequest({ presentationDefinitionId: id, requestScheme, responseMode }) + const request = await createRequest({ + requestSignerType, + presentationDefinitionId: id, + requestScheme, + responseMode, + }) setVerificationSessionId(request.verificationSessionId) setAuthorizationRequestUri(request.authorizationRequestUri) @@ -135,6 +133,29 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam +
+ + +
[0] +export type CreateRequestResponse = Awaited> export function VerifyTab() { const [x509Certificate, setX509Certificate] = useState() - const createRequestForVerification = async (options: { - presentationDefinitionId: string - requestScheme: string - responseMode: ResponseMode - }) => { - return await createRequest({ - requestScheme: options.requestScheme, - presentationDefinitionId: options.presentationDefinitionId, - responseMode: options.responseMode, - }) - } - useEffect(() => { getX509Certificate().then(({ certificate }) => setX509Certificate(certificate)) }, []) return ( <> - + ) } diff --git a/app/lib/api.ts b/app/lib/api.ts index 7b1e32a..b047220 100644 --- a/app/lib/api.ts +++ b/app/lib/api.ts @@ -77,7 +77,9 @@ export async function createRequest({ presentationDefinitionId, requestScheme, responseMode, + requestSignerType, }: { + requestSignerType: 'x5c' | 'openid-federation' presentationDefinitionId: string requestScheme: string responseMode: 'direct_post' | 'direct_post.jwt' @@ -88,6 +90,7 @@ export async function createRequest({ 'Content-Type': 'application/json', }, body: JSON.stringify({ + requestSignerType, presentationDefinitionId, requestScheme, responseMode, diff --git a/package.json b/package.json index 2218d72..eeeeec6 100644 --- a/package.json +++ b/package.json @@ -6,5 +6,10 @@ }, "devDependencies": { "@biomejs/biome": "^1.8.3" + }, + "pnpm": { + "resolutions": { + "@openid-federation/core": "0.1.1-alpha.14" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b4214e..f0c339d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,17 +18,17 @@ importers: specifier: ^0.2.38 version: 0.2.38 '@credo-ts/askar': - specifier: 0.6.0-alpha-20241119125554 - version: 0.6.0-alpha-20241119125554(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + specifier: 0.6.0-pr-2094-20241120112900 + version: 0.6.0-pr-2094-20241120112900(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) '@credo-ts/core': - specifier: 0.6.0-alpha-20241119125554 - version: 0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + specifier: 0.6.0-pr-2094-20241120112900 + version: 0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) '@credo-ts/node': - specifier: 0.6.0-alpha-20241119125554 - version: 0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + specifier: 0.6.0-pr-2094-20241120112900 + version: 0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) '@credo-ts/openid4vc': - specifier: 0.6.0-alpha-20241119125554 - version: 0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) + specifier: 0.6.0-pr-2094-20241120112900 + version: 0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) '@hyperledger/aries-askar-nodejs': specifier: ^0.2.3 version: 0.2.3 @@ -1005,23 +1005,23 @@ packages: cpu: [x64] os: [win32] - '@credo-ts/askar@0.6.0-alpha-20241119125554': - resolution: {integrity: sha512-Ue12HCt2QZacKFF7ZMNRfnEFbDYHbLMyDjT9CVPjd/80cgxViOsdtvVa///r/yxPiPpBsuVxs3oBP7RwYkUKTA==} + '@credo-ts/askar@0.6.0-pr-2094-20241120112900': + resolution: {integrity: sha512-Fx886nFniQWWWRU2SLWA9W1b3ZZiF2qeee2G2RISz6t2/ii0M+PwfSEU6rweJEDFDVGSosWGGx4v3htDHcpquw==} peerDependencies: - '@animo-id/expo-secure-environment': ^0.0.1-alpha.0 + '@animo-id/expo-secure-environment': 0.1.0-alpha.5 '@hyperledger/aries-askar-shared': ^0.2.3 peerDependenciesMeta: '@animo-id/expo-secure-environment': optional: true - '@credo-ts/core@0.6.0-alpha-20241119125554': - resolution: {integrity: sha512-bhy+CS/j9fXbtdYK4tAhvhey9gajh0xgqaPOrVG1lkLLDAkOgWRu2+hdTJhsWroMYKicSIeDF2wnbrvlyTdmMQ==} + '@credo-ts/core@0.6.0-pr-2094-20241120112900': + resolution: {integrity: sha512-Lf/Cs8jaQzFZK1EFGFBe9U+FIZH5vJ+ZaI5ff8YlzXCgx+hAgoHKzj7wXXIjlzSzUUA/5GgWcS9PMUouccIqeg==} - '@credo-ts/node@0.6.0-alpha-20241119125554': - resolution: {integrity: sha512-iUwHpuW7Jzw5uIyx7PM0Pu8bIdqbL0jBxl4qs1EKzbk44Fmv9dqTQC+te9EaVq34bhbapek+8d/2g3Ei5t60cQ==} + '@credo-ts/node@0.6.0-pr-2094-20241120112900': + resolution: {integrity: sha512-aaKiQD9cgwK/eoBqVz3EMSb9Rlgn3m2eaGkUZZ2wkSLJX4B9f6kvguWtSBsNhlbVPS4E9DokoqDwqY575qW4gw==} - '@credo-ts/openid4vc@0.6.0-alpha-20241119125554': - resolution: {integrity: sha512-OgRThR/E+ixiHJ8xJkaG8+Kr1adH8cZoMIFBakrqmQkXxImRjH9AsUdswTq05agxy3Kx0Lu0eGZjg2HcR/EykQ==} + '@credo-ts/openid4vc@0.6.0-pr-2094-20241120112900': + resolution: {integrity: sha512-eoJePt2sOzLU1OVuGafI1ZdroScBbmsSggSh41OhdNxw49UeHbQaNq/GoNO892GwL+/iJjIF061rw7X3BoKGgw==} '@digitalbazaar/bitstring@3.1.0': resolution: {integrity: sha512-Cii+Sl++qaexOvv3vchhgZFfSmtHPNIPzGegaq4ffPnflVXFu+V2qrJ17aL2+gfLxrlC/zazZFuAltyKTPq7eg==} @@ -1592,6 +1592,9 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@openid-federation/core@0.1.1-alpha.13': + resolution: {integrity: sha512-QC4DSbiJ7eWstLs1O3XrX/yKFgaj+3ch8cA4N/02BywVNmkiYgW9qXhcvY50ULINuCeYdqIMIqCuHbaTa0A1hw==} + '@peculiar/asn1-cms@2.3.13': resolution: {integrity: sha512-joqu8A7KR2G85oLPq+vB+NFr2ro7Ls4ol13Zcse/giPSzUNN0n2k3v8kMpf6QdGUhI13e5SzQYN8AKP8sJ8v4w==} @@ -7858,9 +7861,9 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@credo-ts/askar@0.6.0-alpha-20241119125554(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@credo-ts/askar@0.6.0-pr-2094-20241120112900(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: - '@credo-ts/core': 0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + '@credo-ts/core': 0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) '@hyperledger/aries-askar-shared': 0.2.3 bn.js: 5.2.1 class-transformer: 0.5.1 @@ -7875,7 +7878,7 @@ snapshots: - supports-color - web-streams-polyfill - '@credo-ts/core@0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@credo-ts/core@0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@animo-id/mdoc': 0.2.38 '@digitalcredentials/jsonld': 6.0.0(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) @@ -7927,11 +7930,11 @@ snapshots: - supports-color - web-streams-polyfill - '@credo-ts/node@0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@credo-ts/node@0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 - '@credo-ts/core': 0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + '@credo-ts/core': 0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) '@types/express': 4.17.21 express: 4.21.1 rxjs: 7.8.1 @@ -7946,11 +7949,12 @@ snapshots: - utf-8-validate - web-streams-polyfill - '@credo-ts/openid4vc@0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3)': + '@credo-ts/openid4vc@0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3)': dependencies: '@animo-id/oauth2': 0.1.3(typescript@5.3.3) '@animo-id/oid4vci': 0.1.3(typescript@5.3.3) - '@credo-ts/core': 0.6.0-alpha-20241119125554(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + '@credo-ts/core': 0.6.0-pr-2094-20241120112900(expo@51.0.38(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(web-streams-polyfill@3.3.3) + '@openid-federation/core': 0.1.1-alpha.13 '@sphereon/did-auth-siop': 0.16.1-fix.173(typescript@5.3.3) '@sphereon/oid4vc-common': 0.16.1-fix.173 '@sphereon/ssi-types': 0.30.2-next.135 @@ -8867,6 +8871,11 @@ snapshots: semver: 7.6.3 optional: true + '@openid-federation/core@0.1.1-alpha.13': + dependencies: + buffer: 6.0.3 + zod: 3.23.8 + '@peculiar/asn1-cms@2.3.13': dependencies: '@peculiar/asn1-schema': 2.3.13 @@ -11683,7 +11692,7 @@ snapshots: eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) @@ -11708,20 +11717,20 @@ snapshots: debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -11732,7 +11741,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -11743,7 +11752,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3