diff --git a/jest.config.base.ts b/jest.config.base.ts index e63145c..f788b83 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -14,6 +14,9 @@ const config: Config.InitialOptions = { }, ], }, + moduleNameMapper: { + '@li0ard/tsemrtd': '/src/esm/bundle.js', + }, } export default config diff --git a/package.json b/package.json index 8f6140f..0483bc1 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "prettier": "prettier '**/*.+(js|json|ts|tsx|md|yml|yaml)'", "format": "yarn prettier --write", "check-format": "yarn prettier --list-different", - "test": "jest", - "lint": "eslint --ignore-path .gitignore .", + "test": "yarn workspaces run test", + "lint": "eslint --ignore-path .gitignore --ignore-pattern '**/esm/' .", "validate": "yarn lint && yarn check-types && yarn check-format" }, "devDependencies": { diff --git a/packages/mrtd/docs/mrtd-protocol.md b/packages/mrtd/docs/mrtd-protocol.md index 3b82007..782bb00 100644 --- a/packages/mrtd/docs/mrtd-protocol.md +++ b/packages/mrtd/docs/mrtd-protocol.md @@ -2,3 +2,5 @@ didcomm.org/mrtd/1.0 - mrz-data-request - mrz-data +- emrtd-data-request +- emrtd-data diff --git a/packages/mrtd/package.json b/packages/mrtd/package.json index 3282fac..07fa86a 100644 --- a/packages/mrtd/package.json +++ b/packages/mrtd/package.json @@ -18,11 +18,12 @@ "directory": "packages/mrtd" }, "scripts": { - "build": "yarn run clean && yarn run compile", + "deps": "rm -f src/esm/bundle.js && esbuild --platform=node src/esm/index.ts --bundle --outfile=src/esm/bundle.js", + "build": "yarn run clean && yarn run compile && yarn run deps", "clean": "rimraf -rf ./build", "compile": "tsc -p tsconfig.build.json", "prepublishOnly": "yarn run build", - "test": "jest" + "test": "yarn run deps && jest" }, "devDependencies": { "@credo-ts/askar": "^0.5.10", @@ -35,8 +36,10 @@ "@credo-ts/core": "^0.5.10" }, "dependencies": { + "@li0ard/tsemrtd": "^0.2.0", "class-transformer": "0.5.1", "class-validator": "0.14.1", + "esbuild": "^0.24.0", "mrz": "^4.2.0", "tsyringe": "^4.8.0" } diff --git a/packages/mrtd/src/DidCommMrtdEvents.ts b/packages/mrtd/src/DidCommMrtdEvents.ts index ba62cc9..3de67ab 100644 --- a/packages/mrtd/src/DidCommMrtdEvents.ts +++ b/packages/mrtd/src/DidCommMrtdEvents.ts @@ -1,4 +1,4 @@ -import type { MrzData } from './models/MrzData' +import type { MrzData, EMrtdData } from './models' import type { BaseEvent, ConnectionRecord } from '@credo-ts/core' export enum MrtdEventTypes { @@ -30,7 +30,7 @@ export interface EMrtdDataReceivedEvent extends BaseEvent { type: MrtdEventTypes.EMrtdDataReceived payload: { connection: ConnectionRecord - dataGroups: Record + dataGroups: EMrtdData threadId: string } } diff --git a/packages/mrtd/src/DidCommMrtdService.ts b/packages/mrtd/src/DidCommMrtdService.ts index 63e9168..4020c7b 100644 --- a/packages/mrtd/src/DidCommMrtdService.ts +++ b/packages/mrtd/src/DidCommMrtdService.ts @@ -10,6 +10,7 @@ import { MrzDataRequestedEvent, } from './DidCommMrtdEvents' import { EMrtdDataMessage, EMrtdDataRequestMessage, MrzDataMessage, MrzDataRequestMessage } from './messages' +import { parseEMrtdData } from './models' @scoped(Lifecycle.ContainerScoped) export class DidCommMrtdService { @@ -77,22 +78,22 @@ export class DidCommMrtdService { const connection = messageContext.assertReadyConnection() const { agentContext, message } = messageContext - /*let parsed + let parsed try { - const parseResult = Mrz.parse(message.mrzData) + const parseResult = parseEMrtdData(message.dataGroups) - parsed = { valid: parseResult.valid, fields: parseResult.fields, format: parseResult.format } + parsed = { valid: true, fields: parseResult } } catch (error) { // Unsupported format. Send raw data anyway - parsed = { valid: false, fields: {} } - }*/ + parsed = { valid: false } + } const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter) eventEmitter.emit(agentContext, { type: MrtdEventTypes.EMrtdDataReceived, payload: { connection, - dataGroups: message.dataGroups, + dataGroups: { raw: message.dataGroups, parsed }, threadId: message.threadId, }, }) diff --git a/packages/mrtd/src/esm/.gitignore b/packages/mrtd/src/esm/.gitignore new file mode 100644 index 0000000..4187d67 --- /dev/null +++ b/packages/mrtd/src/esm/.gitignore @@ -0,0 +1 @@ +bundle.js \ No newline at end of file diff --git a/packages/mrtd/src/esm/index.ts b/packages/mrtd/src/esm/index.ts new file mode 100644 index 0000000..cbf58f6 --- /dev/null +++ b/packages/mrtd/src/esm/index.ts @@ -0,0 +1,3 @@ +import { COM, DG1, DG2, DG3, DG4, DG5, DG7, DG11, DG12, DG14, DG15, SOD, PKD } from '@li0ard/tsemrtd' + +export { COM, DG1, DG2, DG3, DG4, DG5, DG7, DG11, DG12, DG14, DG15, SOD, PKD } diff --git a/packages/mrtd/src/models/EMrtdData.ts b/packages/mrtd/src/models/EMrtdData.ts new file mode 100644 index 0000000..e1537b5 --- /dev/null +++ b/packages/mrtd/src/models/EMrtdData.ts @@ -0,0 +1,100 @@ +import type { SecurityInfos } from '@li0ard/tsemrtd/dist/asn1/eac' +import type { CSCAMasterList } from '@li0ard/tsemrtd/dist/asn1/pkd' +import type { + DecodedAdditionalDocumentData, + DecodedAdditionalPersonalData, + DecodedCom, + DecodedFingerprint, + DecodedImage, + DecodedIris, + DecodedSecurtyObjectOfDocument, +} from '@li0ard/tsemrtd/dist/consts/interfaces' +import type { SubjectPublicKeyInfo } from '@peculiar/asn1-x509' + +import { COM, DG1, DG2, DG3, DG4, DG5, DG7, DG11, DG12, DG14, DG15, SOD, PKD } from '../esm' + +import { EMrtdDataGroup } from './EMrtdDataGroup' + +export type EMrtdData = { + raw: Record + parsed: { fields?: ParsedEMrtdData; valid: boolean } +} + +export type ParsedEMrtdData = { + com: DecodedCom + mrzData: string + images: DecodedImage[] + fingerprints?: DecodedFingerprint[] + iris?: DecodedIris[] + displayedImages?: Buffer[] + signatureImages?: Buffer[] + additionalPersonalData?: DecodedAdditionalPersonalData + additionalDocumentData?: DecodedAdditionalDocumentData + securityInfos?: SecurityInfos + subjectPublicKeyInfo?: SubjectPublicKeyInfo + securityObjectOfDocument: DecodedSecurtyObjectOfDocument + cscaMasterList?: CSCAMasterList +} + +/** + * + * @param input object containing base64-encoded eMRTD data groups + * @returns parsed eMRDT Data + * @throws Error in case of missing mandatory data (EF_COM, EF_DG1, EF_DG2 or EF_SOD) + */ +export function parseEMrtdData(input: Record): ParsedEMrtdData { + const parsedData: Partial = {} + + for (const [key, value] of Object.entries(input)) { + const decodedValue = Buffer.from(value, 'base64') + switch (key as EMrtdDataGroup) { + case EMrtdDataGroup.COM: + parsedData.com = COM.load(decodedValue) + break + case EMrtdDataGroup.DG1: + parsedData.mrzData = DG1.load(decodedValue) + break + case EMrtdDataGroup.DG2: + parsedData.images = DG2.load(decodedValue) + break + case EMrtdDataGroup.DG3: + parsedData.fingerprints = DG3.load(decodedValue) + break + case EMrtdDataGroup.DG4: + parsedData.iris = DG4.load(decodedValue) + break + case EMrtdDataGroup.DG5: + parsedData.displayedImages = DG5.load(decodedValue) + break + case EMrtdDataGroup.DG7: + parsedData.signatureImages = DG7.load(decodedValue) + break + case EMrtdDataGroup.DG11: + parsedData.additionalPersonalData = DG11.load(decodedValue) + break + case EMrtdDataGroup.DG12: + parsedData.additionalDocumentData = DG12.load(decodedValue) + break + case EMrtdDataGroup.DG14: + parsedData.securityInfos = DG14.load(decodedValue) + break + case EMrtdDataGroup.DG15: + parsedData.subjectPublicKeyInfo = DG15.load(decodedValue) + break + case EMrtdDataGroup.SOD: + parsedData.securityObjectOfDocument = SOD.load(decodedValue) + break + case EMrtdDataGroup.PKD: + parsedData.cscaMasterList = PKD.load(decodedValue) + break + default: + break + } + } + + if (!parsedData.com || !parsedData.mrzData || !parsedData.images || !parsedData.securityObjectOfDocument) { + throw Error('Parsed data misses mandatory files') + } + + return parsedData as ParsedEMrtdData +} diff --git a/packages/mrtd/src/models/EMrtdDataGroup.ts b/packages/mrtd/src/models/EMrtdDataGroup.ts new file mode 100644 index 0000000..df7dc9d --- /dev/null +++ b/packages/mrtd/src/models/EMrtdDataGroup.ts @@ -0,0 +1,15 @@ +export enum EMrtdDataGroup { + COM = 'COM', + DG1 = 'DG1', + DG2 = 'DG2', + DG3 = 'DG3', + DG4 = 'DG4', + DG5 = 'DG5', + DG7 = 'DG7', + DG11 = 'DG11', + DG12 = 'DG12', + DG14 = 'DG14', + DG15 = 'DG15', + SOD = 'SOD', + PKD = 'PKD', +} diff --git a/packages/mrtd/src/models/index.ts b/packages/mrtd/src/models/index.ts index 9aa8f48..252cf57 100644 --- a/packages/mrtd/src/models/index.ts +++ b/packages/mrtd/src/models/index.ts @@ -1,2 +1,4 @@ export * from './DidCommMrtdRole' +export * from './EMrtdData' +export * from './EMrtdDataGroup' export * from './MrzData' diff --git a/packages/mrtd/tests/DidCommMrtdService.test.ts b/packages/mrtd/tests/DidCommMrtdService.test.ts index 20b1709..9596101 100644 --- a/packages/mrtd/tests/DidCommMrtdService.test.ts +++ b/packages/mrtd/tests/DidCommMrtdService.test.ts @@ -1,20 +1,37 @@ +import type { EMrtdDataReceivedEvent } from '../src/DidCommMrtdEvents' import type { Agent } from '@credo-ts/core' -import { JsonTransformer } from '@credo-ts/core' +import { + AgentContext, + ConnectionRecord, + DidExchangeRole, + DidExchangeState, + EventEmitter, + InboundMessageContext, + JsonTransformer, +} from '@credo-ts/core' +import { MrtdEventTypes } from '../src/DidCommMrtdEvents' import { DidCommMrtdService } from '../src/DidCommMrtdService' +import { EMrtdDataMessage } from '../src/messages' import { setupAgent } from './utils/agent' +const passport = {} // For testing purposes, replace this value with a JSON file that contains the attributes: COM, DG1, DG2, DG11, and SOD. + +const isPassportEmpty = !passport || (passport && Object.keys(passport).length === 0) + describe('Didcomm MRTD', () => { let agent: Agent let didcommMrtdService: DidCommMrtdService + let agentContext: AgentContext beforeAll(async () => { agent = await setupAgent({ name: 'mrtd service test', }) didcommMrtdService = agent.dependencyManager.resolve(DidCommMrtdService) + agentContext = agent.dependencyManager.resolve(AgentContext) }) afterAll(async () => { @@ -41,4 +58,89 @@ describe('Didcomm MRTD', () => { ) }) }) + + describe('EMRTD Data message', () => { + test('Should create a valid https://didcomm.org/mrtd/1.0/emrtd-data message ', async () => { + const message = didcommMrtdService.createEMrtdData({ + threadId: '5678-5678-5678-5678', + dataGroups: passport, + }) + + const jsonMessage = JsonTransformer.toJSON(message) + + expect(jsonMessage).toEqual( + expect.objectContaining({ + '@id': expect.any(String), + '@type': 'https://didcomm.org/mrtd/1.0/emrtd-data', + dataGroups: isPassportEmpty + ? {} + : { + COM: expect.any(String), + DG1: expect.any(String), + DG2: expect.any(String), + DG11: expect.any(String), + SOD: expect.any(String), + }, + '~thread': expect.objectContaining({ thid: '5678-5678-5678-5678' }), + }), + ) + }) + }) + + describe('EMRTD Data process message', () => { + test('Should create a valid https://didcomm.org/mrtd/1.0/emrtd-data message ', async () => { + const emrtdDataMessage = new EMrtdDataMessage({ + threadId: '5678-5678-5678-5678', + dataGroups: passport, + }) + + const mockConnectionRecord = new ConnectionRecord({ + id: 'mockConnectionId', + state: DidExchangeState.Completed, + role: DidExchangeRole.Responder, + }) + + const inboundMessageContext = new InboundMessageContext(emrtdDataMessage, { + agentContext: agentContext, + connection: mockConnectionRecord, + }) + + const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter) + const event = new Promise((resolve) => { + eventEmitter.on(MrtdEventTypes.EMrtdDataReceived, (event: EMrtdDataReceivedEvent) => { + resolve(event) + }) + }) + + await didcommMrtdService.processEMrtdData(inboundMessageContext) + + const payload = ((await event) as EMrtdDataReceivedEvent).payload + + const expectedRaw = expect.objectContaining({ + COM: expect.any(String), + DG1: expect.any(String), + DG2: expect.any(String), + SOD: expect.any(String), + }) + + const expectedFields = expect.objectContaining({ + com: expect.any(Object), + mrzData: expect.any(String), + images: expect.any(Array), + securityObjectOfDocument: expect.any(Object), + }) + + expect(payload).toEqual({ + connection: mockConnectionRecord, + dataGroups: { + raw: isPassportEmpty ? {} : expectedRaw, + parsed: { + valid: isPassportEmpty ? false : true, + fields: isPassportEmpty ? undefined : expectedFields, + }, + }, + threadId: '5678-5678-5678-5678', + }) + }) + }) }) diff --git a/yarn.lock b/yarn.lock index d7efc72..0951ef7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -593,6 +593,126 @@ credentials-context "^2.0.0" fix-esm "^1.0.1" +"@esbuild/aix-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" + integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== + +"@esbuild/android-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" + integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== + +"@esbuild/android-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" + integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== + +"@esbuild/android-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" + integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== + +"@esbuild/darwin-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" + integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== + +"@esbuild/darwin-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" + integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== + +"@esbuild/freebsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" + integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== + +"@esbuild/freebsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" + integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== + +"@esbuild/linux-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" + integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== + +"@esbuild/linux-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" + integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== + +"@esbuild/linux-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" + integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== + +"@esbuild/linux-loong64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" + integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== + +"@esbuild/linux-mips64el@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" + integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== + +"@esbuild/linux-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" + integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== + +"@esbuild/linux-riscv64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" + integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== + +"@esbuild/linux-s390x@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" + integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== + +"@esbuild/linux-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" + integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== + +"@esbuild/netbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" + integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== + +"@esbuild/openbsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" + integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== + +"@esbuild/openbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" + integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== + +"@esbuild/sunos-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" + integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== + +"@esbuild/win32-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" + integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== + +"@esbuild/win32-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" + integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== + +"@esbuild/win32-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" + integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -928,6 +1048,16 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@li0ard/tsemrtd@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@li0ard/tsemrtd/-/tsemrtd-0.2.0.tgz#07059479b7631644e40ed5cbffcddf9a0874c60d" + integrity sha512-wRaV6v7SPITHCfIbx9gjvpNjhOssElxMUWUzZGPD0jr5xwRijAOS53Pn2jkoRYwcFzf4XHXyAqfCWknZMcHKcw== + dependencies: + "@peculiar/asn1-cms" "^2.3.13" + "@peculiar/asn1-schema" "^2.3.13" + "@peculiar/asn1-x509" "^2.3.13" + node-tlv "^1.5.14" + "@mapbox/node-pre-gyp@^1.0.11": version "1.0.11" resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" @@ -2797,6 +2927,36 @@ es6-symbol@^3.0.2, es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.2" ext "^1.7.0" +esbuild@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" + integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.24.0" + "@esbuild/android-arm" "0.24.0" + "@esbuild/android-arm64" "0.24.0" + "@esbuild/android-x64" "0.24.0" + "@esbuild/darwin-arm64" "0.24.0" + "@esbuild/darwin-x64" "0.24.0" + "@esbuild/freebsd-arm64" "0.24.0" + "@esbuild/freebsd-x64" "0.24.0" + "@esbuild/linux-arm" "0.24.0" + "@esbuild/linux-arm64" "0.24.0" + "@esbuild/linux-ia32" "0.24.0" + "@esbuild/linux-loong64" "0.24.0" + "@esbuild/linux-mips64el" "0.24.0" + "@esbuild/linux-ppc64" "0.24.0" + "@esbuild/linux-riscv64" "0.24.0" + "@esbuild/linux-s390x" "0.24.0" + "@esbuild/linux-x64" "0.24.0" + "@esbuild/netbsd-x64" "0.24.0" + "@esbuild/openbsd-arm64" "0.24.0" + "@esbuild/openbsd-x64" "0.24.0" + "@esbuild/sunos-x64" "0.24.0" + "@esbuild/win32-arm64" "0.24.0" + "@esbuild/win32-ia32" "0.24.0" + "@esbuild/win32-x64" "0.24.0" + escalade@^3.1.1, escalade@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -4780,6 +4940,11 @@ node-releases@^2.0.18: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-tlv@^1.5.14: + version "1.5.14" + resolved "https://registry.yarnpkg.com/node-tlv/-/node-tlv-1.5.14.tgz#88bf0f156f2e6cdad195038d71310723331ddce6" + integrity sha512-mazCWLJl0Z4TYfIx1DN7CwmQ4bZGyrobBjXxg2i6QoB/idkL2u5GgQvbAYfoe4T68+rpM0gNniwzA/dfIONiRA== + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"