From 5623ee952f847ac472945a30e78e1f7241d9e215 Mon Sep 17 00:00:00 2001 From: soralit Date: Tue, 14 May 2024 15:51:29 +0800 Subject: [PATCH] feat: add ton qr protocols --- packages/ur-registry-ton/README.md | 15 ++ .../__test__/TonSignRequest.test.ts | 71 ++++++++ .../__test__/TonSignature.test.ts | 41 +++++ packages/ur-registry-ton/babel.config.js | 6 + packages/ur-registry-ton/package.json | 33 ++++ packages/ur-registry-ton/src/RegistryType.ts | 6 + .../ur-registry-ton/src/TonSignRequest.ts | 155 ++++++++++++++++++ packages/ur-registry-ton/src/TonSignature.ts | 62 +++++++ packages/ur-registry-ton/src/index.ts | 12 ++ packages/ur-registry-ton/tsconfig.json | 13 ++ pnpm-lock.yaml | 63 +++++-- 11 files changed, 459 insertions(+), 18 deletions(-) create mode 100644 packages/ur-registry-ton/README.md create mode 100644 packages/ur-registry-ton/__test__/TonSignRequest.test.ts create mode 100644 packages/ur-registry-ton/__test__/TonSignature.test.ts create mode 100644 packages/ur-registry-ton/babel.config.js create mode 100644 packages/ur-registry-ton/package.json create mode 100644 packages/ur-registry-ton/src/RegistryType.ts create mode 100644 packages/ur-registry-ton/src/TonSignRequest.ts create mode 100644 packages/ur-registry-ton/src/TonSignature.ts create mode 100644 packages/ur-registry-ton/src/index.ts create mode 100644 packages/ur-registry-ton/tsconfig.json diff --git a/packages/ur-registry-ton/README.md b/packages/ur-registry-ton/README.md new file mode 100644 index 00000000..c154378b --- /dev/null +++ b/packages/ur-registry-ton/README.md @@ -0,0 +1,15 @@ +# BC-UR-Registry-Tron + +This repository is the Ton extension of [bc-ur-registry](https://github.com/KeystoneHQ/ur-registry) + +## Installing + +To install, run: + +```bash +yarn add @keystonehq/bc-ur-registry-ton +``` + +```bash +npm install --save @keystonehq/bc-ur-registry-ton +``` diff --git a/packages/ur-registry-ton/__test__/TonSignRequest.test.ts b/packages/ur-registry-ton/__test__/TonSignRequest.test.ts new file mode 100644 index 00000000..e7482f4c --- /dev/null +++ b/packages/ur-registry-ton/__test__/TonSignRequest.test.ts @@ -0,0 +1,71 @@ +// @ts-nocheck + +import { TonSignRequest, DataType } from "../src"; +import * as uuid from "uuid"; + +describe("ton-sign-request", () => { + it("should generate ton-sign-request", () => { + const tonData = Buffer.from( + "te6cckEBAgEARwABHCmpoxdmOz6lAAAACAADAQBoQgArFnMvHAX9tOjTp4/RDd3vP2Bn8xG+U5MTuKRKUE1NoqHc1lAAAAAAAAAAAAAAAAAAAHBy4G8=", + "base64" + ); + + const tronRequestId = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"; + const idBuffer = uuid.parse(tronRequestId) as Uint8Array; + + const tonSignRequest = new TonSignRequest({ + requestId: Buffer.from(idBuffer), + signData: tonData, + dataType: DataType.TRANSACTION, + address: "UQC1IywyQwixSOU8pezOZDC9rv2xCV4CGJzOWH6RX8BTsGJx", + origin: "TonKeeper", + }); + + const cborHex = tonSignRequest.toCBOR().toString("hex"); + console.log(cborHex.toString("hex")); + + expect(cborHex.toString("hex")).toBe( + "a501d825509b1deb4d3b7d4bad9bdd2b0d7b3dcb6d025856b5ee9c7241010201004700011c29a9a317663b3ea500000008000301006842002b16732f1c05fdb4e8d3a78fd10dddef3f6067f311be539313b8a44a504d4da2a1dcd65000000000000000000000000000007072e06f0301057830555143314979777951776978534f553870657a4f5a4443397276327843563443474a7a4f574836525838425473474a780669546f6e4b6565706572" + ); + + const ur = tonSignRequest.toUREncoder(1000).nextPart(); + + expect(ur).toBe( + "ur:ton-sign-request/onadtpdagdndcawmgtfrkigrpmndutdnbtkgfssbjnaohdhfrewynsjpfpadaoadaeflaeadcedtptotchiyfrfmonaeaeaeayaeaxadaeisfwaedncmjkdlceahzcqzvsteosmyttbtutwsfhhniowfbyrngumubwrooxgegdgtgtoeoyuotbgdaeaeaeaeaeaeaeaeaeaeaeaeaeaejojpvtjlaxadahksdygogyfxehgakkktkkgyktinksgugwgoetjoihkngwhtfyfxesjpkoeyksfxhfeefxflgekngwhgfdengmhdetfwghjkflgeksaminghjljtgrihihjoihjpmduydrch" + ); + const tonSignRequestDecoded = TonSignRequest.fromCBOR( + Buffer.from(cborHex, "hex") + ); + expect(uuid.stringify(tonSignRequest.getRequestId())).toBe(tronRequestId); + expect(tonSignRequest.getOrigin()).toBe("TonKeeper"); + expect(tonSignRequestDecoded.getSignData().toString("base64")).toEqual( + "te6cckEBAgEARwABHCmpoxdmOz6lAAAACAADAQBoQgArFnMvHAX9tOjTp4/RDd3vP2Bn8xG+U5MTuKRKUE1NoqHc1lAAAAAAAAAAAAAAAAAAAHBy4G8=" + ); + expect(tonSignRequestDecoded.getDerivationPath()).toEqual(undefined); + expect(tonSignRequestDecoded.getAddress()).toEqual( + "UQC1IywyQwixSOU8pezOZDC9rv2xCV4CGJzOWH6RX8BTsGJx" + ); + }); + + it("should construct an TonSignRequest object from string", () => { + const tonData = Buffer.from( + "te6cckEBAgEARwABHCmpoxdmOz6lAAAACAADAQBoQgArFnMvHAX9tOjTp4/RDd3vP2Bn8xG+U5MTuKRKUE1NoqHc1lAAAAAAAAAAAAAAAAAAAHBy4G8=", + "base64" + ); + const requestID = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"; + + const request = TonSignRequest.constructTonRequest( + tonData, + DataType.TRANSACTION, + "UQC1IywyQwixSOU8pezOZDC9rv2xCV4CGJzOWH6RX8BTsGJx", + requestID, + "TonKeeper", + undefined, + undefined + ); + const ur = request.toUREncoder(1000).nextPart(); + expect(ur).toBe( + "ur:ton-sign-request/onadtpdagdndcawmgtfrkigrpmndutdnbtkgfssbjnaohdhfrewynsjpfpadaoadaeflaeadcedtptotchiyfrfmonaeaeaeayaeaxadaeisfwaedncmjkdlceahzcqzvsteosmyttbtutwsfhhniowfbyrngumubwrooxgegdgtgtoeoyuotbgdaeaeaeaeaeaeaeaeaeaeaeaeaeaejojpvtjlaxadahksdygogyfxehgakkktkkgyktinksgugwgoetjoihkngwhtfyfxesjpkoeyksfxhfeefxflgekngwhgfdengmhdetfwghjkflgeksaminghjljtgrihihjoihjpmduydrch" + ); + }); +}); diff --git a/packages/ur-registry-ton/__test__/TonSignature.test.ts b/packages/ur-registry-ton/__test__/TonSignature.test.ts new file mode 100644 index 00000000..7d944ed9 --- /dev/null +++ b/packages/ur-registry-ton/__test__/TonSignature.test.ts @@ -0,0 +1,41 @@ +// @ts-nocheck + +import { TonSignature, TronSignature, URRegistryDecoder } from "../src"; +import * as uuid from "uuid"; + +describe("tron-signature", () => { + it("should generate tron-signature", () => { + const signature = Buffer.from( + "47b1f77b3e30cfbbfa41d795dd34475865240617dd1c5a7bad526f5fd89e52cd057c80b665cc2431efab53520e2b1b92a0425033baee915df858ca1c588b0a1800", + "hex" + ); + const requestId = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"; + const idBuffer = uuid.parse(requestId) as Uint8Array; + + const tronSignature = new TonSignature( + signature, + Buffer.from(idBuffer), + ); + + const cborHex = tronSignature.toCBOR().toString("hex"); + const ur = tronSignature.toUREncoder(1000).nextPart(); + expect(ur).toBe( + "ur:tron-signature/oeadtpdagdndcawmgtfrkigrpmndutdnbtkgfssbjnaohdfpflpaylkgfmdytkrkzsfptsmduteeflhdihdkamchutcehtkgpmgmjlhetpnngmsnahkelarpihsfdkehwspygugmbadncwmonbfwgdeordwymehlyahdsgcehdlubkcsaebbckfpwy" + ); + const tronSignatureDecoded = TronSignature.fromCBOR( + Buffer.from(cborHex, "hex") + ); + expect(uuid.stringify(tronSignatureDecoded.getRequestId())).toBe( + requestId + ); + expect(tronSignatureDecoded.getSignature().toString("hex")).toEqual( + "47b1f77b3e30cfbbfa41d795dd34475865240617dd1c5a7bad526f5fd89e52cd057c80b665cc2431efab53520e2b1b92a0425033baee915df858ca1c588b0a1800" + ); + + const urDecoder = new URRegistryDecoder(); + urDecoder.receivePart('ur:tron-signature/oeadtpdagdndcawmgtfrkigrpmndutdnbtkgfssbjnaohdfpflpaylkgfmdytkrkzsfptsmduteeflhdihdkamchutcehtkgpmgmjlhetpnngmsnahkelarpihsfdkehwspygugmbadncwmonbfwgdeordwymehlyahdsgcehdlubkcsaebbckfpwy'); + const decodeSig = TronSignature.fromCBOR(urDecoder.resultUR().cbor); + expect(decodeSig.getSignature().toString('hex')).toEqual('47b1f77b3e30cfbbfa41d795dd34475865240617dd1c5a7bad526f5fd89e52cd057c80b665cc2431efab53520e2b1b92a0425033baee915df858ca1c588b0a1800'); + expect(decodeSig.getRequestId().toString('hex')).toEqual('9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d'); + }); +}); diff --git a/packages/ur-registry-ton/babel.config.js b/packages/ur-registry-ton/babel.config.js new file mode 100644 index 00000000..dd242dc9 --- /dev/null +++ b/packages/ur-registry-ton/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-typescript", + ], +}; diff --git a/packages/ur-registry-ton/package.json b/packages/ur-registry-ton/package.json new file mode 100644 index 00000000..dac0491b --- /dev/null +++ b/packages/ur-registry-ton/package.json @@ -0,0 +1,33 @@ +{ + "name": "@keystonehq/bc-ur-registry-ton", + "version": "0.1.0", + "description": "bc-ur-registry extension for Tron", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "directories": { + "lib": "src", + "test": "__tests__" + }, + "files": [ + "dist" + ], + "scripts": { + "clean": "rm -rf ./dist", + "start": "tsdx watch", + "build": "tsdx build", + "test": "jest --passWithNoTests" + }, + "author": "Sora Li", + "license": "ISC", + "dependencies": { + "@keystonehq/bc-ur-registry": "^0.5.4", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@babel/preset-typescript": "^7.15.0", + "@types/uuid": "^9.0.0", + "jest": "^27.5.1", + "tsdx": "^0.14.1", + "typescript": "^4.9.4" + } +} diff --git a/packages/ur-registry-ton/src/RegistryType.ts b/packages/ur-registry-ton/src/RegistryType.ts new file mode 100644 index 00000000..d4ae173e --- /dev/null +++ b/packages/ur-registry-ton/src/RegistryType.ts @@ -0,0 +1,6 @@ +import { RegistryType } from "@keystonehq/bc-ur-registry"; + +export const ExtendedRegistryTypes = { + TRON_SIGN_REQUEST: new RegistryType("ton-sign-request", 7201), + TRON_SIGNATURE: new RegistryType("ton-signature", 7202) +}; diff --git a/packages/ur-registry-ton/src/TonSignRequest.ts b/packages/ur-registry-ton/src/TonSignRequest.ts new file mode 100644 index 00000000..d11e2410 --- /dev/null +++ b/packages/ur-registry-ton/src/TonSignRequest.ts @@ -0,0 +1,155 @@ +import { + CryptoKeypath, + extend, + DataItem, + PathComponent, + RegistryItem, + DataItemMap, +} from "@keystonehq/bc-ur-registry"; +import { ExtendedRegistryTypes } from "./RegistryType"; +import { parse as uuidParse } from "uuid"; + +const { decodeToDataItem, RegistryTypes } = extend; + +enum Keys { + requestId = 1, + signData, + dataType, + derivationPath, + address, + origin, +} + +type SignRequestProps = { + requestId?: Buffer; + signData: Buffer; + dataType: DataType; + derivationPath?: CryptoKeypath; + address: String; + origin?: string; +}; + +export enum DataType { + TRANSACTION = 1, + SIGN_PROOF = 2, +} + +export class TonSignRequest extends RegistryItem { + private requestId?: Buffer; + private signData: Buffer; + private dataType: DataType; + private derivationPath?: CryptoKeypath; + private address: String; + private origin?: string; + + getRegistryType = () => ExtendedRegistryTypes.TRON_SIGN_REQUEST; + + constructor(args: SignRequestProps) { + super(); + this.requestId = args.requestId; + this.signData = args.signData; + this.derivationPath = args.derivationPath; + this.address = args.address; + this.origin = args.origin; + this.dataType = args.dataType; + } + + public getRequestId = () => this.requestId; + public getSignData = () => this.signData; + public getDerivationPath = () => this.derivationPath?.getPath(); + public getAddress = () => this.address; + public getOrigin = () => this.origin; + public getDataType = () => this.dataType; + + public toDataItem = () => { + const map: DataItemMap = {}; + map[Keys.signData] = this.signData; + map[Keys.dataType] = this.dataType; + + if (this.derivationPath) { + const derivationPath = this.derivationPath.toDataItem(); + derivationPath.setTag(this.derivationPath.getRegistryType().getTag()); + map[Keys.derivationPath] = derivationPath; + } + + if (this.requestId) { + map[Keys.requestId] = new DataItem( + this.requestId, + RegistryTypes.UUID.getTag() + ); + } + + if (this.address) { + map[Keys.address] = this.address; + } + + if (this.origin) { + map[Keys.origin] = this.origin; + } + + return new DataItem(map); + }; + + public static fromDataItem = (dataItem: DataItem) => { + const map = dataItem.getData(); + + const requestId = map[Keys.requestId] + ? map[Keys.requestId].getData() + : undefined; + + const derivationPath = map[Keys.derivationPath] + ? CryptoKeypath.fromDataItem(map[Keys.derivationPath]) + : undefined; + + return new TonSignRequest({ + requestId, + signData: map[Keys.signData], + dataType: map[Keys.dataType], + derivationPath, + address: map[Keys.address], + origin: map[Keys.origin], + }); + }; + + public static fromCBOR = (_cborPayload: Buffer) => { + const dataItem = decodeToDataItem(_cborPayload); + return TonSignRequest.fromDataItem(dataItem); + }; + + public static parsePath(path: string, xfp: string) { + const paths = path.replace(/[m|M]\//, "").split("/"); + const pathComponent = paths.map((path) => { + const index = parseInt(path.replace("'", "")); + let isHardened = false; + if (path.endsWith("'")) { + isHardened = true; + } + return new PathComponent({ index, hardened: isHardened }); + }); + return new CryptoKeypath(pathComponent, Buffer.from(xfp, "hex")); + } + + public static constructTonRequest( + signData: Buffer, + dataType: DataType, + address: String, + uuidString?: string, + origin?: string, + xfp?: string, + derivationHDPath?: string + ) { + return new TonSignRequest({ + requestId: uuidString + ? Buffer.from(uuidParse(uuidString) as Uint8Array) + : undefined, + signData, + dataType, + derivationPath: + derivationHDPath && xfp + ? TonSignRequest.parsePath(derivationHDPath, xfp) + : undefined, + address, + origin, + }); + } +} diff --git a/packages/ur-registry-ton/src/TonSignature.ts b/packages/ur-registry-ton/src/TonSignature.ts new file mode 100644 index 00000000..eb84e632 --- /dev/null +++ b/packages/ur-registry-ton/src/TonSignature.ts @@ -0,0 +1,62 @@ +import { + extend, + DataItem, + RegistryItem, + DataItemMap +} from "@keystonehq/bc-ur-registry"; +import { ExtendedRegistryTypes } from "./RegistryType"; + +const { RegistryTypes, decodeToDataItem } = extend; + +enum Keys { + requestId = 1, + signature, + origin, +} + +export class TonSignature extends RegistryItem { + private requestId?: Buffer; + private signature: Buffer; + private origin?: string; + + getRegistryType = () => ExtendedRegistryTypes.TRON_SIGNATURE; + + constructor( + signature: Buffer, + requestId?: Buffer, + origin?: string, + ) { + super(); + this.signature = signature; + this.requestId = requestId; + this.origin = origin; + } + + public getRequestId = () => this.requestId; + public getSignature = () => this.signature; + public getOrigin = () => this.origin; + + public toDataItem = () => { + const map: DataItemMap = {}; + map[Keys.requestId] = new DataItem( + this.requestId, + RegistryTypes.UUID.getTag() + ); + map[Keys.signature] = this.signature; + map[Keys.origin] = this.origin; + return new DataItem(map); + }; + + public static fromDataItem = (dataItem: DataItem) => { + const map = dataItem.getData(); + const signature = map[Keys.signature]; + const requestId = map[Keys.requestId].getData(); + const origin = map[Keys.origin]; + return new TonSignature(signature, requestId, origin); + }; + + public static fromCBOR = (_cborPayload: Buffer) => { + const dataItem = decodeToDataItem(_cborPayload); + return TonSignature.fromDataItem(dataItem); + }; +} diff --git a/packages/ur-registry-ton/src/index.ts b/packages/ur-registry-ton/src/index.ts new file mode 100644 index 00000000..53ff3e64 --- /dev/null +++ b/packages/ur-registry-ton/src/index.ts @@ -0,0 +1,12 @@ +import { patchTags } from "@keystonehq/bc-ur-registry"; +import { ExtendedRegistryTypes } from "./RegistryType"; +export * from "@keystonehq/bc-ur-registry"; + +patchTags( + Object.values(ExtendedRegistryTypes) + .filter(rt => !!rt.getTag()) + .map(rt => rt.getTag()) as number[] +); + +export { TonSignRequest, DataType } from "./TonSignRequest"; +export { TonSignature } from "./TonSignature"; diff --git a/packages/ur-registry-ton/tsconfig.json b/packages/ur-registry-ton/tsconfig.json new file mode 100644 index 00000000..b051e974 --- /dev/null +++ b/packages/ur-registry-ton/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "noImplicitAny": true, + "strictNullChecks": true, + "rootDir": "./", + "baseUrl": "./", + "paths": { + "*": ["src/*", "node_modules/*"] + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d417f373..18f2e5ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -873,6 +873,31 @@ importers: specifier: ^5.0.4 version: 5.0.4 + packages/ur-registry-ton: + dependencies: + '@keystonehq/bc-ur-registry': + specifier: ^0.5.4 + version: 0.5.5 + uuid: + specifier: ^9.0.0 + version: 9.0.0 + devDependencies: + '@babel/preset-typescript': + specifier: ^7.15.0 + version: 7.16.7(@babel/core@7.22.1) + '@types/uuid': + specifier: ^9.0.0 + version: 9.0.1 + jest: + specifier: ^27.5.1 + version: 27.5.1 + tsdx: + specifier: ^0.14.1 + version: 0.14.1 + typescript: + specifier: ^4.9.4 + version: 4.9.5 + packages/ur-registry-tron: dependencies: '@keystonehq/bc-ur-registry': @@ -1067,7 +1092,7 @@ packages: '@babel/traverse': 7.22.4 '@babel/types': 7.22.4 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -1152,7 +1177,7 @@ packages: '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.21.5 '@babel/traverse': 7.22.4 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -1168,7 +1193,7 @@ packages: '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.21.5 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -1184,7 +1209,7 @@ packages: '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.21.5 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -2325,7 +2350,7 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.22.4 '@babel/types': 7.22.4 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2379,7 +2404,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) espree: 9.5.2 globals: 13.20.0 ignore: 5.2.4 @@ -2770,7 +2795,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3997,7 +4022,7 @@ packages: '@typescript-eslint/scope-manager': 5.14.0 '@typescript-eslint/type-utils': 5.14.0(eslint@8.10.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.14.0(eslint@8.10.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) eslint: 8.10.0 functional-red-black-tree: 1.0.1 ignore: 5.2.4 @@ -4058,7 +4083,7 @@ packages: '@typescript-eslint/scope-manager': 5.14.0 '@typescript-eslint/types': 5.14.0 '@typescript-eslint/typescript-estree': 5.14.0(typescript@4.9.5) - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) eslint: 8.10.0 typescript: 4.9.5 transitivePeerDependencies: @@ -4084,7 +4109,7 @@ packages: optional: true dependencies: '@typescript-eslint/utils': 5.14.0(eslint@8.10.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) eslint: 8.10.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 @@ -4106,7 +4131,7 @@ packages: typescript: optional: true dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) eslint-visitor-keys: 1.3.0 glob: 7.2.3 is-glob: 4.0.3 @@ -4129,7 +4154,7 @@ packages: dependencies: '@typescript-eslint/types': 5.14.0 '@typescript-eslint/visitor-keys': 5.14.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.1 @@ -4493,7 +4518,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true @@ -6227,6 +6252,7 @@ packages: dependencies: ms: 2.1.2 supports-color: 9.3.1 + dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -7054,7 +7080,7 @@ packages: ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.5 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) doctrine: 3.0.0 eslint-scope: 5.1.1 eslint-utils: 1.4.3 @@ -7101,7 +7127,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.0 @@ -8519,7 +8545,7 @@ packages: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true @@ -8561,7 +8587,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true @@ -9203,7 +9229,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@6.1.0) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -13297,6 +13323,7 @@ packages: /supports-color@9.3.1: resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} engines: {node: '>=12'} + dev: true /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}