From 9ae4e2e40d4460a1212dbe9d8428af0d9de8a5e7 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Tue, 9 Apr 2024 17:04:19 +0800 Subject: [PATCH 01/17] init --- nodejs/example/basicSchemaless.ts | 35 + nodejs/example/basicSql.ts | 59 + nodejs/example/basicStmt.ts | 60 + nodejs/example/basicTmq.ts | 71 + nodejs/index.ts | 23 + nodejs/jest.config.js | 8 + nodejs/package-lock.json | 9870 +++++++++++++++++ nodejs/package.json | 57 + nodejs/readme.md | 59 + nodejs/src/client/wsClient.ts | 291 + nodejs/src/client/wsConnector.ts | 156 + nodejs/src/client/wsConnectorPool.ts | 112 + nodejs/src/client/wsEventCallback.ts | 102 + nodejs/src/client/wsResponse.ts | 123 + nodejs/src/common/config.ts | 50 + nodejs/src/common/constant.ts | 86 + nodejs/src/common/reqid.ts | 61 + nodejs/src/common/taosResult.ts | 466 + nodejs/src/common/ut8Helper.ts | 42 + nodejs/src/common/utils.ts | 25 + nodejs/src/common/wsError.ts | 37 + nodejs/src/common/wsOptions.ts | 14 + nodejs/src/sql/wsProto.ts | 28 + nodejs/src/sql/wsRows.ts | 82 + nodejs/src/sql/wsSql.ts | 184 + nodejs/src/stmt/wsParams.ts | 465 + nodejs/src/stmt/wsProto.ts | 104 + nodejs/src/stmt/wsStmt.ts | 225 + nodejs/src/tmq/config.ts | 56 + nodejs/src/tmq/constant.ts | 104 + nodejs/src/tmq/tmqResponse.ts | 257 + nodejs/src/tmq/wsTmq.ts | 470 + nodejs/test/bulkPulling/queryTables.test.ts | 298 + nodejs/test/bulkPulling/schemaless.test.ts | 103 + nodejs/test/bulkPulling/sql.test.ts | 128 + nodejs/test/bulkPulling/stmt.func.test.ts | 389 + nodejs/test/bulkPulling/stmt.type.test.ts | 301 + nodejs/test/bulkPulling/tmq.test.ts | 191 + nodejs/test/bulkPulling/wsConnectPool.test.ts | 137 + nodejs/test/utils.ts | 305 + nodejs/tsconfig.json | 101 + 41 files changed, 15735 insertions(+) create mode 100644 nodejs/example/basicSchemaless.ts create mode 100644 nodejs/example/basicSql.ts create mode 100644 nodejs/example/basicStmt.ts create mode 100644 nodejs/example/basicTmq.ts create mode 100644 nodejs/index.ts create mode 100644 nodejs/jest.config.js create mode 100644 nodejs/package-lock.json create mode 100644 nodejs/package.json create mode 100644 nodejs/readme.md create mode 100644 nodejs/src/client/wsClient.ts create mode 100644 nodejs/src/client/wsConnector.ts create mode 100644 nodejs/src/client/wsConnectorPool.ts create mode 100644 nodejs/src/client/wsEventCallback.ts create mode 100644 nodejs/src/client/wsResponse.ts create mode 100644 nodejs/src/common/config.ts create mode 100644 nodejs/src/common/constant.ts create mode 100644 nodejs/src/common/reqid.ts create mode 100644 nodejs/src/common/taosResult.ts create mode 100644 nodejs/src/common/ut8Helper.ts create mode 100644 nodejs/src/common/utils.ts create mode 100644 nodejs/src/common/wsError.ts create mode 100644 nodejs/src/common/wsOptions.ts create mode 100644 nodejs/src/sql/wsProto.ts create mode 100644 nodejs/src/sql/wsRows.ts create mode 100644 nodejs/src/sql/wsSql.ts create mode 100644 nodejs/src/stmt/wsParams.ts create mode 100644 nodejs/src/stmt/wsProto.ts create mode 100644 nodejs/src/stmt/wsStmt.ts create mode 100644 nodejs/src/tmq/config.ts create mode 100644 nodejs/src/tmq/constant.ts create mode 100644 nodejs/src/tmq/tmqResponse.ts create mode 100644 nodejs/src/tmq/wsTmq.ts create mode 100644 nodejs/test/bulkPulling/queryTables.test.ts create mode 100644 nodejs/test/bulkPulling/schemaless.test.ts create mode 100644 nodejs/test/bulkPulling/sql.test.ts create mode 100644 nodejs/test/bulkPulling/stmt.func.test.ts create mode 100644 nodejs/test/bulkPulling/stmt.type.test.ts create mode 100644 nodejs/test/bulkPulling/tmq.test.ts create mode 100644 nodejs/test/bulkPulling/wsConnectPool.test.ts create mode 100644 nodejs/test/utils.ts create mode 100644 nodejs/tsconfig.json diff --git a/nodejs/example/basicSchemaless.ts b/nodejs/example/basicSchemaless.ts new file mode 100644 index 0000000..21ebfc5 --- /dev/null +++ b/nodejs/example/basicSchemaless.ts @@ -0,0 +1,35 @@ +import { WSConfig } from '../src/common/config'; +import { Precision, SchemalessProto } from '../src/sql/wsProto'; +import { sqlConnect } from '../index'; +let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; +let db = 'power' +let influxdbData = "st,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000"; +let telnetData = "stb0_0 1626006833 4 host=host0 interface=eth0"; +let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}"; +// const dropDB = `drop database if exists ${db}` + +async function Prepare() { + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await sqlConnect(conf) + await wsSql.Exec(`create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;`) + wsSql.Close() +} + +(async () => { + let wsSchemaless = null + try { + await Prepare() + let conf = new WSConfig(dsn); + conf.SetDb(db) + wsSchemaless = await sqlConnect(conf) + await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NANO_SECONDS, 0); + await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); + await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); + } catch (e) { + console.error(e); + }finally { + if (wsSchemaless) { + wsSchemaless.Close(); + } + } +})(); diff --git a/nodejs/example/basicSql.ts b/nodejs/example/basicSql.ts new file mode 100644 index 0000000..8647a24 --- /dev/null +++ b/nodejs/example/basicSql.ts @@ -0,0 +1,59 @@ + +require('qingwa')(); + +import { WSConfig } from '../src/common/config'; +import { sqlConnect } from '../index' + +let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; +(async () => { + let wsSql = null; + let wsRows = null; + let reqId = 0; + try { + let conf :WSConfig = new WSConfig(dsn) + wsSql = await sqlConnect(conf) + + let version = await wsSql.Version(); + console.log(version); + + let taosResult = await wsSql.Exec('show databases', reqId++) + console.log(taosResult); + + taosResult = await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;',reqId++); + console.log(taosResult); + + taosResult = await wsSql.Exec('use power',reqId++) + console.log(taosResult); + + taosResult = await wsSql.Exec('CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);', reqId++); + console.log(taosResult); + + taosResult = await wsSql.Exec('describe meters', reqId++) + console.log(taosResult); + + taosResult = await wsSql.Exec('INSERT INTO d1001 USING meters TAGS ("California.SanFrancisco", 3) VALUES (NOW, 10.2, 219, 0.32)', reqId++) + console.log(taosResult); + + wsRows = await wsSql.Query('select * from meters', reqId++); + let meta = wsRows.GetMeta() + console.log("wsRow:meta:=>", meta); + + while (await wsRows.Next()) { + let result = await wsRows.GetData(); + console.log('queryRes.Scan().then=>', result); + } + await wsRows.Close() + + } catch (e) { + let err:any = e + console.error(err); + + } finally { + if (wsRows) { + await wsRows.Close(); + } + if (wsSql) { + wsSql.Close(); + } + } +})(); diff --git a/nodejs/example/basicStmt.ts b/nodejs/example/basicStmt.ts new file mode 100644 index 0000000..f6ac35d --- /dev/null +++ b/nodejs/example/basicStmt.ts @@ -0,0 +1,60 @@ +require('qingwa')(); +import { WSConfig } from '../src/common/config'; +import { sqlConnect } from '../index'; + +let db = 'power' +let stable = 'meters' +let tags = ['California.SanFrancisco', 3]; +let multi = [ + [1706786044994, 1706786044995, 1706786044996], + [10.2, 10.3, 10.4], + [292, 293, 294], + [0.32, 0.33, 0.34], +]; + +async function Prepare() { + let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await sqlConnect(conf) + await wsSql.Exec(`create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;`) + await wsSql.Exec(`CREATE STABLE if not exists ${db}.${stable} (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);`); + wsSql.Close() +} + +(async () => { + let stmt = null; + let connector = null; + try { + await Prepare(); + let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb(db) + connector = await sqlConnect(wsConf); + stmt = await connector.StmtInit() + await stmt.Prepare(`INSERT INTO ? USING ${db}.${stable} TAGS (?, ?) VALUES (?, ?, ?, ?)`); + await stmt.SetTableName('d1001'); + + let tagParams = stmt.NewStmtParam() + tagParams.SetVarcharColumn([tags[0]]) + tagParams.SetIntColumn([tags[1]]) + await stmt.SetBinaryTags(tagParams); + + let bindParams = stmt.NewStmtParam() + bindParams.SetTimestampColumn(multi[0]); + bindParams.SetFloatColumn(multi[1]) + bindParams.SetIntColumn(multi[2]) + bindParams.SetFloatColumn(multi[3]) + await stmt.BinaryBind(bindParams); + await stmt.Batch(); + await stmt.Exec(); + } catch (e) { + console.error(e); + }finally { + if (stmt) { + stmt.Close(); + } + if (connector) { + connector.Close(); + } + } +})(); diff --git a/nodejs/example/basicTmq.ts b/nodejs/example/basicTmq.ts new file mode 100644 index 0000000..4699976 --- /dev/null +++ b/nodejs/example/basicTmq.ts @@ -0,0 +1,71 @@ +import { WSConfig } from "../src/common/config"; +import { TMQConstants } from "../src/tmq/constant"; +import { sqlConnect, tmqConnect } from "../index"; + + +const stable = 'meters'; +const db = 'power' +const topics:string[] = ['pwer_meters_topic'] +let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};` +let configMap = new Map([ + [TMQConstants.GROUP_ID, "gId"], + [TMQConstants.CONNECT_USER, "root"], + [TMQConstants.CONNECT_PASS, "taosdata"], + [TMQConstants.AUTO_OFFSET_RESET, "earliest"], + [TMQConstants.CLIENT_ID, 'test_tmq_client'], + [TMQConstants.WS_URL, 'ws://192.168.1.95:6051/rest/tmq'], + [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], + [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] +]); + +async function Prepare() { + let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let conf :WSConfig = new WSConfig(dsn) + const createDB = `create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;` + const createStable = `CREATE STABLE if not exists ${db}.${stable} (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);` + let createTopic = `create topic if not exists ${topics[0]} as select * from ${db}.${stable}` + const useDB = `use ${db}` + + let ws = await sqlConnect(conf); + await ws.Exec(createDB); + await ws.Exec(useDB); + await ws.Exec(createStable); + await ws.Exec(createTopic); + for (let i = 0; i < 10; i++) { + await ws.Exec(`INSERT INTO d1001 USING ${stable} TAGS ("California.SanFrancisco", 3) VALUES (NOW, ${10+i}, ${200+i}, ${0.32 + i})`) + } + ws.Close() +} + +(async () => { + let consumer = null + try { + await Prepare() + consumer = await tmqConnect(configMap); + await consumer.Subscribe(topics); + for (let i = 0; i < 5; i++) { + let res = await consumer.Poll(500); + for (let [key, value] of res) { + console.log(key, value); + } + if (res.size == 0) { + break; + } + await consumer.Commit(); + } + + let assignment = await consumer.Assignment() + console.log(assignment) + await consumer.SeekToBeginning(assignment) + + await consumer.Unsubscribe() + } catch (e) { + console.error(e); + } finally { + if (consumer) { + consumer.Close(); + } + } +})(); + + diff --git a/nodejs/index.ts b/nodejs/index.ts new file mode 100644 index 0000000..7a46e34 --- /dev/null +++ b/nodejs/index.ts @@ -0,0 +1,23 @@ +import { WsSql } from './src/sql/wsSql' +import { WSConfig } from './src/common/config'; +import { WsConsumer } from './src/tmq/wsTmq'; + +let sqlConnect = async (conf: WSConfig) => { + try { + return await WsSql.Open(conf) + } catch (err: any) { + console.error(err); + throw err; + } +}; + +let tmqConnect = async (configMap: Map) => { + try { + return await WsConsumer.NewConsumer(configMap); + } catch (err: any) { + console.error(err); + throw err; + } +}; + +export { sqlConnect, tmqConnect }; \ No newline at end of file diff --git a/nodejs/jest.config.js b/nodejs/jest.config.js new file mode 100644 index 0000000..b9050d0 --- /dev/null +++ b/nodejs/jest.config.js @@ -0,0 +1,8 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest", + transform: {'^.+\\.ts?$': 'ts-jest'}, + testEnvironment: 'node', + testRegex: '/test/.*\\.(test|spec)?\\.(ts|tsx)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], +}; \ No newline at end of file diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json new file mode 100644 index 0000000..b05ed16 --- /dev/null +++ b/nodejs/package-lock.json @@ -0,0 +1,9870 @@ +{ + "name": "@tdengine/websocket", + "version": "3.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@tdengine/websocket", + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "json-bigint": "^1.0.0", + "websocket": "^1.0.34" + }, + "devDependencies": { + "@parcel/packager-ts": "^2.7.0", + "@parcel/transformer-typescript-types": "^2.7.0", + "@types/jest": "^29.2.1", + "@types/json-bigint": "^1.0.1", + "@types/node": "^18.0.0", + "@types/websocket": "^1.0.5", + "jest": "^29.2.2", + "parcel": "^2.7.0", + "ts-jest": "^29.0.3", + "typescript": "^4.6.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.19.6", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.1.tgz", + "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.19.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.19.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.19.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.1.tgz", + "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.20.0.tgz", + "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@jest/console/-/console-29.2.1.tgz", + "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/core/-/core-29.2.2.tgz", + "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==", + "dev": true, + "dependencies": { + "@jest/console": "^29.2.1", + "@jest/reporters": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-resolve-dependencies": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "jest-watcher": "^29.2.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-29.2.2.tgz", + "integrity": "sha512-OWn+Vhu0I1yxuGBJEFFekMYc8aGBGrY4rt47SOh/IFaI+D7ZHCk7pKRiSoZ2/Ml7b0Ony3ydmEHRx/tEOC7H1A==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-mock": "^29.2.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==", + "dev": true, + "dependencies": { + "expect": "^29.2.2", + "jest-snapshot": "^29.2.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.2.2.tgz", + "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.2.2.tgz", + "integrity": "sha512-nqaW3y2aSyZDl7zQ7t1XogsxeavNpH6kkdq+EpXncIDvAkjvFD7hmhcIs1nWloengEWUoWqkqSA6MSbf9w6DgA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.2", + "jest-util": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-29.2.2.tgz", + "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/types": "^29.2.1", + "jest-mock": "^29.2.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.2.2.tgz", + "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.2.1.tgz", + "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz", + "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.2.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-29.2.2.tgz", + "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "0.15.12", + "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-0.15.12.tgz", + "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", + "dev": true + }, + "node_modules/@lezer/lr": { + "version": "0.15.8", + "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-0.15.8.tgz", + "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", + "dev": true, + "dependencies": { + "@lezer/common": "^0.15.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", + "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", + "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", + "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", + "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", + "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", + "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", + "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", + "dev": true, + "dependencies": { + "@lezer/common": "^0.15.7", + "@lezer/lr": "^0.15.4", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz", + "integrity": "sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz", + "integrity": "sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz", + "integrity": "sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz", + "integrity": "sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz", + "integrity": "sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz", + "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@parcel/bundler-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", + "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/cache": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/cache/-/cache-2.7.0.tgz", + "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/utils": "2.7.0", + "lmdb": "2.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/codeframe": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/codeframe/-/codeframe-2.7.0.tgz", + "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/compressor-raw": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", + "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/config-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/config-default/-/config-default-2.7.0.tgz", + "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.7.0", + "@parcel/compressor-raw": "2.7.0", + "@parcel/namer-default": "2.7.0", + "@parcel/optimizer-css": "2.7.0", + "@parcel/optimizer-htmlnano": "2.7.0", + "@parcel/optimizer-image": "2.7.0", + "@parcel/optimizer-svgo": "2.7.0", + "@parcel/optimizer-terser": "2.7.0", + "@parcel/packager-css": "2.7.0", + "@parcel/packager-html": "2.7.0", + "@parcel/packager-js": "2.7.0", + "@parcel/packager-raw": "2.7.0", + "@parcel/packager-svg": "2.7.0", + "@parcel/reporter-dev-server": "2.7.0", + "@parcel/resolver-default": "2.7.0", + "@parcel/runtime-browser-hmr": "2.7.0", + "@parcel/runtime-js": "2.7.0", + "@parcel/runtime-react-refresh": "2.7.0", + "@parcel/runtime-service-worker": "2.7.0", + "@parcel/transformer-babel": "2.7.0", + "@parcel/transformer-css": "2.7.0", + "@parcel/transformer-html": "2.7.0", + "@parcel/transformer-image": "2.7.0", + "@parcel/transformer-js": "2.7.0", + "@parcel/transformer-json": "2.7.0", + "@parcel/transformer-postcss": "2.7.0", + "@parcel/transformer-posthtml": "2.7.0", + "@parcel/transformer-raw": "2.7.0", + "@parcel/transformer-react-refresh-wrap": "2.7.0", + "@parcel/transformer-svg": "2.7.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/core": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/core/-/core-2.7.0.tgz", + "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/graph": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.5.4", + "nullthrows": "^1.1.1", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/css": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/@parcel/css/-/css-1.14.0.tgz", + "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", + "dev": true, + "dependencies": { + "lightningcss": "^1.14.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", + "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/events": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/events/-/events-2.7.0.tgz", + "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/fs": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/fs/-/fs-2.7.0.tgz", + "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "dev": true, + "dependencies": { + "@parcel/fs-search": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/watcher": "^2.0.0", + "@parcel/workers": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/fs-search": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/fs-search/-/fs-search-2.7.0.tgz", + "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/graph": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/graph/-/graph-2.7.0.tgz", + "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", + "dev": true, + "dependencies": { + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/hash": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/hash/-/hash-2.7.0.tgz", + "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "xxhash-wasm": "^0.4.2" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/logger": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/logger/-/logger-2.7.0.tgz", + "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", + "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/namer-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/namer-default/-/namer-default-2.7.0.tgz", + "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", + "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", + "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", + "dev": true, + "dependencies": { + "@parcel/css": "^1.12.2", + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", + "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", + "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", + "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/optimizer-terser": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", + "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "terser": "^5.2.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/package-manager/-/package-manager-2.7.0.tgz", + "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-css/-/packager-css-2.7.0.tgz", + "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-html/-/packager-html-2.7.0.tgz", + "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-js/-/packager-js-2.7.0.tgz", + "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/packager-js/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", + "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", + "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/packager-ts": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", + "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/plugin/-/plugin-2.7.0.tgz", + "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", + "dev": true, + "dependencies": { + "@parcel/types": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", + "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "chalk": "^4.1.0", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", + "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", + "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", + "dev": true, + "dependencies": { + "@parcel/node-resolver-core": "2.7.0", + "@parcel/plugin": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", + "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", + "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", + "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", + "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", + "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^5.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", + "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", + "dev": true, + "dependencies": { + "@parcel/css": "^1.12.2", + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", + "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", + "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", + "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "@swc/helpers": "^0.4.2", + "browserslist": "^4.6.6", + "detect-libc": "^1.0.3", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", + "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "json5": "^2.2.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", + "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", + "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-raw": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", + "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", + "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-svg": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", + "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + } + }, + "node_modules/@parcel/transformer-typescript-types": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", + "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/ts-utils": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/ts-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", + "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", + "dev": true, + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/types": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/types/-/types-2.7.0.tgz", + "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/workers": "2.7.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/utils/-/utils-2.7.0.tgz", + "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/markdown-ansi": "2.7.0", + "@parcel/source-map": "^2.0.0", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.0.6.tgz", + "integrity": "sha512-6CaHXp6BNrFY5375OGQLSeaxfO8csgGWbO1U2nUqufDtUks7ZIG5wAyj/wR1zkOxRrhN0EaZWvlgSKYqo7a9lg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@parcel/workers": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/workers/-/workers-2.7.0.tgz", + "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "chrome-trace-event": "^1.0.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.4", + "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.4.tgz", + "integrity": "sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.4.12", + "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.4.12.tgz", + "integrity": "sha512-R6RmwS9Dld5lNvwKlPn62+piU+WDG1sMfsnfJioXCciyko/gZ0DQ4Mqglhq1iGU1nQ/RcGkAwfMH+elMSkJH3Q==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-29.2.1.tgz", + "integrity": "sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/websocket": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/websocket/-/websocket-1.0.5.tgz", + "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.2.2.tgz", + "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.2.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "engines": { + "node": "*" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001429", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz", + "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.2.0.tgz", + "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlnano": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/htmlnano/-/htmlnano-2.0.2.tgz", + "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.1", + "posthtml": "^0.16.5", + "timsort": "^0.3.0" + }, + "peerDependencies": { + "cssnano": "^5.0.11", + "postcss": "^8.3.11", + "purgecss": "^4.0.3", + "relateurl": "^0.2.7", + "srcset": "^5.0.0", + "svgo": "^2.8.0", + "terser": "^5.10.0", + "uncss": "^0.17.3" + }, + "peerDependenciesMeta": { + "cssnano": { + "optional": true + }, + "postcss": { + "optional": true + }, + "purgecss": { + "optional": true + }, + "relateurl": { + "optional": true + }, + "srcset": { + "optional": true + }, + "svgo": { + "optional": true + }, + "terser": { + "optional": true + }, + "uncss": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest/-/jest-29.2.2.tgz", + "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.2.2", + "@jest/types": "^29.2.1", + "import-local": "^3.0.2", + "jest-cli": "^29.2.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.2.2.tgz", + "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.2.2.tgz", + "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-29.2.2.tgz", + "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.2.2", + "@jest/types": "^29.2.1", + "babel-jest": "^29.2.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.2.2", + "jest-environment-node": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.2.1.tgz", + "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.2.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-29.2.1.tgz", + "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.2.1", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.2.2.tgz", + "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-mock": "^29.2.2", + "jest-util": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.2.1.tgz", + "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", + "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz", + "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.2.1.tgz", + "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.2.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.2.2.tgz", + "integrity": "sha512-1leySQxNAnivvbcx0sCB37itu8f4OX2S/+gxLAV4Z62shT4r4dTG9tACDywUAEZoLSr36aYUTsVp3WKwWt4PMQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-util": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.2.2.tgz", + "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz", + "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.2.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.2.2.tgz", + "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.2.1", + "@jest/environment": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-leak-detector": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-resolve": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-util": "^29.2.1", + "jest-watcher": "^29.2.2", + "jest-worker": "^29.2.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.2.2.tgz", + "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/globals": "^29.2.2", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.2", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.2.2.tgz", + "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.2.2", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.2.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.2.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.2.2.tgz", + "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.2.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.2.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.2.2.tgz", + "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.2.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.16.0.tgz", + "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.16.0", + "lightningcss-darwin-x64": "1.16.0", + "lightningcss-linux-arm-gnueabihf": "1.16.0", + "lightningcss-linux-arm64-gnu": "1.16.0", + "lightningcss-linux-arm64-musl": "1.16.0", + "lightningcss-linux-x64-gnu": "1.16.0", + "lightningcss-linux-x64-musl": "1.16.0", + "lightningcss-win32-x64-msvc": "1.16.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", + "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", + "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", + "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", + "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", + "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", + "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", + "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", + "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lmdb": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.5.4", + "node-addon-api": "^4.3.0", + "node-gyp-build-optional-packages": "5.0.3", + "ordered-binary": "^1.2.4", + "weak-lru-cache": "^1.2.2" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/msgpackr": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/msgpackr/-/msgpackr-1.7.2.tgz", + "integrity": "sha512-mWScyHTtG6TjivXX9vfIy2nBtRupaiAj0HQ2mtmpmYujAmqZmaaEVPaSZ1NKLMvicaMLFzEaMk0ManxMRg8rMQ==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^2.1.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz", + "integrity": "sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.3" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "2.1.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "2.1.2" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", + "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", + "dev": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ordered-binary": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/ordered-binary/-/ordered-binary-1.4.0.tgz", + "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parcel": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/parcel/-/parcel-2.7.0.tgz", + "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.7.0", + "@parcel/core": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/reporter-cli": "2.7.0", + "@parcel/reporter-dev-server": "2.7.0", + "@parcel/utils": "2.7.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0", + "v8-compile-cache": "^2.0.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.10.2", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml/node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pretty-format": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.2.1.tgz", + "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "5.15.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.0.3", + "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmmirror.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xxhash-wasm": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", + "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/core": { + "version": "7.19.6", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.1.tgz", + "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.19.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.19.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "dev": true, + "requires": { + "@babel/types": "^7.19.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.1.tgz", + "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.20.0.tgz", + "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@jest/console/-/console-29.2.1.tgz", + "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/core/-/core-29.2.2.tgz", + "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==", + "dev": true, + "requires": { + "@jest/console": "^29.2.1", + "@jest/reporters": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-resolve-dependencies": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "jest-watcher": "^29.2.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-29.2.2.tgz", + "integrity": "sha512-OWn+Vhu0I1yxuGBJEFFekMYc8aGBGrY4rt47SOh/IFaI+D7ZHCk7pKRiSoZ2/Ml7b0Ony3ydmEHRx/tEOC7H1A==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-mock": "^29.2.2" + } + }, + "@jest/expect": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==", + "dev": true, + "requires": { + "expect": "^29.2.2", + "jest-snapshot": "^29.2.2" + } + }, + "@jest/expect-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.2.2.tgz", + "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/fake-timers": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.2.2.tgz", + "integrity": "sha512-nqaW3y2aSyZDl7zQ7t1XogsxeavNpH6kkdq+EpXncIDvAkjvFD7hmhcIs1nWloengEWUoWqkqSA6MSbf9w6DgA==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.2", + "jest-util": "^29.2.1" + } + }, + "@jest/globals": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-29.2.2.tgz", + "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/types": "^29.2.1", + "jest-mock": "^29.2.2" + } + }, + "@jest/reporters": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.2.2.tgz", + "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.2.1", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.2.1.tgz", + "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", + "dev": true, + "requires": { + "@jest/console": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz", + "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.2.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-29.2.2.tgz", + "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.2.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + } + }, + "@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@lezer/common": { + "version": "0.15.12", + "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-0.15.12.tgz", + "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", + "dev": true + }, + "@lezer/lr": { + "version": "0.15.8", + "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-0.15.8.tgz", + "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", + "dev": true, + "requires": { + "@lezer/common": "^0.15.0" + } + }, + "@lmdb/lmdb-darwin-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", + "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-darwin-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", + "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-linux-arm": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", + "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-linux-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", + "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-linux-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", + "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-win32-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", + "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "dev": true, + "optional": true + }, + "@mischnic/json-sourcemap": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", + "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", + "dev": true, + "requires": { + "@lezer/common": "^0.15.7", + "@lezer/lr": "^0.15.4", + "json5": "^2.2.1" + } + }, + "@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz", + "integrity": "sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz", + "integrity": "sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz", + "integrity": "sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz", + "integrity": "sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz", + "integrity": "sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz", + "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", + "dev": true, + "optional": true + }, + "@parcel/bundler-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", + "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/cache": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/cache/-/cache-2.7.0.tgz", + "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "dev": true, + "requires": { + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/utils": "2.7.0", + "lmdb": "2.5.2" + } + }, + "@parcel/codeframe": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/codeframe/-/codeframe-2.7.0.tgz", + "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/compressor-raw": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", + "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0" + } + }, + "@parcel/config-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/config-default/-/config-default-2.7.0.tgz", + "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", + "dev": true, + "requires": { + "@parcel/bundler-default": "2.7.0", + "@parcel/compressor-raw": "2.7.0", + "@parcel/namer-default": "2.7.0", + "@parcel/optimizer-css": "2.7.0", + "@parcel/optimizer-htmlnano": "2.7.0", + "@parcel/optimizer-image": "2.7.0", + "@parcel/optimizer-svgo": "2.7.0", + "@parcel/optimizer-terser": "2.7.0", + "@parcel/packager-css": "2.7.0", + "@parcel/packager-html": "2.7.0", + "@parcel/packager-js": "2.7.0", + "@parcel/packager-raw": "2.7.0", + "@parcel/packager-svg": "2.7.0", + "@parcel/reporter-dev-server": "2.7.0", + "@parcel/resolver-default": "2.7.0", + "@parcel/runtime-browser-hmr": "2.7.0", + "@parcel/runtime-js": "2.7.0", + "@parcel/runtime-react-refresh": "2.7.0", + "@parcel/runtime-service-worker": "2.7.0", + "@parcel/transformer-babel": "2.7.0", + "@parcel/transformer-css": "2.7.0", + "@parcel/transformer-html": "2.7.0", + "@parcel/transformer-image": "2.7.0", + "@parcel/transformer-js": "2.7.0", + "@parcel/transformer-json": "2.7.0", + "@parcel/transformer-postcss": "2.7.0", + "@parcel/transformer-posthtml": "2.7.0", + "@parcel/transformer-raw": "2.7.0", + "@parcel/transformer-react-refresh-wrap": "2.7.0", + "@parcel/transformer-svg": "2.7.0" + } + }, + "@parcel/core": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/core/-/core-2.7.0.tgz", + "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", + "dev": true, + "requires": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/graph": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.5.4", + "nullthrows": "^1.1.1", + "semver": "^5.7.1" + } + }, + "@parcel/css": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/@parcel/css/-/css-1.14.0.tgz", + "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", + "dev": true, + "requires": { + "lightningcss": "^1.14.0" + } + }, + "@parcel/diagnostic": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", + "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "dev": true, + "requires": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/events": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/events/-/events-2.7.0.tgz", + "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", + "dev": true + }, + "@parcel/fs": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/fs/-/fs-2.7.0.tgz", + "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "dev": true, + "requires": { + "@parcel/fs-search": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/watcher": "^2.0.0", + "@parcel/workers": "2.7.0" + } + }, + "@parcel/fs-search": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/fs-search/-/fs-search-2.7.0.tgz", + "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3" + } + }, + "@parcel/graph": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/graph/-/graph-2.7.0.tgz", + "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", + "dev": true, + "requires": { + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/hash": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/hash/-/hash-2.7.0.tgz", + "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "xxhash-wasm": "^0.4.2" + } + }, + "@parcel/logger": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/logger/-/logger-2.7.0.tgz", + "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0" + } + }, + "@parcel/markdown-ansi": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", + "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/namer-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/namer-default/-/namer-default-2.7.0.tgz", + "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/node-resolver-core": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", + "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "semver": "^5.7.1" + } + }, + "@parcel/optimizer-css": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", + "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", + "dev": true, + "requires": { + "@parcel/css": "^1.12.2", + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1" + } + }, + "@parcel/optimizer-htmlnano": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", + "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" + } + }, + "@parcel/optimizer-image": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", + "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "detect-libc": "^1.0.3" + } + }, + "@parcel/optimizer-svgo": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", + "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "svgo": "^2.4.0" + } + }, + "@parcel/optimizer-terser": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", + "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "terser": "^5.2.0" + } + }, + "@parcel/package-manager": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/package-manager/-/package-manager-2.7.0.tgz", + "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "semver": "^5.7.1" + } + }, + "@parcel/packager-css": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-css/-/packager-css-2.7.0.tgz", + "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/packager-html": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-html/-/packager-html-2.7.0.tgz", + "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + } + }, + "@parcel/packager-js": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-js/-/packager-js-2.7.0.tgz", + "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "dependencies": { + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@parcel/packager-raw": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", + "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0" + } + }, + "@parcel/packager-svg": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", + "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "posthtml": "^0.16.4" + } + }, + "@parcel/packager-ts": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", + "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0" + } + }, + "@parcel/plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/plugin/-/plugin-2.7.0.tgz", + "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", + "dev": true, + "requires": { + "@parcel/types": "2.7.0" + } + }, + "@parcel/reporter-cli": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", + "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "chalk": "^4.1.0", + "term-size": "^2.2.1" + } + }, + "@parcel/reporter-dev-server": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", + "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0" + } + }, + "@parcel/resolver-default": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", + "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", + "dev": true, + "requires": { + "@parcel/node-resolver-core": "2.7.0", + "@parcel/plugin": "2.7.0" + } + }, + "@parcel/runtime-browser-hmr": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", + "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0" + } + }, + "@parcel/runtime-js": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", + "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/runtime-react-refresh": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", + "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + } + }, + "@parcel/runtime-service-worker": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", + "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3" + } + }, + "@parcel/transformer-babel": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", + "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^5.7.0" + } + }, + "@parcel/transformer-css": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", + "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", + "dev": true, + "requires": { + "@parcel/css": "^1.12.2", + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1" + } + }, + "@parcel/transformer-html": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", + "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^5.7.1" + } + }, + "@parcel/transformer-image": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", + "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/transformer-js": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", + "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "@swc/helpers": "^0.4.2", + "browserslist": "^4.6.6", + "detect-libc": "^1.0.3", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^5.7.1" + } + }, + "@parcel/transformer-json": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", + "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "json5": "^2.2.0" + } + }, + "@parcel/transformer-postcss": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", + "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^5.7.1" + } + }, + "@parcel/transformer-posthtml": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", + "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^5.7.1" + } + }, + "@parcel/transformer-raw": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", + "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0" + } + }, + "@parcel/transformer-react-refresh-wrap": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", + "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0", + "@parcel/utils": "2.7.0", + "react-refresh": "^0.9.0" + } + }, + "@parcel/transformer-svg": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", + "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/plugin": "2.7.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^5.7.1" + } + }, + "@parcel/transformer-typescript-types": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", + "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/ts-utils": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/ts-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", + "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", + "dev": true, + "requires": { + "nullthrows": "^1.1.1" + } + }, + "@parcel/types": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/types/-/types-2.7.0.tgz", + "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", + "dev": true, + "requires": { + "@parcel/cache": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/workers": "2.7.0", + "utility-types": "^3.10.0" + } + }, + "@parcel/utils": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/utils/-/utils-2.7.0.tgz", + "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "dev": true, + "requires": { + "@parcel/codeframe": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/markdown-ansi": "2.7.0", + "@parcel/source-map": "^2.0.0", + "chalk": "^4.1.0" + } + }, + "@parcel/watcher": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.0.6.tgz", + "integrity": "sha512-6CaHXp6BNrFY5375OGQLSeaxfO8csgGWbO1U2nUqufDtUks7ZIG5wAyj/wR1zkOxRrhN0EaZWvlgSKYqo7a9lg==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, + "@parcel/workers": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@parcel/workers/-/workers-2.7.0.tgz", + "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "chrome-trace-event": "^1.0.2", + "nullthrows": "^1.1.1" + } + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.4", + "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.4.tgz", + "integrity": "sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@swc/helpers": { + "version": "0.4.12", + "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.4.12.tgz", + "integrity": "sha512-R6RmwS9Dld5lNvwKlPn62+piU+WDG1sMfsnfJioXCciyko/gZ0DQ4Mqglhq1iGU1nQ/RcGkAwfMH+elMSkJH3Q==", + "dev": true, + "requires": { + "tslib": "^2.4.0" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-29.2.1.tgz", + "integrity": "sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/json-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/websocket": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/websocket/-/websocket-1.0.5.tgz", + "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "babel-jest": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.2.2.tgz", + "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==", + "dev": true, + "requires": { + "@jest/transform": "^29.2.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001429", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz", + "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.2.0.tgz", + "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", + "dev": true + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/expect/-/expect-29.2.2.tgz", + "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1" + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "htmlnano": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/htmlnano/-/htmlnano-2.0.2.tgz", + "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.1", + "posthtml": "^0.16.5", + "timsort": "^0.3.0" + } + }, + "htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest/-/jest-29.2.2.tgz", + "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==", + "dev": true, + "requires": { + "@jest/core": "^29.2.2", + "@jest/types": "^29.2.1", + "import-local": "^3.0.2", + "jest-cli": "^29.2.2" + } + }, + "jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.2.2.tgz", + "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/expect": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-runtime": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-cli": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.2.2.tgz", + "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==", + "dev": true, + "requires": { + "@jest/core": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-29.2.2.tgz", + "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.2.2", + "@jest/types": "^29.2.1", + "babel-jest": "^29.2.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.2.2", + "jest-environment-node": "^29.2.2", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-runner": "^29.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.2.1.tgz", + "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.2.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + } + }, + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-29.2.1.tgz", + "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.2.1", + "pretty-format": "^29.2.1" + } + }, + "jest-environment-node": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.2.2.tgz", + "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-mock": "^29.2.2", + "jest-util": "^29.2.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-haste-map": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.2.1.tgz", + "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.2.1", + "jest-worker": "^29.2.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", + "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + } + }, + "jest-matcher-utils": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz", + "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.2.1" + } + }, + "jest-message-util": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.2.1.tgz", + "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.2.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.2.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.2.2.tgz", + "integrity": "sha512-1leySQxNAnivvbcx0sCB37itu8f4OX2S/+gxLAV4Z62shT4r4dTG9tACDywUAEZoLSr36aYUTsVp3WKwWt4PMQ==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "jest-util": "^29.2.1" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true + }, + "jest-resolve": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.2.2.tgz", + "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.2.1", + "jest-validate": "^29.2.2", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz", + "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==", + "dev": true, + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.2.2" + } + }, + "jest-runner": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.2.2.tgz", + "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==", + "dev": true, + "requires": { + "@jest/console": "^29.2.1", + "@jest/environment": "^29.2.2", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.2.2", + "jest-haste-map": "^29.2.1", + "jest-leak-detector": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-resolve": "^29.2.2", + "jest-runtime": "^29.2.2", + "jest-util": "^29.2.1", + "jest-watcher": "^29.2.2", + "jest-worker": "^29.2.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + } + }, + "jest-runtime": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.2.2.tgz", + "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==", + "dev": true, + "requires": { + "@jest/environment": "^29.2.2", + "@jest/fake-timers": "^29.2.2", + "@jest/globals": "^29.2.2", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.2.1", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.2.1", + "jest-message-util": "^29.2.1", + "jest-mock": "^29.2.2", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.2.2", + "jest-snapshot": "^29.2.2", + "jest-util": "^29.2.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.2.2.tgz", + "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.2.2", + "@jest/transform": "^29.2.2", + "@jest/types": "^29.2.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.2.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.2.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.2.1", + "jest-matcher-utils": "^29.2.2", + "jest-message-util": "^29.2.1", + "jest-util": "^29.2.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.2.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.2.2.tgz", + "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==", + "dev": true, + "requires": { + "@jest/types": "^29.2.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.2.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "29.2.2", + "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.2.2.tgz", + "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==", + "dev": true, + "requires": { + "@jest/test-result": "^29.2.1", + "@jest/types": "^29.2.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.2.1", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lightningcss": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.16.0.tgz", + "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "lightningcss-darwin-arm64": "1.16.0", + "lightningcss-darwin-x64": "1.16.0", + "lightningcss-linux-arm-gnueabihf": "1.16.0", + "lightningcss-linux-arm64-gnu": "1.16.0", + "lightningcss-linux-arm64-musl": "1.16.0", + "lightningcss-linux-x64-gnu": "1.16.0", + "lightningcss-linux-x64-musl": "1.16.0", + "lightningcss-win32-x64-msvc": "1.16.0" + } + }, + "lightningcss-darwin-arm64": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", + "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", + "dev": true, + "optional": true + }, + "lightningcss-darwin-x64": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", + "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm-gnueabihf": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", + "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm64-gnu": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", + "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm64-musl": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", + "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", + "dev": true, + "optional": true + }, + "lightningcss-linux-x64-gnu": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", + "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", + "dev": true, + "optional": true + }, + "lightningcss-linux-x64-musl": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", + "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", + "dev": true, + "optional": true + }, + "lightningcss-win32-x64-msvc": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", + "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", + "dev": true, + "optional": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lmdb": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "dev": true, + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", + "msgpackr": "^1.5.4", + "node-addon-api": "^4.3.0", + "node-gyp-build-optional-packages": "5.0.3", + "ordered-binary": "^1.2.4", + "weak-lru-cache": "^1.2.2" + }, + "dependencies": { + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "msgpackr": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/msgpackr/-/msgpackr-1.7.2.tgz", + "integrity": "sha512-mWScyHTtG6TjivXX9vfIy2nBtRupaiAj0HQ2mtmpmYujAmqZmaaEVPaSZ1NKLMvicaMLFzEaMk0ManxMRg8rMQ==", + "dev": true, + "requires": { + "msgpackr-extract": "^2.1.2" + } + }, + "msgpackr-extract": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz", + "integrity": "sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==", + "dev": true, + "optional": true, + "requires": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "2.1.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "2.1.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "2.1.2", + "node-gyp-build-optional-packages": "5.0.3" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" + }, + "node-gyp-build-optional-packages": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", + "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ordered-binary": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/ordered-binary/-/ordered-binary-1.4.0.tgz", + "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parcel": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/parcel/-/parcel-2.7.0.tgz", + "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", + "dev": true, + "requires": { + "@parcel/config-default": "2.7.0", + "@parcel/core": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/reporter-cli": "2.7.0", + "@parcel/reporter-dev-server": "2.7.0", + "@parcel/utils": "2.7.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0", + "v8-compile-cache": "^2.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "requires": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "dependencies": { + "posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "requires": { + "htmlparser2": "^7.1.1" + } + } + } + }, + "posthtml-parser": { + "version": "0.10.2", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", + "dev": true, + "requires": { + "htmlparser2": "^7.1.1" + } + }, + "posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "requires": { + "is-json": "^2.0.1" + } + }, + "pretty-format": { + "version": "29.2.1", + "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.2.1.tgz", + "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, + "terser": { + "version": "5.15.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-jest": { + "version": "29.0.3", + "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmmirror.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "xxhash-wasm": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", + "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/nodejs/package.json b/nodejs/package.json new file mode 100644 index 0000000..2ce63d0 --- /dev/null +++ b/nodejs/package.json @@ -0,0 +1,57 @@ +{ + "name": "@tdengine/websocket", + "version": "3.0.0", + "description": "TDengine Connector for nodejs and browser using WebSocket.", + "source": "index.ts", + "main": "dist/index.js", + "module": "dist/module/index.mjs", + "types": "dist/index.d.ts", + "directories": { + "example": "example", + "test": "test" + }, + "scripts": { + "test": "jest --coverage", + "example": "tsc && node dist/example/basicSql.js", + "build": "tsc", + "watch": "parcel watch", + "prepare": "parcel build", + "prepublish": "npm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/taosdata/taos-connector-node.git" + }, + "keywords": [ + "WebSocket", + "taosdata", + "taos", + "IOT", + "TypeScript", + "TDengine", + "database" + ], + "author": "TaosData Inc.", + "license": "MIT", + "bugs": { + "url": "https://github.com/taosdata/taos-connector-node/issues" + }, + "homepage": "https://github.com/taosdata/taos-connector-node#readme", + "dependencies": { + "json-bigint": "^1.0.0", + "websocket": "^1.0.34" + }, + "devDependencies": { + "@parcel/packager-ts": "^2.7.0", + "@parcel/transformer-typescript-types": "^2.7.0", + "@types/jest": "^29.2.1", + "@types/json-bigint": "^1.0.1", + "@types/node": "^18.0.0", + "@types/websocket": "^1.0npm install async-mutex.5", + "jest": "^29.2.2", + "parcel": "^2.7.0", + "ts-jest": "^29.0.3", + "typescript": "^5.3.3", + "async-mutex": "^0.5.0" + } +} diff --git a/nodejs/readme.md b/nodejs/readme.md new file mode 100644 index 0000000..ff55f80 --- /dev/null +++ b/nodejs/readme.md @@ -0,0 +1,59 @@ +# WebSocket APIs + +## Bulk Pulling + +### DSN + +User can connect to the TDengine by passing DSN to WebSocket client. The description about the DSN like before. + +```text +[+]://[[:@]:][/][?=[&=]] +|------------|---|-----------|-----------|------|------|------------|-----------------------| +| protocol | | username | password | host | port | database | params | +``` + +- **protocol**: Display using websocket protocol to establish connection. eg. `ws://localhost:6041` +- **username/password**: Database's username and password. +- **host/port**: Declare host and port. eg. `localhost:6041` +- **database**: Optional, use to specify database name. +- **params**: Other parameters. Like cloud Token. + +A complete DSN string example: + +```text +ws://localhost:6041/test +``` + +### Basic Usage + +``` typescript +import {connect} from '@tdengine/websocket' +let dsn = "ws://host:port/rest/ws/db" +// create an instance of taoWS, while the returned websocket connection of the returned instance 'ws' may is not in 'OPEN' status +var ws = connect(dsn) +``` + +``` typescript +// build connect with tdengine +ws.connect().then(connectRes=>console.log(connectRes)).catch(e=>{/*do some thing to handle error*/}) +``` + +``` typescript +//query data with SQL +ws.query(sql).then(taosResult=>{console.log(taosResult)}).catch(e=>{/*do some thing to handle error*/}) +``` + +```typescript +// get client version +ws.version().then(version=>console.log(version)).catch(e=>{/*do some thing to handle error*/}) +``` + +``` typescript +// get current WebSocket connection status +let status:number = ws.status() +``` + +``` typescript +// close current WebSocket connection +ws.close(); +``` \ No newline at end of file diff --git a/nodejs/src/client/wsClient.ts b/nodejs/src/client/wsClient.ts new file mode 100644 index 0000000..fa07041 --- /dev/null +++ b/nodejs/src/client/wsClient.ts @@ -0,0 +1,291 @@ +import JSONBig from 'json-bigint'; +import { WebSocketConnector } from './wsConnector'; +import { WebSocketConnectionPool } from './wsConnectorPool' +import { parseBlock, MessageResp, TaosResult } from '../common/taosResult'; +import { ErrorCode, TDWebSocketClientError, WebSocketInterfaceError, WebSocketQueryError } from '../common/wsError'; +import { + WSVersionResponse, + WSFetchBlockResponse, + WSQueryResponse, + WSFetchResponse, +} from './wsResponse'; +import { ReqId } from '../common/reqid'; + + +export class WsClient { + private _wsConnector?: WebSocketConnector; + private _req_id = 1000000; + private _timeout?:number | undefined | null; + private _url:URL; + + constructor(url: URL, timeout ?:number | undefined | null) { + this.checkURL(url); + this._url = url; + this._timeout = timeout; + + } + + connect(database?: string | undefined | null): Promise { + let _db = this._url.pathname.split('/')[3]; + if (database) { + _db = database; + } + + let connMsg = { + action: 'conn', + args: { + req_id: ReqId.getReqID(), + user: this._url.username, + password: this._url.password, + db: _db, + }, + }; + + return new Promise(async (resolve, reject) => { + try { + this._wsConnector = await WebSocketConnectionPool.Instance().getConnection(this._url, this._timeout); + if (this._wsConnector.readyState() > 0) { + resolve() + } else { + await this._wsConnector.Ready(); + let result:any = await this._wsConnector.sendMsg(JSON.stringify(connMsg)) + if (result.msg.code == 0) { + resolve(); + }else { + reject(new WebSocketQueryError(result.msg.code, result.msg.message)); + } + } + + } catch(e:any) { + reject(e) + } + + }); + } + + execNoResp(queryMsg: string): Promise { + return new Promise((resolve, reject) => { + console.log('[wsQueryInterface.query.queryMsg]===>' + queryMsg); + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendMsgNoResp(queryMsg) + .then(() => {resolve();}) + .catch((e) => reject(e)); + }else{ + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")) + } + + }); + } + + // need to construct Response. + exec(queryMsg: string, bSqlQurey:boolean = true): Promise { + return new Promise((resolve, reject) => { + // console.log('[wsQueryInterface.query.queryMsg]===>' + queryMsg); + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendMsg(queryMsg).then((e: any) => { + if (e.msg.code == 0) { + if (bSqlQurey) { + resolve(new WSQueryResponse(e)); + }else{ + resolve(e) + } + } else { + reject(new WebSocketInterfaceError(e.msg.code, e.msg.message)); + } + }).catch((e) => {reject(e);}); + } else { + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")) + } + + }); + } + + + // need to construct Response. + sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, bSqlQurey:boolean = true): Promise { + return new Promise((resolve, reject) => { + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendBinaryMsg(reqId, action, message).then((e: any) => { + if (e.msg.code == 0) { + if (bSqlQurey) { + resolve(new WSQueryResponse(e)); + }else{ + resolve(e) + } + } else { + reject(new WebSocketInterfaceError(e.msg.code, e.msg.message)); + } + }).catch((e) => {reject(e);}); + } else { + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")) + } + + }); + } + + + getState() { + if (this._wsConnector) { + return this._wsConnector.readyState(); + } + return -1; + + } + + Ready(): Promise { + return new Promise(async (resolve, reject) => { + try { + this._wsConnector = await WebSocketConnectionPool.Instance().getConnection(this._url, this._timeout); + if (this._wsConnector.readyState() <= 0) { + await this._wsConnector.Ready() + } + console.log("ready status ", this._url, this._wsConnector.readyState()) + resolve() + }catch(e: any) { + reject(e) + } + }); + } + + fetch(res: WSQueryResponse): Promise { + let fetchMsg = { + action: 'fetch', + args: { + req_id: ReqId.getReqID(), + id: res.id, + }, + }; + // console.log("[wsQueryInterface.fetch()]===>wsQueryResponse\n") + // console.log(res) + return new Promise((resolve, reject) => { + let jsonStr = JSONBig.stringify(fetchMsg); + console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendMsg(jsonStr).then((e: any) => { + if (e.msg.code == 0) { + resolve(new WSFetchResponse(e)); + } else { + reject(new WebSocketInterfaceError(e.msg.code, e.msg.message)); + } + }).catch((e) => {reject(e);}); + } else { + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")); + } + + }); + } + + fetchBlock(fetchResponse: WSFetchResponse, taosResult: TaosResult): Promise { + let fetchBlockMsg = { + action: 'fetch_block', + args: { + req_id: ReqId.getReqID(), + id: fetchResponse.id, + }, + }; + + return new Promise((resolve, reject) => { + let jsonStr = JSONBig.stringify(fetchBlockMsg); + // console.log("[wsQueryInterface.fetchBlock.fetchBlockMsg]===>" + jsonStr) + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendMsg(jsonStr).then((e: any) => { + let resp:MessageResp = e + taosResult.AddtotalTime(resp.totalTime) + resolve(parseBlock(fetchResponse.rows, new WSFetchBlockResponse(resp.msg), taosResult)); + // if retrieve JSON then reject with message + // else is binary , so parse raw block to TaosResult + }).catch((e) => reject(e)); + } else { + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")); + } + }); + } + + sendMsg(msg:string): Promise { + return new Promise((resolve, reject) => { + // console.log("[wsQueryInterface.sendMsg]===>" + msg) + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendMsg(msg).then((e: any) => { + resolve(e); + }).catch((e) => reject(e)); + } else { + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")); + } + }); + } + + freeResult(res: WSQueryResponse) { + let freeResultMsg = { + action: 'free_result', + args: { + req_id: ReqId.getReqID(), + id: res.id, + }, + }; + return new Promise((resolve, reject) => { + let jsonStr = JSONBig.stringify(freeResultMsg); + // console.log("[wsQueryInterface.freeResult.freeResultMsg]===>" + jsonStr) + if (this._wsConnector && this._wsConnector.readyState() > 0) { + this._wsConnector.sendMsg(jsonStr, false) + .then((e: any) => {resolve(e);}) + .catch((e) => reject(e)); + } else { + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")); + } + }); + } + + version(): Promise { + let versionMsg = { + action: 'version', + args: { + req_id: ReqId.getReqID() + }, + }; + return new Promise(async (resolve, reject) => { + if (this._wsConnector) { + try { + if (this._wsConnector.readyState() <= 0) { + await this._wsConnector.Ready() + } + let resoult:any = await this._wsConnector.sendMsg(JSONBig.stringify(versionMsg)); + if (resoult.msg.code == 0) { + resolve(new WSVersionResponse(resoult).version); + } else { + reject(new WebSocketInterfaceError(resoult.msg.code, resoult.msg.message)); + } + } catch (e:any) { + reject(e); + } + } + }); + } + + close() { + if (this._wsConnector) { + WebSocketConnectionPool.Instance().releaseConnection(this._wsConnector) + this._wsConnector = undefined + // this._wsConnector.close(); + } + + } + + checkURL(url: URL) { + // Assert is cloud url + if (!url.searchParams.has('token')) { + if (!(url.username || url.password)) { + throw new WebSocketInterfaceError(ErrorCode.ERR_INVALID_AUTHENTICATION, 'invalid url, password or username needed.'); + } + } + } + + // private getReqID() { + // return ReqId.getReqID() + // // if (this._req_id == 1999999) { + // // this._req_id = 1000000; + // // } else { + // // this._req_id += 1; + // // } + // // return this._req_id; + // } +} diff --git a/nodejs/src/client/wsConnector.ts b/nodejs/src/client/wsConnector.ts new file mode 100644 index 0000000..ae650dd --- /dev/null +++ b/nodejs/src/client/wsConnector.ts @@ -0,0 +1,156 @@ +import { ICloseEvent, w3cwebsocket } from 'websocket'; +import { ErrorCode, TDWebSocketClientError, WebSocketQueryError } from '../common/wsError' +import { OnMessageType, WsEventCallback } from './wsEventCallback'; + + +export class WebSocketConnector { + private _wsConn: w3cwebsocket; + private _wsURL: URL; + _timeout = 5000; + + // create ws + constructor(url: URL, timeout :number | undefined | null) { + // return w3bsocket3 + if (url) { + this._wsURL = url; + let origin = url.origin; + let pathname = url.pathname; + let search = url.search; + if (timeout) { + this._timeout = timeout + } + this._wsConn = new w3cwebsocket(origin.concat(pathname).concat(search)); + this._wsConn.onerror = function (err: Error) { console.log(err.message); throw err } + + this._wsConn.onclose = this._onclose + + this._wsConn.onmessage = this._onmessage + this._wsConn._binaryType = "arraybuffer" + } else { + throw new WebSocketQueryError(ErrorCode.ERR_INVALID_URL, "websocket URL must be defined") + } + } + + Ready(): Promise { + return new Promise((resolve, reject) => { + this._wsConn.onopen = () => { + console.log("websocket connection opened") + resolve(this); + } + }) + } + + private _onclose(e: ICloseEvent) { + return new Promise((resolve, reject) => { + resolve("websocket connection closed") + }) + } + + + private _onmessage(event: any) { + let data = event.data; + console.log("wsClient._onMessage()===="+ (Object.prototype.toString.call(data))) + if (Object.prototype.toString.call(data) === '[object ArrayBuffer]') { + let id = new DataView(data, 8, 8).getBigUint64(0, true); + WsEventCallback.Instance().HandleEventCallback({id:id, action:'', req_id:BigInt(0)}, + OnMessageType.MESSAGE_TYPE_ARRAYBUFFER, data); + + } else if (Object.prototype.toString.call(data) === '[object Blob]') { + data.arrayBuffer().then((d: ArrayBuffer) => { + let id = new DataView(d, 8, 8).getBigUint64(0, true); + WsEventCallback.Instance().HandleEventCallback({id:id, action:'', req_id:BigInt(0)}, + OnMessageType.MESSAGE_TYPE_BLOB, d); + }) + + } else if (Object.prototype.toString.call(data) === '[object String]') { + let msg = JSON.parse(data) + console.log("[_onmessage.stringType]==>:" + data); + WsEventCallback.Instance().HandleEventCallback({id:BigInt(0), action:msg.action, req_id:msg.req_id}, + OnMessageType.MESSAGE_TYPE_STRING, msg); + } else { + throw new TDWebSocketClientError(ErrorCode.ERR_INVALID_MESSAGE_TYPE, + `invalid message type ${Object.prototype.toString.call(data)}`); + } + } + + close() { + if (this._wsConn) { + this._wsConn.close(); + } else { + throw new TDWebSocketClientError(ErrorCode.ERR_WEBSOCKET_CONNECTION, "WebSocket connection is undefined.") + } + } + + readyState(): number { + return this._wsConn.readyState; + } + + sendMsgNoResp(message: string):Promise { + console.log("[wsClient.sendMsgNoResp()]===>" + message) + let msg = JSON.parse(message); + if (msg.args.id !== undefined) { + msg.args.id = BigInt(msg.args.id) + } + + return new Promise((resolve, reject) => { + if (this._wsConn && this._wsConn.readyState > 0) { + this._wsConn.send(message) + resolve() + } else { + reject(new WebSocketQueryError(ErrorCode.ERR_WEBSOCKET_CONNECTION, + `WebSocket connection is not ready,status :${this._wsConn?.readyState}`)) + } + }) + } + + + sendMsg(message: string, register: Boolean = true) { + console.log("[wsClient.sendMessage()]===>" + message) + let msg = JSON.parse(message); + if (msg.args.id !== undefined) { + msg.args.id = BigInt(msg.args.id) + } + + return new Promise((resolve, reject) => { + if (this._wsConn && this._wsConn.readyState > 0) { + if (register) { + WsEventCallback.Instance().RegisterCallback({ action: msg.action, req_id: msg.args.req_id, + timeout:this._timeout, id: msg.args.id === undefined ? msg.args.id : BigInt(msg.args.id) }, + resolve, reject); + } + console.log("[wsClient.sendMessage.msg]===>\n", message) + this._wsConn.send(message) + } else { + reject(new WebSocketQueryError(ErrorCode.ERR_WEBSOCKET_CONNECTION, + `WebSocket connection is not ready,status :${this._wsConn?.readyState}`)) + } + }) + } + + sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, register: Boolean = true) { + + return new Promise((resolve, reject) => { + if (this._wsConn && this._wsConn.readyState > 0) { + if (register) { + WsEventCallback.Instance().RegisterCallback({ action: action, req_id: reqId, + timeout:this._timeout, id: reqId}, + resolve, reject); + } + console.log("[wsClient.sendBinaryMsg()]===>" + reqId, action, message.byteLength) + this._wsConn.send(message) + } else { + reject(new WebSocketQueryError(ErrorCode.ERR_WEBSOCKET_CONNECTION, + `WebSocket connection is not ready,status :${this._wsConn?.readyState}`)) + } + }) + } + + public configTimeout(ms: number) { + this._timeout = ms; + } + + public getWsURL(): URL { + return this._wsURL; + } +} + diff --git a/nodejs/src/client/wsConnectorPool.ts b/nodejs/src/client/wsConnectorPool.ts new file mode 100644 index 0000000..8f7b01a --- /dev/null +++ b/nodejs/src/client/wsConnectorPool.ts @@ -0,0 +1,112 @@ +import { Mutex } from "async-mutex"; +import { WebSocketConnector } from "./wsConnector"; +import { ErrorCode, TDWebSocketClientError } from "../common/wsError"; + +const mutex = new Mutex(); +export class WebSocketConnectionPool { + private static _instance?:WebSocketConnectionPool; + private pool: Map = new Map(); + private _connectionCount: number; + private _maxConnections: number; + private constructor(maxConnections: number = -1) { + this._maxConnections = maxConnections; + this._connectionCount = 0; + } + + public static Instance(maxConnections: number = -1):WebSocketConnectionPool { + if (!WebSocketConnectionPool._instance) { + WebSocketConnectionPool._instance = new WebSocketConnectionPool(maxConnections); + } + return WebSocketConnectionPool._instance; + } + + async getConnection(url:URL, timeout: number | undefined | null): Promise { + let connectAddr = url.origin.concat(url.pathname).concat(url.search) + let connector:WebSocketConnector | undefined; + const unlock = await mutex.acquire() + try { + if (this.pool.has(connectAddr)) { + let connectors = this.pool.get(connectAddr); + if (connectors) { + if (connectors.length > 0) { + connector = connectors.pop(); + } + } + } + + if (connector) { + console.log("get connection success:", this._connectionCount) + return connector; + } + if (this._maxConnections != -1 && this._connectionCount > this._maxConnections) { + throw new TDWebSocketClientError(ErrorCode.ERR_WEBSOCKET_CONNECTION_ARRIVED_LIMIT, "websocket connect arrived limite:" + this._connectionCount) + } + + this._connectionCount++ + return new WebSocketConnector(url, timeout); + }finally{ + unlock() + } + } + + async releaseConnection(connector: WebSocketConnector) { + if (connector) { + const unlock = await mutex.acquire(); + try { + if (connector.readyState() > 0) { + let url = connector.getWsURL(); + let connectAddr = url.origin.concat(url.pathname).concat(url.search) + let connectors = this.pool.get(connectAddr); + if (!connectors) { + connectors = new Array(); + connectors.push(connector); + this.pool.set(connectAddr, connectors); + + } else { + connectors.push(connector); + } + } else { + this._connectionCount--; + connector.close() + } + } finally { + unlock(); + } + } + } + + Destroyed() { + if (this.pool) { + for (let values of this.pool.values()) { + for (let i in values ) { + values.pop()?.close(); + } + } + } + console.log("destroyed connect:" + this._connectionCount) + this._connectionCount = 0 + this.pool = new Map() + } +} + + +process.on('beforeExit', (code) => { + console.log("begin destroy connect") + WebSocketConnectionPool.Instance().Destroyed() +}); + +process.on('SIGINT', () => { + console.log('Received SIGINT. Press Control-D to exit.'); + console.log("begin destroy connect") + WebSocketConnectionPool.Instance().Destroyed() + process.exit() +}); + +process.on('SIGTERM', () => { + console.log('Received SIGINT. Press Control-D to exit.'); + console.log("begin destroy connect") + WebSocketConnectionPool.Instance().Destroyed() + process.exit() +}); + +// process.kill(process.pid, 'SIGINT'); \ No newline at end of file diff --git a/nodejs/src/client/wsEventCallback.ts b/nodejs/src/client/wsEventCallback.ts new file mode 100644 index 0000000..9cd951c --- /dev/null +++ b/nodejs/src/client/wsEventCallback.ts @@ -0,0 +1,102 @@ +import { Mutex } from "async-mutex"; +import { ErrorCode, TDWebSocketClientError, WebSocketQueryError } from "../common/wsError"; +import { MessageResp } from "../common/taosResult"; + +interface MessageId { + action: string, + req_id: bigint, + id?: bigint, + timeout?:number +} + +interface MessageAction { + reject: Function, + resolve: Function, + timer: ReturnType, + sendTime: number, +} + +export enum OnMessageType { + MESSAGE_TYPE_ARRAYBUFFER = 1, + MESSAGE_TYPE_BLOB = 2, + MESSAGE_TYPE_STRING = 3, +} + +const eventMutex = new Mutex(); +export class WsEventCallback { + private static _instance?:WsEventCallback; + private static _msgActionRegister: Map = new Map(); + private constructor() { + } + + public static Instance():WsEventCallback { + if (!WsEventCallback._instance) { + WsEventCallback._instance = new WsEventCallback(); + } + return WsEventCallback._instance; + } + + async RegisterCallback(id: MessageId, res: (args: unknown) => void, rej: (reason: any) => void) { + let release = await eventMutex.acquire() + try { + WsEventCallback._msgActionRegister.set(id, + { + sendTime: new Date().getTime(), + reject: rej, + resolve: res, + timer: setTimeout(() => rej(new WebSocketQueryError(ErrorCode.ERR_WEBSOCKET_QUERY_TIMEOUT, + `action:${id.action},req_id:${id.req_id} timeout with ${id.timeout} milliseconds`)), id.timeout) + }); + } finally { + release() + } + } + + async HandleEventCallback(msg: MessageId, messageType:OnMessageType, data:any) { + let action: MessageAction | any = undefined; + + // console.log("HandleEventCallback msg=", msg, messageType) + let release = await eventMutex.acquire() + // console.log("HandleEventCallback get lock msg=", msg, messageType) + // console.log(WsEventCallback._msgActionRegister) + try { + for (let [k, v] of WsEventCallback._msgActionRegister) { + if (messageType == OnMessageType.MESSAGE_TYPE_ARRAYBUFFER) { + if (k.id == msg.id || k.req_id == msg.id) { + action = v + WsEventCallback._msgActionRegister.delete(k) + break; + } + } else if (messageType == OnMessageType.MESSAGE_TYPE_BLOB) { + if (k.id == msg.id || k.req_id == msg.id) { + action = v + WsEventCallback._msgActionRegister.delete(k) + break; + } + }else if (messageType == OnMessageType.MESSAGE_TYPE_STRING) { + if (k.req_id == msg.req_id && k.action == msg.action) { + action = v + WsEventCallback._msgActionRegister.delete(k) + break; + } + } + } + } finally { + release() + } + + if (action) { + let currTime = new Date().getTime() + let resp:MessageResp = { + msg:data, + totalTime:Math.abs(currTime - action.sendTime), + }; + action.resolve(resp); + } else { + console.log("no find callback msg:=", msg) + throw new TDWebSocketClientError(ErrorCode.ERR_WS_NO_CALLBACK, + "no callback registered for fetch_block with req_id=" + msg.req_id + " action" + msg.action); + } + } + +} \ No newline at end of file diff --git a/nodejs/src/client/wsResponse.ts b/nodejs/src/client/wsResponse.ts new file mode 100644 index 0000000..d96915c --- /dev/null +++ b/nodejs/src/client/wsResponse.ts @@ -0,0 +1,123 @@ +/** + * define ws Response type|class, for query? + */ + +import { MessageResp } from "../common/taosResult"; + +export class WSVersionResponse { + version: string; + code: number; + message: string; + action: string; + totalTime: number; + constructor(resp:MessageResp) { + this.version = resp.msg.version; + this.code = resp.msg.code; + this.message = resp.msg.message; + this.action = resp.msg.action; + this.totalTime = resp.totalTime; + } +} + +export class WSQueryResponse { + code?: number; + message?: string; + action?: string; + req_id?: number; + timing?: bigint | null; + totalTime: number; + id?: bigint; + is_update?: boolean; + affected_rows?: number | null; + fields_count?: number | null; + fields_names?: Array | null; + fields_types?: Array | null; + fields_lengths?: Array | null; + precision?: number; + + constructor(resp:MessageResp) { + this.totalTime = resp.totalTime + this.initMsg(resp.msg) + } + private initMsg(msg:any) { + this.code = msg.code; + this.message = msg.message; + this.action = msg.action; + this.req_id = msg.req_id; + this.timing = BigInt(msg.timing); + if (msg.id) { + this.id = BigInt(msg.id); + }else{ + this.id = BigInt(0) + } + + this.is_update = msg.is_update; + this.affected_rows = msg.affected_rows; + this.fields_count = msg.fields_count; + this.fields_names = msg.fields_names; + this.fields_types = msg.fields_types; + this.fields_lengths = msg.fields_lengths; + this.precision = msg.precision; + } +} + +export class WSFetchResponse { + code: number; + message: string; + action: string; + req_id: number; + timing: bigint; + id: bigint; + completed: boolean; + length: Array; + rows: number; + totalTime: number; + constructor(resp:MessageResp) { + this.totalTime = resp.totalTime + this.code = resp.msg.code; + this.message = resp.msg.message; + this.action = resp.msg.action; + this.req_id = resp.msg.req_id; + this.timing = BigInt(resp.msg.timing); + this.id = BigInt(resp.msg.id); + this.completed = resp.msg.completed; + this.length = resp.msg.length; + this.rows = resp.msg.rows; + } +} + +export class WSFetchBlockResponse { + + id: bigint + data: ArrayBuffer + timing: bigint + constructor(msg: ArrayBuffer) { + this.timing = new DataView(msg, 0, 8).getBigUint64(0, true) + this.id = new DataView(msg, 8, 8).getBigUint64(0, true) + this.data = msg.slice(16) + } +} + +interface IWSConnResponse { + code: number; + message: string; + action: string; + req_id: number; + timing: bigint; +} + +export class WSConnResponse { + code: number; + message: string; + action: string; + req_id: number; + timing: bigint; + + constructor(msg: IWSConnResponse) { + this.code = msg.code; + this.message = msg.message; + this.action = msg.action; + this.req_id = msg.req_id; + this.timing = BigInt(msg.timing); + } +} diff --git a/nodejs/src/common/config.ts b/nodejs/src/common/config.ts new file mode 100644 index 0000000..e77d337 --- /dev/null +++ b/nodejs/src/common/config.ts @@ -0,0 +1,50 @@ +export class WSConfig { + private _user: string | undefined | null; + private _password: string | undefined | null; + private _db: string | undefined | null; + private _url: string; + private _timeout:number| undefined | null; + + + constructor(url:string) { + this._url = url; + } + + public GetUser(): string | undefined | null { + return this._user; + } + public SetUser(user: string) { + this._user = user; + } + + public GetPwd(): string | undefined | null { + return this._password; + } + public SetPwd(pws:string) { + this._password = pws; + } + + public GetDb(): string | undefined | null { + return this._db; + } + public SetDb(db: string) { + this._db = db; + } + + public GetUrl(): string { + return this._url; + } + + public SetUrl(url: string) { + this._url = url; + } + + public SetTimeOut(ms : number) { + this._timeout = ms + } + public GetTimeOut(): number | undefined | null { + return this._timeout + } + + +} diff --git a/nodejs/src/common/constant.ts b/nodejs/src/common/constant.ts new file mode 100644 index 0000000..ac7bbfe --- /dev/null +++ b/nodejs/src/common/constant.ts @@ -0,0 +1,86 @@ +export interface IndexableString { + [index: number]: string +} + +export interface StringIndexable { + [index: string]: number +} + +export const TDengineTypeName: IndexableString = { + 0: 'NULL', + 1: 'BOOL', + 2: 'TINYINT', + 3: 'SMALLINT', + 4: 'INT', + 5: 'BIGINT', + 6: 'FLOAT', + 7: 'DOUBLE', + 8: 'VARCHAR', + 9: 'TIMESTAMP', + 10: 'NCHAR', + 11: 'TINYINT UNSIGNED', + 12: 'SMALLINT UNSIGNED', + 13: 'INT UNSIGNED', + 14: 'BIGINT UNSIGNED', + 15: 'JSON', + 16: 'VARBINARY', + 20: 'GEOMETRY', +} + +export const ColumnsBlockType: StringIndexable = { + 'SOLID': 0, + 'VARCHAR': 1, + 'NCHAR': 2, + 'GEOMETRY': 3, + 'VARBINARY':4, +} + + +export const TDengineTypeCode: StringIndexable = { + 'NULL': 0, + 'BOOL': 1, + 'TINYINT': 2, + 'SMALLINT': 3, + 'INT': 4, + 'BIGINT': 5, + 'FLOAT': 6, + 'DOUBLE': 7, + 'BINARY': 8, + 'VARCHAR': 8, + 'TIMESTAMP': 9, + 'NCHAR': 10, + 'TINYINT UNSIGNED': 11, + 'SMALLINT UNSIGNED': 12, + 'INT UNSIGNED': 13, + 'BIGINT UNSIGNED': 14, + 'JSON': 15, + 'VARBINARY': 16, + 'GEOMETRY': 20, +} + +export const TDenginePrecision: IndexableString = { + 0: 'MILLISECOND', + 1: "MICROSECOND", + 2: "NANOSECOND", +} + +export const TDengineTypeLength: StringIndexable = { + 'BOOL': 1, + 'TINYINT': 1, + 'SMALLINT': 2, + 'INT': 4, + 'BIGINT': 8, + 'FLOAT': 4, + 'DOUBLE': 8, + 'TIMESTAMP': 8, + 'TINYINT UNSIGNED': 1, + 'SMALLINT UNSIGNED': 2, + 'INT UNSIGNED': 4, + 'BIGINT UNSIGNED': 8, +} + +export const PrecisionLength: StringIndexable = { + 'ms': 13, + 'us': 16, + 'ns': 19 +} diff --git a/nodejs/src/common/reqid.ts b/nodejs/src/common/reqid.ts new file mode 100644 index 0000000..c03a87d --- /dev/null +++ b/nodejs/src/common/reqid.ts @@ -0,0 +1,61 @@ +import { createHash } from 'crypto'; +import { v4 as uuidv4 } from 'uuid'; +import { pid } from 'node:process'; + +function hexStringToNumber(hexString: string): number { + const number = parseInt(hexString, 16); + if (isNaN(number)) { + throw new Error(`number ${hexString} parse int fail!`); + } + return number; +} + +function uuidToHash(): number { + let uuid = uuidv4(); + // create SHA-256 hash + const hash = createHash('sha256'); + + // update hash contact + hash.update(uuid); + + // get hex hash code + const strHex = hash.digest('hex').substring(0, 8); + + let hex = hexStringToNumber(strHex) + return hex & 0xff; +} + +export class ReqId { + private static _uuid = 0; + private static _pid = 0 + private static sharedBuffer = new SharedArrayBuffer(4); + private static int32View = new Int32Array(ReqId.sharedBuffer); + static { + this._uuid = uuidToHash(); + + if (pid) { + this._pid = pid & 0xf + }else{ + this._pid = (Math.floor(Math.random() * 9000) + 1000) & 0xf; + } + + Atomics.store(ReqId.int32View, 0, 0); + } + + public static getReqID(req_id?:number):number { + if (req_id) { + return req_id; + } + let no = Atomics.add(ReqId.int32View, 0, 1) + const buffer = new ArrayBuffer(8); + const view = new DataView(buffer); + let ts = new Date().getTime() >> 8 + view.setUint8(6, this._uuid >> 4); + view.setUint8(5, (this._uuid & 0x0f) << 4 | this._pid); + view.setUint8(4, ts >> 16 & 0xff); + view.setUint16(2, ts & 0xffff, true); + view.setUint16(0, no & 0xffff, true) + let id = view.getBigInt64(0, true) + return Number(id); + } +} \ No newline at end of file diff --git a/nodejs/src/common/taosResult.ts b/nodejs/src/common/taosResult.ts new file mode 100644 index 0000000..bf4c2ff --- /dev/null +++ b/nodejs/src/common/taosResult.ts @@ -0,0 +1,466 @@ +import { WSFetchBlockResponse, WSQueryResponse } from "../client/wsResponse"; +import { ColumnsBlockType, TDengineTypeCode, TDengineTypeName } from './constant' +import { ErrorCode, TaosResultError, WebSocketQueryInterFaceError } from "./wsError"; +import { AppendRune } from "./ut8Helper" + +export interface TDengineMeta { + name: string, + type: string, + length: number, +} + +interface ResponseMeta { + name: string, + type: number, + length: number, +} + +export interface MessageResp { + totalTime: number, + msg:any, +} + +export class TaosResult { + private _meta: Array | null; + private _data: Array> | null; + + private _precision: number | null | undefined; + protected _affectRows: number | null | undefined; + private _totalTime = 0; + /** unit nano seconds */ + private _timing: bigint | null | undefined; + constructor(queryResponse?: WSQueryResponse) { + if (queryResponse == null) { + this._meta = null + this._data = null + this._timing = BigInt(0) + return + } + if (queryResponse.is_update == true) { + this._meta = null + this._data = null + } else { + if (queryResponse.fields_count && queryResponse.fields_names && queryResponse.fields_types && queryResponse.fields_lengths) { + let _meta = []; + for (let i = 0; i < queryResponse.fields_count; i++) { + _meta.push({ + name: queryResponse.fields_names[i], + type: queryResponse.fields_types[i], + length: queryResponse.fields_lengths[i] + }) + } + this._meta = _meta; + } else { + throw new TaosResultError(ErrorCode.ERR_INVALID_FETCH_MESSAGE_DATA, + `fields_count,fields_names,fields_types,fields_lengths of the update query response should be null`) + } + this._data = []; + } + + this._affectRows = queryResponse.affected_rows + this._timing = queryResponse.timing + this._precision = queryResponse.precision + this._totalTime = queryResponse.totalTime + // console.log(`typeof this.timing:${typeof this.timing}, typeof fetchResponse.timing:${typeof queryResponse.timing}`) + } + + public SetRowsAndTime(rows: number, timing?:bigint) { + if (this._affectRows) { + this._affectRows += rows; + }else{ + this._affectRows = rows + } + if (timing) { + this.SetTiming(timing) + } + + } + + public GetMeta(): Array | null { + return this.getTDengineMeta(); + } + + public GetData(): Array> | null { + return this._data; + } + public SetData(value: Array> | null) { + this._data = value; + } + public GetAffectRows(): number | null | undefined { + return this._affectRows; + } + + public GetTaosMeta(): Array | null { + return this._meta; + } + + public GetPrecision():number | null | undefined { + return this._precision; + } + public GetTotalTime() { + return this._totalTime; + } + public AddtotalTime(totalTime:number) { + this._totalTime += totalTime; + } + + public SetTiming(timing?: bigint) { + if (!this._timing) { + this._timing = BigInt(0) + } + + if (timing) { + this._timing = this._timing + timing + } + } + /** + * Mapping the WebSocket response type code to TDengine's type name. + */ + private getTDengineMeta(): Array | null { + if (this._meta) { + let tdMeta = new Array() + this._meta.forEach(m => { + tdMeta.push({ + name: m.name, + type: TDengineTypeName[m.type], + length: m.length + }) + }) + return tdMeta; + } + return null; + } +} + +export function parseBlock(rows: number, blocks: WSFetchBlockResponse, taosResult: TaosResult): TaosResult { + let metaList = taosResult.GetTaosMeta() + let dataList = taosResult.GetData() + if (metaList && dataList) { + // console.log(typeof taosResult.timing) + // console.log(typeof blocks.timing) + // console.log(blocks.id) + taosResult.SetTiming(blocks.timing) + const INT_32_SIZE = 4; + + // Offset num of bytes from rawBlockBuffer. + let bufferOffset = (4 * 5) + 8 + (4 + 1) * metaList.length + let colLengthBlockSize = INT_32_SIZE * metaList.length + // console.log("===colLengthBlockSize:" + colLengthBlockSize) + + let bitMapSize = (rows + (1 << 3) - 1) >> 3 + + // whole raw block ArrayBuffer + let dataBuffer = blocks.data.slice(bufferOffset); + + // record the head of column in block + let colBlockHead = 0; + for (let i = 0; i < rows; i++) { + let row = []; + // point to the head of the column in the block + colBlockHead = 0 + colLengthBlockSize; + // point to the head of columns's data in the block (include bitMap and offsetArray) + let colDataHead = colBlockHead; + // traverse row after row. + for (let j = 0; j < metaList.length; j++) { + + let isVarType = _isVarType(metaList[j]) + // console.log("== dataBuffer Length:" + dataBuffer.byteLength) + // console.log("== loop i:" + i + "J=" + j + "col:" + metaList[j].name + "type:" + metaList[j].type) + // console.log("== loop isVarType:" + isVarType); + if (isVarType == ColumnsBlockType.SOLID) { + + colDataHead = colBlockHead + bitMapSize + metaList[j].length * i + + let byteArrayIndex = i >> 3; + let bitwiseOffset = 7 - (i & 7) + let bitMapArr = dataBuffer.slice(colBlockHead, colBlockHead + bitMapSize) + // console.log("==i:" + i + "byteArrayIndex=" + byteArrayIndex) + // console.log("== loop colblockhead:" + colBlockHead) + // console.log("== loop bitmap:" + bitMapSize) + // console.log("== loop bitMap length=" + bitMapArr.byteLength) + // console.log("==loop bitMap bitwiseoffset:" + bitwiseOffset + "byteArrayIndex:" + byteArrayIndex) + let bitFlag = ((new DataView(bitMapArr).getUint8(byteArrayIndex)) & (1 << bitwiseOffset)) >> bitwiseOffset + + if (bitFlag == 1) { + row.push("NULL") + } else { + row.push(readSolidData(dataBuffer, colDataHead, metaList[j])) + } + // console.log("=====(new DataView(dataBuffer, INT_32_SIZE * j, INT_32_SIZE).getInt32(0))=" + (new DataView(dataBuffer, INT_32_SIZE * j, INT_32_SIZE).getInt32(0, true))); + colBlockHead = colBlockHead + bitMapSize + (new DataView(dataBuffer, INT_32_SIZE * j, INT_32_SIZE).getInt32(0, true)) + + } else { + // if null check + let varOffset = new DataView(dataBuffer, colBlockHead + (INT_32_SIZE * i), INT_32_SIZE).getInt32(0, true) + // console.log("== var type offset:" + varOffset) + if (varOffset == -1) { + row.push("NULL") + colBlockHead = colBlockHead + INT_32_SIZE * rows + (new DataView(dataBuffer, j * INT_32_SIZE, INT_32_SIZE).getInt32(0, true)) + } else { + colDataHead = colBlockHead + INT_32_SIZE * rows + varOffset + let dataLength = (new DataView(dataBuffer, colDataHead, 2).getInt16(0, true)) + // console.log("== loop var type length:" + dataLength, isVarType) + if (isVarType == ColumnsBlockType.VARCHAR) { + row.push(readVarchar(dataBuffer, colDataHead + 2, dataLength)) + } else if(isVarType == ColumnsBlockType.GEOMETRY || isVarType == ColumnsBlockType.VARBINARY) { + row.push(readBinary(dataBuffer, colDataHead + 2, dataLength)) + } else { + row.push(readNchar(dataBuffer, colDataHead + 2, dataLength)) + } + colBlockHead = colBlockHead + INT_32_SIZE * rows + (new DataView(dataBuffer, j * INT_32_SIZE, INT_32_SIZE).getInt32(0, true)) + } + } + } + dataList.push(row); + } + return taosResult; + } else { + throw new TaosResultError(ErrorCode.ERR_INVALID_FETCH_MESSAGE_DATA , + "cannot fetch block for an update query.") + } +} + +export function _isVarType(meta: ResponseMeta): Number { + switch (meta.type) { + case TDengineTypeCode['NCHAR']: { + return ColumnsBlockType['NCHAR'] + } + case TDengineTypeCode['VARCHAR']: { + return ColumnsBlockType['VARCHAR'] + } + case TDengineTypeCode['BINARY']: { + return ColumnsBlockType['VARCHAR'] + } + case TDengineTypeCode['JSON']: { + return ColumnsBlockType['VARCHAR'] + } + case TDengineTypeCode['GEOMETRY']: { + return ColumnsBlockType['GEOMETRY'] + } + case TDengineTypeCode['VARBINARY']: { + return ColumnsBlockType['VARBINARY'] + } + default: { + return ColumnsBlockType['SOLID'] + } + } +} +export function readSolidDataToArray(buffer: ArrayBuffer, colBlockHead:number, + rows:number, meta: ResponseMeta, bitMapArr: ArrayBuffer): any[] { + + let dataBuffer = new DataView(buffer) + let result:any[] = [] + switch (meta.type) { + case TDengineTypeCode['BOOL']: + case TDengineTypeCode['TINYINT']: + case TDengineTypeCode['TINYINT UNSIGNED']:{ + for (let i = 0; i < rows; i++, colBlockHead++) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getInt8(colBlockHead)); + } + + } + break; + } + case TDengineTypeCode['SMALLINT']: { + for (let i = 0; i < rows; i++, colBlockHead+=2) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getInt16(colBlockHead, true)); + } + } + break; + } + case TDengineTypeCode['INT']: { + for (let i = 0; i < rows; i++, colBlockHead+=4) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getInt32(colBlockHead, true)); + } + } + break; + } + case TDengineTypeCode['BIGINT']: { + for (let i = 0; i < rows; i++, colBlockHead+=8) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getBigInt64(colBlockHead, true)); + } + } + break; + } + case TDengineTypeCode['SMALLINT UNSIGNED']: { + for (let i = 0; i < rows; i++, colBlockHead+=2) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getUint16(colBlockHead, true)); + } + } + break; + } + case TDengineTypeCode['INT UNSIGNED']: { + for (let i = 0; i < rows; i++, colBlockHead+=4) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getUint32(colBlockHead, true)); + } + } + break; + } + case TDengineTypeCode['BIGINT UNSIGNED']: { + for (let i = 0; i < rows; i++, colBlockHead+=8) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getBigUint64(colBlockHead, true)); + } + } + break; + } + case TDengineTypeCode['FLOAT']: { + for (let i = 0; i < rows; i++, colBlockHead+=4) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(parseFloat(dataBuffer.getFloat32(colBlockHead, true).toFixed(5))); + } + } + break; + } + case TDengineTypeCode['DOUBLE']: { + + for (let i = 0; i < rows; i++, colBlockHead += 8) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(parseFloat(dataBuffer.getFloat64(colBlockHead, true).toFixed(15))); + } + } + break; + } + case TDengineTypeCode['TIMESTAMP']: { + for (let i = 0; i < rows; i++, colBlockHead += 8) { + if (isNull(bitMapArr, i)) { + result.push(null); + }else{ + result.push(dataBuffer.getBigInt64(colBlockHead, true)); + } + } + break; + } + default: { + throw new WebSocketQueryInterFaceError(ErrorCode.ERR_UNSPPORTED_TDENGINE_TYPE, `unspported type ${meta.type} for column ${meta.name}`) + } + } + return result; + +} +export function readSolidData(dataBuffer: ArrayBuffer, colDataHead: number, meta: ResponseMeta): Number | Boolean | BigInt { + + switch (meta.type) { + case TDengineTypeCode['BOOL']: { + return (Boolean)(new DataView(dataBuffer, colDataHead, 1).getInt8(0)) + } + case TDengineTypeCode['TINYINT']: { + return (new DataView(dataBuffer, colDataHead, 1).getInt8(0)) + } + case TDengineTypeCode['SMALLINT']: { + return (new DataView(dataBuffer, colDataHead, 2).getInt16(0, true)) + } + case TDengineTypeCode['INT']: { + return (new DataView(dataBuffer, colDataHead, 4).getInt32(0, true)) + } + case TDengineTypeCode['BIGINT']: { + return (new DataView(dataBuffer, colDataHead, 8).getBigInt64(0, true)) + } + case TDengineTypeCode['TINYINT UNSIGNED']: { + return (new DataView(dataBuffer, colDataHead, 1).getUint8(0)) + } + case TDengineTypeCode['SMALLINT UNSIGNED']: { + return (new DataView(dataBuffer, colDataHead, 2).getUint16(0, true)) + } + case TDengineTypeCode['INT UNSIGNED']: { + return (new DataView(dataBuffer, colDataHead, 4).getUint32(0, true)) + } + case TDengineTypeCode['BIGINT UNSIGNED']: { + return (new DataView(dataBuffer, colDataHead, 8).getBigUint64(0, true)) + } + case TDengineTypeCode['FLOAT']: { + return (parseFloat(new DataView(dataBuffer, colDataHead, 4).getFloat32(0, true).toFixed(5)) ) + } + case TDengineTypeCode['DOUBLE']: { + return (parseFloat(new DataView(dataBuffer, colDataHead, 8).getFloat64(0, true).toFixed(15))) + } + case TDengineTypeCode['TIMESTAMP']: { + return (new DataView(dataBuffer, colDataHead, 8).getBigInt64(0, true)) + // could change + } + default: { + throw new WebSocketQueryInterFaceError(ErrorCode.ERR_UNSPPORTED_TDENGINE_TYPE, `unspported type ${meta.type} for column ${meta.name}`) + } + } +} + +export function readBinary(dataBuffer: ArrayBuffer, colDataHead: number, length: number): ArrayBuffer { + let buff = dataBuffer.slice(colDataHead, colDataHead + length) + return buff +} + +export function readVarchar(dataBuffer: ArrayBuffer, colDataHead: number, length: number): string { + let data = ""; + let buff = dataBuffer.slice(colDataHead, colDataHead + length) + data += new TextDecoder().decode(buff) + return data; +} + +export function readNchar(dataBuffer: ArrayBuffer, colDataHead: number, length: number): string { + let decoder = new TextDecoder(); + let data = ""; + let buff: ArrayBuffer = dataBuffer.slice(colDataHead, colDataHead + length); + for (let i = 0; i < length / 4; i++) { + // console.log("== readNchar data:" + new DataView(buff, i * 4, 4).getUint32(0, true)) + data += AppendRune(new DataView(buff, i * 4, 4).getUint32(0, true)) + + } + return data; +} + + +function iteratorBuff(arr: ArrayBuffer) { + let buf = Buffer.from(arr); + for (const value of buf) { + console.log(value.toString()) + } + +} + +function isNull(bitMapArr:ArrayBuffer, n:number) { + let c = new Uint8Array(bitMapArr); + let position = n >>> 3; + let index = n & 0x7; + return (c[position] & (1 << (7 - index))) == (1 << (7 - index)); +} + + +export function CharOffset(n:number):number { + return n >> 3 +} + +export function BMSetNull(c:number, n:number):number { + return c + (1 << (7 - BitPos(n))) +} + +function BitPos(n:number):number { + return n & ((1 << 3) - 1) +} + +export function BitmapLen(n: number): number { + return ((n) + ((1 << 3) - 1)) >> 3 +} \ No newline at end of file diff --git a/nodejs/src/common/ut8Helper.ts b/nodejs/src/common/ut8Helper.ts new file mode 100644 index 0000000..954bd17 --- /dev/null +++ b/nodejs/src/common/ut8Helper.ts @@ -0,0 +1,42 @@ +// Numbers fundamental to the encoding. +// the "error" Rune or "Unicode replacement character" +const RuneError = '\uFFFD' +// Maximum valid Unicode code point. +const MaxRune = '\U0010FFFF' +// Code points in the surrogate range are not valid for UTF-8. +const surrogateMin = 0xD800 +const surrogateMax = 0xDFFF +const tx = 128; +const t2 = 192; +const t3 = 224; +const t4 = 240; +const maskx = 63; +const rune1Max = (1 << 7) - 1; + +const rune2Max = (1 << 11) - 1; +const rune3Max = (1 << 16) - 1; + + +// AppendRune appends the UTF-8 encoding of r to the end of p and +// returns the extended buffer. If the rune is out of range, +// it appends the encoding of RuneError. +export function AppendRune(r:any) { + let p:Array = []; + // console.log("== AppendRun r:"); + // console.log(r) + if (r <= rune1Max) { + p.push(r & 0xff); + return Buffer.from(p).toString(); + } + if (r <= rune2Max) { + p.push(t2 | ((r >> 6) & 0xff), tx | (r & 0xff) & maskx) + } else if ((r > MaxRune) || (surrogateMax <= r && r <= surrogateMax)) { + p.push(RuneError) + } else if (r <= rune3Max) { + p.push(t3 | ((r >> 12) & 0xff), tx | ((r >> 6) & 0xff) & maskx, tx | (r & 0xff) & maskx) + } else { + p.push(t4 | ((r >> 18) & 0xff), tx | ((r >> 12) & 0xff) & maskx, tx | ((r >> 6) & 0xff) & maskx, tx | (r & 0xff) & maskx) + } + + return Buffer.from(p).toString(); +} \ No newline at end of file diff --git a/nodejs/src/common/utils.ts b/nodejs/src/common/utils.ts new file mode 100644 index 0000000..6edb6b7 --- /dev/null +++ b/nodejs/src/common/utils.ts @@ -0,0 +1,25 @@ +import { WSConfig } from "./config"; + +export function GetUrl(wsConfig:WSConfig):URL { + let url = new URL(wsConfig.GetUrl()) + if (wsConfig.GetUser()) { + url.username = wsConfig.GetUser() || '' + } + if (wsConfig.GetPwd()) { + url.password = wsConfig.GetPwd() || '' + } + return url +} + +export function Sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + + +export function IsEmpty(value: any): boolean { + if (value === null || value === undefined) return true; + // if (typeof value === 'string' && value.trim() === '') return true; + if (Array.isArray(value) && value.length === 0) return true; + // if (typeof value === 'object' && Object.keys(value).length === 0) return true; + return false; +} \ No newline at end of file diff --git a/nodejs/src/common/wsError.ts b/nodejs/src/common/wsError.ts new file mode 100644 index 0000000..ce6d77f --- /dev/null +++ b/nodejs/src/common/wsError.ts @@ -0,0 +1,37 @@ +export class TDWebSocketClientError extends Error { + code:number = 0; + constructor(code:number, message: string = '') { + super(message); + this.name = new.target.name; + this.code = code + if (typeof (Error as any).captureStackTrace === 'function') { + (Error as any).captureStackTrace(this, new.target); + } + if (typeof Object.setPrototypeOf === 'function') { + Object.setPrototypeOf(this, new.target.prototype); + } else { + (this as any).__proto__ = new.target.prototype; + } + } +} +export class WebSocketQueryError extends TDWebSocketClientError { } +export class WebSocketInterfaceError extends TDWebSocketClientError {} +export class WebSocketQueryInterFaceError extends WebSocketInterfaceError{} +export class TaosResultError extends TDWebSocketClientError{}; +export class TaosError extends TDWebSocketClientError{}; + +export enum ErrorCode { + ERR_INVALID_PARAMS = 100, + ERR_INVALID_URL = 101, + ERR_WS_NO_CALLBACK = 102, + ERR_INVALID_MESSAGE_TYPE = 103, + ERR_WEBSOCKET_CONNECTION = 104, + ERR_WEBSOCKET_QUERY_TIMEOUT = 105, + ERR_INVALID_AUTHENTICATION = 106, + ERR_UNSPPORTED_TDENGINE_TYPE = 107, + ERR_CONNECTION_CLOSED = 108, + ERR_INVALID_FETCH_MESSAGE_DATA = 109, + ERR_PARTITIONS_TOPIC_VGROUP_LENGTH_NOT_EQUAL = 110, + ERR_WEBSOCKET_CONNECTION_ARRIVED_LIMIT = 105, +} + diff --git a/nodejs/src/common/wsOptions.ts b/nodejs/src/common/wsOptions.ts new file mode 100644 index 0000000..b29fbe5 --- /dev/null +++ b/nodejs/src/common/wsOptions.ts @@ -0,0 +1,14 @@ +export interface User { + user?: string; + passwd?: string; +} + +export interface Uri { + scheme: string; + url?: string; + host?: string | undefined | null; + path: '/rest/sql/' | string; + port?: number | undefined | null; + query?: { [key: string]: string }; + fragment?: string | undefined | null; +} diff --git a/nodejs/src/sql/wsProto.ts b/nodejs/src/sql/wsProto.ts new file mode 100644 index 0000000..d071c7a --- /dev/null +++ b/nodejs/src/sql/wsProto.ts @@ -0,0 +1,28 @@ +export interface SchemalessMessageInfo { + action: string; + args: SchemalessParamsInfo; +} + +export interface SchemalessParamsInfo { + req_id?: number | undefined | null; + protocol: number; + ttl?: number; + precision: string; + data: string; +} + +export enum Precision { + NOT_CONFIGURED = '', + HOURS = 'h', + MINUTES = 'm', + SECONDS = 's', + MILLI_SECONDS = 'ms', + MICRO_SECONDS = 'u', + NANO_SECONDS = 'ns', +} + +export const enum SchemalessProto { + InfluxDBLineProtocol = 1, + OpenTSDBTelnetLineProtocol = 2, + OpenTSDBJsonFormatProtocol = 3 +} \ No newline at end of file diff --git a/nodejs/src/sql/wsRows.ts b/nodejs/src/sql/wsRows.ts new file mode 100644 index 0000000..9a10c5f --- /dev/null +++ b/nodejs/src/sql/wsRows.ts @@ -0,0 +1,82 @@ +import { TDengineMeta, TaosResult } from '../common/taosResult'; +import { TaosResultError } from '../common/wsError'; +import { WSQueryResponse } from '../client/wsResponse'; +import { WsClient } from '../client/wsClient'; + +export class WSRows { + private _wsClient: WsClient; + private _wsQueryResponse: WSQueryResponse; + private _taosResult: TaosResult; + private _isClose : boolean; + constructor(wsInterface: WsClient, resp: WSQueryResponse) { + this._wsClient = wsInterface; + this._wsQueryResponse = resp; + this._taosResult = new TaosResult(resp); + this._isClose = false + } + + async Next(): Promise { + if (this._wsQueryResponse.is_update == true || this._isClose) { + console.log("WSRows::Next::End=>", this._taosResult, this._isClose) + return false; + } + + let data = this._taosResult.GetData(); + if (this._taosResult && data != null) { + if (data && Array.isArray(this._taosResult.GetData()) && data.length > 0) { + return true; + } + } + + this._taosResult = await this.getBlockData(); + if (this._taosResult.GetData() == null) { + return false; + } + return true; + } + + private async getBlockData():Promise { + try { + let wsFetchResponse = await this._wsClient.fetch(this._wsQueryResponse); + console.log("[wsQuery.execute.wsFetchResponse]==>\n", wsFetchResponse) + if (wsFetchResponse.completed == true) { + this.Close(); + this._taosResult.SetData(null); + } else { + this._taosResult.SetRowsAndTime(wsFetchResponse.rows, wsFetchResponse.timing); + return await this._wsClient.fetchBlock(wsFetchResponse, this._taosResult); + } + return this._taosResult; + }catch(err:any){ + this.Close(); + throw new TaosResultError(err.code, err.message); + } + } + + GetMeta():Array | null { + return this._taosResult.GetMeta(); + } + + GetData(): Array | undefined { + if (this._wsQueryResponse.is_update == true) { + return undefined; + } + + let data = this._taosResult.GetData(); + if (this._taosResult && data != null) { + if (Array.isArray(data) && data.length > 0) { + return data.pop(); + } + } + return undefined; + } + + Close() { + if (this._isClose) { + return + } + this._isClose = true + this._wsClient.freeResult(this._wsQueryResponse) + } + +} diff --git a/nodejs/src/sql/wsSql.ts b/nodejs/src/sql/wsSql.ts new file mode 100644 index 0000000..049c65a --- /dev/null +++ b/nodejs/src/sql/wsSql.ts @@ -0,0 +1,184 @@ +import { WSRows } from './wsRows' +import { TaosResult } from '../common/taosResult' +import { WsClient } from '../client/wsClient' +import { ErrorCode, TDWebSocketClientError, TaosResultError, WebSocketInterfaceError } from '../common/wsError' +import { WSConfig } from '../common/config' +import { GetUrl } from '../common/utils' +import { WSQueryResponse } from '../client/wsResponse' +import { Precision, SchemalessMessageInfo, SchemalessProto } from './wsProto' +import { WsStmt } from '../stmt/wsStmt' +import { ReqId } from '../common/reqid' +import { PrecisionLength } from '../common/constant' + +export class WsSql{ + private wsConfig:WSConfig; + private _wsClient: WsClient; + constructor(wsConfig:WSConfig) { + let url = GetUrl(wsConfig); + this._wsClient = new WsClient(url, wsConfig.GetTimeOut()); + this.wsConfig = wsConfig; + } + + static Open(wsConfig:WSConfig):Promise { + if (!wsConfig.GetUrl()) { + throw new WebSocketInterfaceError(ErrorCode.ERR_INVALID_URL, 'invalid url, password or username needed.'); + } + let wsSql = new WsSql(wsConfig); + return wsSql.open(wsConfig.GetDb()) + } + + State(){ + return this._wsClient.getState(); + } + + /** + * return client version. + */ + Version(): Promise { + return this._wsClient.version() + } + + Query(sql:string, req_id?:number):Promise{ + return this.query(sql, req_id) + } + + Exec(sql:string, req_id?: number):Promise{ + return this.execute(sql, req_id) + } + Close() { + this._wsClient.close(); + } + + SchemalessInsert(lines: Array, protocol: SchemalessProto, precision: Precision, ttl: number, reqId?: number): Promise { + let data = ''; + if (!lines || lines.length == 0 || !protocol) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsSchemaless Insert params is error!'); + } + + lines.forEach((element, index) => { + data += element; + if (index < lines.length - 1) { + data += '\n'; + } + }); + + let queryMsg = { + action: 'insert', + args: { + req_id : ReqId.getReqID(reqId), + protocol: protocol, + precision: precision, + data: data, + ttl: ttl, + }, + }; + return this.executeSchemalessInsert(queryMsg); + } + + StmtInit(reqId?:number): Promise { + return new Promise(async (resolve, reject) => { + if (this._wsClient) { + try{ + let precision = PrecisionLength["ms"]; + if (this.wsConfig.GetDb()) { + let sql = "select `precision` from information_schema.ins_databases where name = '" + this.wsConfig.GetDb() + "'"; + let result = await this.Exec(sql); + let data =result.GetData() + + if (data && data[0] && data[0][0]) { + precision = PrecisionLength[data[0][0]] + } + } + let wsStmt = await WsStmt.NewStmt(this._wsClient, precision, reqId); + resolve(wsStmt); + } catch(e) { + console.log(e) + reject(e); + } + }else{ + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed")); + } + }); + } + + private open(database:string | null | undefined):Promise { + return new Promise(async (resolve, reject) => { + try { + await this._wsClient.connect(database); + if(database && database.length > 0) { + await this.execute(`use ${database}`) + } + resolve(this) + } catch(e) { + reject(e) + } + }) + } + + async execute(sql: string, reqId?: number, action:string = 'query'): Promise { + try { + let wsQueryResponse:WSQueryResponse = await this._wsClient.exec(this.getSql(sql, reqId, action)); + let taosResult = new TaosResult(wsQueryResponse); + if (wsQueryResponse.is_update == true) { + return taosResult; + } else { + try{ + while (true) { + let wsFetchResponse = await this._wsClient.fetch(wsQueryResponse) + if (wsFetchResponse.completed == true) { + break; + } else { + taosResult.SetRowsAndTime(wsFetchResponse.rows, wsFetchResponse.timing); + let tmp: TaosResult = await this._wsClient.fetchBlock(wsFetchResponse, taosResult); + taosResult = tmp; + } + } + return taosResult; + } catch(e){ + let err :any = e + throw new TaosResultError(err.code, err.message); + } finally { + this._wsClient.freeResult(wsQueryResponse) + } + } + } catch(e) { + let err :any = e + throw new TaosResultError(err.code, err.message); + } + } + + private async executeSchemalessInsert(queryMsg: SchemalessMessageInfo): Promise { + return new Promise(async (resolve, reject) => { + try { + let reqMsg = JSON.stringify(queryMsg); + await this._wsClient.exec(reqMsg); + resolve(); + } catch (e:any) { + reject(new TaosResultError(e.code, e.message)); + } + }); + } + + async query(sql: string, reqId?:number): Promise { + try { + let wsQueryResponse:WSQueryResponse = await this._wsClient.exec(this.getSql(sql, reqId)); + return new WSRows(this._wsClient, wsQueryResponse); + } catch (e) { + let err :any = e + throw new TaosResultError(err.code, err.message); + } + + } + private getSql(sql:string, reqId?:number, action:string = 'query'):string{ + // construct msg + let queryMsg = { + action: action, + args: { + req_id: ReqId.getReqID(reqId), + sql: sql, + id: 0 + }, + } + return JSON.stringify(queryMsg) + } +} \ No newline at end of file diff --git a/nodejs/src/stmt/wsParams.ts b/nodejs/src/stmt/wsParams.ts new file mode 100644 index 0000000..1b0915e --- /dev/null +++ b/nodejs/src/stmt/wsParams.ts @@ -0,0 +1,465 @@ +import { PrecisionLength, TDengineTypeCode, TDengineTypeLength } from "../common/constant"; +import { ErrorCode, TaosError } from "../common/wsError"; +import { CharOffset, BMSetNull, BitmapLen} from "../common/taosResult" +import { IsEmpty } from "../common/utils"; + +export class ColumnInfo { + data:ArrayBuffer; + length:number; + type:number; + typeLen:number; + constructor([length,data]:[number, ArrayBuffer], type:number, typeLen:number) { + this.data = data; + this.type = type; + this.length = length; + this.typeLen = typeLen; + } +} + +export class StmtBindParams { + private precisionLength:number = PrecisionLength['ms'] + private _params: ColumnInfo[]; + private _dataTotalLen:number = 0; + private _rows = 0; + constructor(precision?:number) { + if (precision) { + this.precisionLength = precision + } + this._params = []; + + } + + public GetDataRows(): number { + return this._rows; + } + + public GetDataTotalLen(): number { + return this._dataTotalLen; + } + + public GetParams(): ColumnInfo[] { + return this._params; + } + + SetBooleanColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBooleanColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "boolean", TDengineTypeLength['BOOL'], TDengineTypeCode['BOOL']) + + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['BOOL'], TDengineTypeLength['BOOL'])) ; + } + + SetTinyIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetTinyIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['TINYINT'], TDengineTypeCode['TINYINT']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['TINYINT'], TDengineTypeLength['TINYINT'])); + } + + SetUTinyIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetUTinyIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['TINYINT UNSIGNED'], TDengineTypeCode['TINYINT UNSIGNED']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['TINYINT UNSIGNED'], TDengineTypeLength['TINYINT UNSIGNED'])); + } + + SetSmallIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetSmallIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['SMALLINT'], TDengineTypeCode['SMALLINT']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['SMALLINT'], TDengineTypeLength['SMALLINT'])); + + } + + SetUSmallIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetSmallIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['SMALLINT UNSIGNED'], TDengineTypeCode['SMALLINT UNSIGNED']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['SMALLINT UNSIGNED'], TDengineTypeLength['SMALLINT UNSIGNED'])); + } + + SetIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['INT'], TDengineTypeCode['INT']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['INT'], TDengineTypeLength['INT'])); + } + + SetUIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetUIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['INT UNSIGNED'], TDengineTypeCode['INT UNSIGNED']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['INT UNSIGNED'], TDengineTypeLength['INT UNSIGNED'])); + } + + SetBigIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBigIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "bigint", TDengineTypeLength['BIGINT'], TDengineTypeCode['BIGINT']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['INT'], TDengineTypeLength['BIGINT'])); + } + + SetUBigIntColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetUBigIntColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "bigint", TDengineTypeLength['BIGINT UNSIGNED'], TDengineTypeCode['BIGINT UNSIGNED']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['BIGINT UNSIGNED'], TDengineTypeLength['BIGINT UNSIGNED'])); + } + + SetFloatColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetFloatColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['FLOAT'], TDengineTypeCode['FLOAT']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['FLOAT'], TDengineTypeLength['FLOAT'])); + } + + SetDoubleColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetDoubleColumn params is invalid!"); + } + let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['DOUBLE'], TDengineTypeCode['DOUBLE']) + this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['DOUBLE'], TDengineTypeLength['DOUBLE'])); + } + + SetVarcharColumn(params :any[]) { + let data = this.encodeVarLengthColumn(params) + this._params.push(new ColumnInfo(data, TDengineTypeCode['VARCHAR'], 0)); + } + + SetBinaryColumn(params :any[]) { + this._params.push(new ColumnInfo(this.encodeVarLengthColumn(params), TDengineTypeCode['BINARY'], 0)); + } + + SetNcharColumn(params :any[]) { + this._params.push(new ColumnInfo(this.encodeNcharColumn(params), TDengineTypeCode['NCHAR'], 0)); + } + + SetJsonColumn(params :any[]) { + this._params.push(new ColumnInfo(this.encodeVarLengthColumn(params), TDengineTypeCode['JSON'], 0)); + } + + SetVarBinaryColumn(params :any[]) { + this._params.push(new ColumnInfo(this.encodeVarLengthColumn(params), TDengineTypeCode['VARBINARY'], 0)); + } + + SetGeometryColumn(params :any[]) { + this._params.push(new ColumnInfo(this.encodeVarLengthColumn(params), TDengineTypeCode['GEOMETRY'], 0)); + } + + SetTimestampColumn(params :any[]) { + if (!params || params.length == 0) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params is invalid!"); + } + + //computing bitmap length + let bitMapLen:number = BitmapLen(params.length) + //Computing the length of data + let arrayBuffer = new ArrayBuffer(bitMapLen + TDengineTypeLength['TIMESTAMP'] * params.length); + //bitmap get data range + let bitmapBuffer = new DataView(arrayBuffer) + //skip bitmap get data range + let dataBuffer = new DataView(arrayBuffer, bitMapLen) + if (this._rows > 0) { + if (this._rows !== params.length) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "wrong row length!") + } + }else { + this._rows = params.length; + } + + for (let i = 0; i < params.length; i++) { + if (!IsEmpty(params[i])) { + if (params[i] instanceof Date) { + let date:Date = params[i] + //node only support milliseconds, need fill 0 + if (this.precisionLength == PrecisionLength['us']) { + let ms = date.getMilliseconds() * 1000 + dataBuffer.setBigInt64(i * 8, BigInt(ms), true); + }else if (this.precisionLength == PrecisionLength['ns']) { + let ns = date.getMilliseconds() * 1000 * 1000 + dataBuffer.setBigInt64(i * 8, BigInt(ns), true); + }else { + dataBuffer.setBigInt64(i * 8, BigInt(date.getMilliseconds()), true); + } + + } else if (typeof params[i] == 'bigint' || typeof params[i] == 'number') { + + let data:bigint + if (typeof params[i] == 'number') { + data = BigInt(params[i]) + }else { + data = params[i] + } + //statistical bits of digit + let ndigit = this.countBigintDigits(data) + //check digit same table Precision + if (this.precisionLength == PrecisionLength['ns']) { + if (this.precisionLength <= ndigit) { + dataBuffer.setBigInt64(i * 8, data, true); + } else { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params precisionLength is invalid! param:=" + params[i]) + } + } else if (this.precisionLength == ndigit) { + dataBuffer.setBigInt64(i * 8, data, true); + } else { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params is invalid! param:=" + params[i]) + } + } + }else{ + //set bitmap bit is null + let charOffset = CharOffset(i); + let nullVal = BMSetNull(dataBuffer.getInt8(charOffset), i); + bitmapBuffer.setInt8(charOffset, nullVal); + } + } + + this._dataTotalLen += arrayBuffer.byteLength; + this._params.push(new ColumnInfo([TDengineTypeLength['TIMESTAMP'] * params.length, arrayBuffer], TDengineTypeCode['TIMESTAMP'], TDengineTypeLength['TIMESTAMP'])); + } + + + private encodeColumnNumbers(params:any[], dataType:string = 'number', typeLen:number, columnType:number):[number, ArrayBuffer] { + let bitMapLen:number = BitmapLen(params.length) + let arrayBuffer = new ArrayBuffer(typeLen * params.length + bitMapLen); + let bitmapBuffer = new DataView(arrayBuffer) + let dataBuffer = new DataView(arrayBuffer, bitMapLen) + if (this._rows > 0) { + if (this._rows !== params.length) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "wrong row length!") + } + }else { + this._rows = params.length; + } + + for (let i = 0; i < params.length; i++) { + if (!IsEmpty(params[i])) { + // console.log("ddddd=>", bitMapLen, typeLen * params.length, columnType, params[i]) + if (typeof params[i] == dataType) { + switch (columnType) { + case TDengineTypeCode['BOOL']: { + if (params[i]) { + dataBuffer.setInt8(i, 1); + } else { + dataBuffer.setInt8(i, 0); + } + break; + } + case TDengineTypeCode['TINYINT']: { + dataBuffer.setInt8(i, params[i]); + break; + } + case TDengineTypeCode['TINYINT UNSIGNED']: { + dataBuffer.setUint8(i, params[i]); + break; + } + case TDengineTypeCode['SMALLINT']: { + dataBuffer.setInt16(i * 2, params[i], true); + break; + } + case TDengineTypeCode['SMALLINT UNSIGNED']: { + dataBuffer.setUint16(i * 2, params[i], true); + break; + } + + case TDengineTypeCode['INT']: { + dataBuffer.setInt32(i * 4, params[i], true); + break; + } + + case TDengineTypeCode['INT UNSIGNED']: { + dataBuffer.setUint32(i * 4, params[i], true); + break; + } + + case TDengineTypeCode['BIGINT']: { + dataBuffer.setBigInt64(i * 8, params[i], true); + break; + } + + case TDengineTypeCode['BIGINT UNSIGNED']: { + dataBuffer.setBigUint64(i * 8, params[i], true); + break; + } + + case TDengineTypeCode['FLOAT']: { + dataBuffer.setFloat32(i * 4, params[i], true); + break; + } + case TDengineTypeCode['DOUBLE']: { + dataBuffer.setFloat64(i * 8, params[i], true); + break; + } + default: { + throw new TaosError(ErrorCode.ERR_UNSPPORTED_TDENGINE_TYPE, "unspported type for column" + columnType) + } + } + + } else { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetTinyIntColumn params is invalid! param:=" + params[i]) + } + } else { + //set bitmap bit is null + let charOffset = CharOffset(i); + let nullVal = BMSetNull(bitmapBuffer.getUint8(charOffset), i); + bitmapBuffer.setInt8(charOffset, nullVal); + } + } + this._dataTotalLen += dataBuffer.buffer.byteLength; + return [typeLen * params.length, dataBuffer.buffer]; + } + + private encodeVarLengthColumn(params:any[]):[number, ArrayBuffer] { + let data:ArrayBuffer[] = [] + let dataLength = 0; + //create params length buffer + let paramsLenBuffer = new ArrayBuffer(TDengineTypeLength['INT'] * params.length) + let paramsLenView = new DataView(paramsLenBuffer) + if (this._rows > 0) { + if (this._rows !== params.length) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "wrong row length!") + } + }else { + this._rows = params.length; + } + for (let i = 0; i < params.length; i++) { + //get param length offset 4byte + let offset = TDengineTypeLength['INT'] * i; + if (!IsEmpty(params[i])) { + //save param length offset 4byte + paramsLenView.setInt32(offset, dataLength, true); + if (typeof params[i] == 'string' ) { + //string TextEncoder + let encode = new TextEncoder(); + let value = encode.encode(params[i]).buffer; + data.push(value); + //add offset length + dataLength += value.byteLength + TDengineTypeLength['SMALLINT']; + } else if (params[i] instanceof ArrayBuffer) { + //input arraybuffer, save not need encode + let value:ArrayBuffer = params[i]; + dataLength += value.byteLength + TDengineTypeLength['SMALLINT']; + data.push(value); + } else { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, + "getColumString params is invalid! param_type:=" + typeof params[i]); + } + + }else{ + //set length -1, param is null + for (let j = 0; j < TDengineTypeLength['INT']; j++) { + paramsLenView.setInt8(offset+j, 255); + } + + } + } + + this._dataTotalLen += paramsLenBuffer.byteLength + dataLength; + return [dataLength, this.getBinaryColumnArrayBuffer(data, paramsLenView.buffer, dataLength)]; + } + //splicing encode params to arraybuffer + private getBinaryColumnArrayBuffer(data:ArrayBuffer[], paramsLenBuffer: ArrayBuffer, dataLength:number):ArrayBuffer { + //creat arraybuffer + let paramsBuffer = new ArrayBuffer(paramsLenBuffer.byteLength + dataLength) + //get length data range + const paramsUint8 = new Uint8Array(paramsBuffer); + const paramsLenView = new Uint8Array(paramsLenBuffer); + paramsUint8.set(paramsLenView, 0); + //get data range + const paramsView = new DataView(paramsBuffer, paramsLenBuffer.byteLength); + + let offset = 0; + for (let i = 0; i < data.length; i++) { + //save param field length + paramsView.setInt16(offset, data[i].byteLength, true) + const dataView = new DataView(data[i]); + //save data + for (let j = 0; j < data[i].byteLength; j++) { + paramsView.setUint8(offset + 2 + j, dataView.getUint8(j)) + } + offset += data[i].byteLength + 2; + } + + return paramsBuffer + } + //encode nchar type params + private encodeNcharColumn(params:any[]):[number, ArrayBuffer] { + let data:ArrayBuffer[] = [] + let dataLength = 0; + let indexBuffer = new ArrayBuffer(TDengineTypeLength['INT'] * params.length) + let indexView = new DataView(indexBuffer) + if (this._rows > 0) { + if (this._rows !== params.length) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "wrong row length!") + } + }else { + this._rows = params.length; + } + + for (let i = 0; i < params.length; i++) { + let offset = TDengineTypeLength['INT'] * i; + if (!IsEmpty(params[i])) { + indexView.setInt32(offset, dataLength, true); + if (typeof params[i] == 'string' ) { + let codes:number[] = []; + let strNcharParams:string = params[i]; + for (let j = 0; j < params[i].length; j++) { + //get char, cn char neet 3~4 byte + codes.push(strNcharParams.charCodeAt(j)); + } + + let ncharBuffer:ArrayBuffer = new ArrayBuffer(codes.length * 4); + let ncharView = new DataView(ncharBuffer); + for (let j = 0; j < codes.length; j++) { + //1char, save into uint32 + ncharView.setUint32(j*4, codes[j], true); + } + data.push(ncharBuffer); + dataLength += codes.length * 4 + TDengineTypeLength['SMALLINT']; + + } else if (params[i] instanceof ArrayBuffer) { + let value:ArrayBuffer = params[i] + dataLength += value.byteLength + TDengineTypeLength['SMALLINT']; + data.push(value); + } else { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "getColumString params is invalid! param_type:=" + typeof params[i]) + } + + }else{ + //set length -1, param is null + for (let j = 0; j < TDengineTypeLength['INT']; j++) { + indexView.setInt8(offset+j, 255) + } + + } + } + + this._dataTotalLen += indexBuffer.byteLength + dataLength; + return [dataLength, this.getBinaryColumnArrayBuffer(data, indexView.buffer, dataLength)]; + } + + private countBigintDigits(numeral: bigint): number { + if (numeral === 0n) { + return 1; + } + let count = 0; + let temp = numeral; + while (temp !== 0n) { + temp /= 10n; + count++; + } + return count; + } + +} + + diff --git a/nodejs/src/stmt/wsProto.ts b/nodejs/src/stmt/wsProto.ts new file mode 100644 index 0000000..1fe7030 --- /dev/null +++ b/nodejs/src/stmt/wsProto.ts @@ -0,0 +1,104 @@ +import { WSQueryResponse } from "../client/wsResponse"; +import { TDengineTypeLength } from "../common/constant"; +import { MessageResp } from "../common/taosResult"; +import { StmtBindParams } from "./wsParams"; + +export interface StmtMessageInfo { + action: string; + args: StmtParamsInfo; +} + +interface StmtParamsInfo { + req_id: number; + sql?: string | undefined | null; + stmt_id?: number | undefined | null; + name?: string | undefined | null; + tags?: Array | undefined | null; + paramArray?: Array> | undefined | null; +} + + +export class WsStmtQueryResponse extends WSQueryResponse { + affected:number | undefined | null; + stmt_id?: number | undefined | null; + constructor(resp:MessageResp) { + super(resp); + this.stmt_id = resp.msg.stmt_id + this.affected = resp.msg.affected + } +} + +export const enum StmtBindType { + STMT_TYPE_TAG=1, + STMT_TYPE_BIND=2, +} + +export const enum SchemalessProto { + InfluxDBLineProtocol = 1, + OpenTSDBTelnetLineProtocol = 2, + OpenTSDBJsonFormatProtocol = 3 +} + + +export function binaryBlockEncode(bindParams :StmtBindParams, bindType:StmtBindType, stmtId:number, reqId:bigint, row:number): ArrayBuffer { + //Computing the length of data + let columns = bindParams.GetParams().length; + let length = TDengineTypeLength['BIGINT'] * 4; + length += TDengineTypeLength['INT'] * 5; + length += columns * 5 + columns * 4; + length += bindParams.GetDataTotalLen(); + + let arrayBuffer = new ArrayBuffer(length); + let arrayView = new DataView(arrayBuffer) + + arrayView.setBigUint64(0, reqId, true); + arrayView.setBigUint64(8, BigInt(stmtId), true); + arrayView.setBigUint64(16, BigInt(bindType), true); + //version int32 + arrayView.setUint32(24, 1, true); + //data length int32 + arrayView.setUint32(28, arrayBuffer.byteLength, true); + //rows int32 + arrayView.setUint32(32, row, true); + //columns int32 + arrayView.setUint32(36, columns, true); + //flagSegment int32 + arrayView.setUint32(40, 0, true); + //groupID uint64 + arrayView.setBigUint64(44, BigInt(0), true); + //head length + let offset = 52; + //type data range + let typeView = new DataView(arrayBuffer, offset); + //length data range + let lenView = new DataView(arrayBuffer, offset + columns * 5); + //data range offset + let dataOffset = offset + columns * 5 + columns * 4; + let headOffset = 0; + let columnsData = bindParams.GetParams() + for (let i = 0; i< columnsData.length; i++) { + //set column data type + typeView.setUint8(headOffset, columnsData[i].type) + //set column type length + typeView.setUint32(headOffset+1, columnsData[i].typeLen, true) + //set column data length + lenView.setUint32(i * 4, columnsData[i].length, true) + if (columnsData[i].data) { + //get encode column data + const sourceView = new Uint8Array(columnsData[i].data); + //console.log("begin:", dataOffset, columnsData[i].data.byteLength, bindParams.GetDataTotalLen()); + const destView = new Uint8Array(arrayBuffer, dataOffset, columnsData[i].data.byteLength); + //splicing data + destView.set(sourceView); + dataOffset += columnsData[i].data.byteLength; + // console.log("end:",dataOffset, columnsData[i].data.byteLength, bindParams.GetDataTotalLen()); + } + headOffset += 5 + } + + // console.log('bindParams.GetDataTotalLen -->', new Uint8Array(arrayBuffer)) + + // throw new TaosResultError(ErrorCode.ERR_INVALID_FETCH_MESSAGE_DATA, `test`) + return arrayBuffer; + +} \ No newline at end of file diff --git a/nodejs/src/stmt/wsStmt.ts b/nodejs/src/stmt/wsStmt.ts new file mode 100644 index 0000000..2a3f185 --- /dev/null +++ b/nodejs/src/stmt/wsStmt.ts @@ -0,0 +1,225 @@ +import { WsClient } from '../client/wsClient'; +import { ErrorCode, TDWebSocketClientError, TaosError, TaosResultError } from '../common/wsError'; +import { WsStmtQueryResponse, StmtMessageInfo, binaryBlockEncode, StmtBindType } from './wsProto'; +import { ReqId } from '../common/reqid'; +import { PrecisionLength } from '../common/constant'; +import { StmtBindParams } from './wsParams'; + +export class WsStmt { + private _wsClient: WsClient; + private _stmt_id: number | undefined | null; + private _precision:number = PrecisionLength['ms']; + + private lastAffected: number | undefined | null; + private constructor(wsClient: WsClient, precision?:number) { + this._wsClient = wsClient; + if (precision) { + this._precision = precision; + } + } + + static NewStmt(wsClient: WsClient, precision?:number, reqId?:number): Promise { + let wsStmt = new WsStmt(wsClient, precision) + return wsStmt.init(reqId); + } + + Prepare(sql: string): Promise { + let queryMsg = { + action: 'prepare', + args: { + req_id: ReqId.getReqID(), + sql: sql, + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg); + } + + SetTableName(tableName: string): Promise { + let queryMsg = { + action: 'set_table_name', + args: { + req_id: ReqId.getReqID(), + name: tableName, + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg); + } + + SetTags(tags: Array): Promise { + let queryMsg = { + action: 'set_tags', + args: { + req_id: ReqId.getReqID(), + tags: tags, + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg); + } + + NewStmtParam():StmtBindParams { + return new StmtBindParams(this._precision); + } + + SetBinaryTags(paramsArray:StmtBindParams): Promise { + if (!paramsArray || !this._stmt_id) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBinaryTags paramArray is invalid!") + } + + let columnInfos = paramsArray.GetParams(); + if (!columnInfos) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBinaryTags paramArray is invalid!") + } + let reqId = BigInt(ReqId.getReqID()) + let dataBlock = binaryBlockEncode(paramsArray, StmtBindType.STMT_TYPE_TAG, this._stmt_id, reqId, paramsArray.GetDataRows()) + return this.sendBinaryMsg(reqId, 'set_tags', dataBlock); + } + + BinaryBind(paramsArray:StmtBindParams): Promise { + if (!paramsArray || !this._stmt_id) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "BinaryBind paramArray is invalid!") + } + + let columnInfos = paramsArray.GetParams(); + if (!columnInfos) { + throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "BinaryBind paramArray is invalid!") + } + let reqId = BigInt(ReqId.getReqID()) + let dataBlock = binaryBlockEncode(paramsArray, StmtBindType.STMT_TYPE_BIND, this._stmt_id, reqId, paramsArray.GetDataRows()); + return this.sendBinaryMsg(reqId, 'bind', dataBlock); + } + + Bind(paramArray: Array>): Promise { + let queryMsg = { + action: 'bind', + args: { + req_id: ReqId.getReqID(), + columns: paramArray, + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg); + } + + Batch(): Promise { + let queryMsg = { + action: 'add_batch', + args: { + req_id: ReqId.getReqID(), + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg); + } + + /** + * return client version. + */ + Version(): Promise { + return this._wsClient.version(); + } + + Exec(): Promise { + let queryMsg = { + action: 'exec', + args: { + req_id: ReqId.getReqID(), + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg); + } + + GetLastAffected() { + return this.lastAffected; + } + + Close(): Promise { + let queryMsg = { + action: 'close', + args: { + req_id: ReqId.getReqID(), + stmt_id: this._stmt_id, + }, + }; + return this.execute(queryMsg, false); + } + + public getStmtId(): number | undefined | null { + return this._stmt_id; + } + + private async execute(queryMsg: StmtMessageInfo, register: Boolean = true): Promise { + try { + if (this._wsClient.getState() <= 0) { + throw new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "websocket connect has closed!"); + } + let reqMsg = JSON.stringify(queryMsg); + if (register) { + let result = await this._wsClient.exec(reqMsg, false); + let resp = new WsStmtQueryResponse(result) + if (resp.stmt_id) { + this._stmt_id = resp.stmt_id; + } + + if (resp.affected) { + this.lastAffected = resp.affected + } + }else{ + await this._wsClient.execNoResp(reqMsg); + this._stmt_id = null + this.lastAffected = null + } + return + } catch (e:any) { + throw new TaosResultError(e.code, e.message); + } + } + + private async sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer): Promise { + try { + if (this._wsClient.getState() <= 0) { + throw new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "websocket connect has closed!"); + } + let result = await this._wsClient.sendBinaryMsg(reqId, action, message, false); + let resp = new WsStmtQueryResponse(result) + if (resp.stmt_id) { + this._stmt_id = resp.stmt_id; + } + + if (resp.affected) { + this.lastAffected = resp.affected + } + return + } catch (e:any) { + throw new TaosResultError(e.code, e.message); + } + } + + private init(reqId?: number):Promise { + return new Promise(async (resolve, reject) => { + if (this._wsClient) { + try{ + if (this._wsClient.getState() <= 0) { + await this._wsClient.connect(); + } + let queryMsg = { + action: 'init', + args: { + req_id: ReqId.getReqID(reqId), + }, + }; + await this.execute(queryMsg); + resolve(this) + } catch(e) { + reject(e); + } + }else{ + reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed")); + } + }); + } + +} diff --git a/nodejs/src/tmq/config.ts b/nodejs/src/tmq/config.ts new file mode 100644 index 0000000..a0fc036 --- /dev/null +++ b/nodejs/src/tmq/config.ts @@ -0,0 +1,56 @@ +import { TMQConstants } from "./constant"; + +export class TmqConfig { + // req_id: number; + url: URL; + user: string; + password: string; + group_id: string; + clien_id: string; + offset_rest: string; + topics?: Array; + auto_commit: boolean; + auto_commit_interval_ms: number; + timeout:number; + + + constructor(wsConfig:Map) { + this.url = new URL(wsConfig.get(TMQConstants.WS_URL)); + this.user = wsConfig.get(TMQConstants.CONNECT_USER); + this.password = wsConfig.get(TMQConstants.CONNECT_PASS); + this.group_id = wsConfig.get(TMQConstants.GROUP_ID); + this.clien_id = wsConfig.get(TMQConstants.CLIENT_ID); + this.offset_rest = wsConfig.get(TMQConstants.AUTO_OFFSET_RESET); + this.auto_commit = wsConfig.get(TMQConstants.ENABLE_AUTO_COMMIT); + + if (!this.auto_commit) { + this.auto_commit = false; + } + + this.auto_commit_interval_ms = wsConfig.get(TMQConstants.AUTO_COMMIT_INTERVAL_MS); + if (!this.auto_commit_interval_ms) { + this.auto_commit_interval_ms = 5 * 1000; + } + + this.timeout = wsConfig.get(TMQConstants.CONNECT_MESSAGE_TIMEOUT); + if (!this.timeout) { + this.timeout = 5000; + } + + if (this.url) { + if (this.user) { + this.url.username = this.user; + }else{ + this.user = this.url.username; + } + if (this.password) { + this.url.password = this.password; + + }else{ + this.password = this.url.password; + } + } + + } + +} \ No newline at end of file diff --git a/nodejs/src/tmq/constant.ts b/nodejs/src/tmq/constant.ts new file mode 100644 index 0000000..f40b7e8 --- /dev/null +++ b/nodejs/src/tmq/constant.ts @@ -0,0 +1,104 @@ +export class TMQConstants { + public static GROUP_ID: string = 'group.id'; + + public static CLIENT_ID: string = 'client.id'; + + /** + * auto commit default is true then the commitCallback function will be called after 5 seconds + */ + public static ENABLE_AUTO_COMMIT: string = 'enable.auto.commit'; + + /** + * commit interval. unit milliseconds + */ + public static AUTO_COMMIT_INTERVAL_MS: string = 'auto.commit.interval.ms'; + + /** + * only valid in first group id create. + */ + public static AUTO_OFFSET_RESET: string = 'auto.offset.reset'; + + /** + * whether poll result include table name. suggest always true + */ + public static MSG_WITH_TABLE_NAME: string = 'msg.with.table.name'; + + /** + * indicate host and port of connection + */ + public static BOOTSTRAP_SERVERS: string = 'bootstrap.servers'; + + /** + * deserializer Bean + */ + public static VALUE_DESERIALIZER: string = 'value.deserializer'; + + /** + * encode for deserializer String value + */ + public static VALUE_DESERIALIZER_ENCODING: string = 'value.deserializer.encoding'; + + /** + * connection ip + */ + public static CONNECT_IP: string = 'td.connect.ip'; + + /** + * connection port + */ + public static CONNECT_PORT: string = 'td.connect.port'; + + /** + * connection username + */ + public static CONNECT_USER: string = 'td.connect.user'; + + /** + * connection password + */ + public static CONNECT_PASS: string = 'td.connect.pass'; + + /** + * connect type websocket or jni, default is jni + */ + public static CONNECT_TYPE: string = 'td.connect.type'; + + /** + * Key used to retrieve the token value from the properties instance passed to + * the driver. + * Just for Cloud Service + */ + public static WS_URL: string = 'ws.url'; + + /** + * the timeout in milliseconds until a connection is established. + * zero is interpreted as an infinite timeout. + * only valid in websocket + */ + public static CONNECT_TIMEOUT: string = 'httpConnectTimeout'; + + /** + * message receive from server timeout. ms. + * only valid in websocket + */ + public static CONNECT_MESSAGE_TIMEOUT: string = 'messageWaitTimeout'; + +} + +export class TMQMessageType { + public static Subscribe: string = 'subscribe'; + public static Poll: string = 'poll'; + public static FetchRaw: string = 'fetch_raw'; + public static FetchJsonMeta: string = 'fetch_json_meta'; + public static Commit: string = 'commit'; + public static Unsubscribe: string = 'unsubscribe'; + public static GetTopicAssignment: string = 'assignment'; + public static Seek: string = 'seek'; + public static CommitOffset: string = 'commit_offset'; + public static Committed: string = 'committed'; + public static Position: string = 'position'; + public static ListTopics: string = "list_topics"; + public static ResDataType: number = 1; +} + + diff --git a/nodejs/src/tmq/tmqResponse.ts b/nodejs/src/tmq/tmqResponse.ts new file mode 100644 index 0000000..5a44617 --- /dev/null +++ b/nodejs/src/tmq/tmqResponse.ts @@ -0,0 +1,257 @@ +// resp: {"code":0,"message":"","action":"poll","req_id":3,"have_message":true,"topic":"test_tmq_ws_topic","database":"test_ws_tmq","vgroup_id":6,"message_id":1} + +import { WSQueryResponse } from "../client/wsResponse"; +import { ColumnsBlockType, TDengineTypeLength } from "../common/constant"; +import { MessageResp, TaosResult, _isVarType, readBinary, readNchar, readSolidDataToArray, readVarchar } from "../common/taosResult"; +import { WebSocketInterfaceError, ErrorCode } from "../common/wsError"; + +export class WsPollResponse { + code: number; + message: string; + action: string; + req_id: number; + have_message: boolean; + topic: string; + database: string; + vgroup_id:number; + message_id: number; + id: bigint; + message_type:number; + totalTime:number; + + constructor(resp:MessageResp) { + this.totalTime = resp.totalTime + this.code = resp.msg.code; + this.message = resp.msg.message; + this.action = resp.msg.action; + this.req_id = resp.msg.req_id; + this.have_message = resp.msg.have_message; + this.topic = resp.msg.topic; + this.database = resp.msg.database; + this.vgroup_id = resp.msg.vgroup_id; + this.message_id = resp.msg.message_id; + this.message_type = resp.msg.message_type; + if (resp.msg.id) { + this.id = BigInt(resp.msg.id); + }else{ + this.id = BigInt(0) + } + } +} + +// resp: {"code":0,"message":"","action":"fetch","req_id":4,"message_id":1,"completed":false,"table_name":"ct2","rows":1,"fields_count":4,"fields_names":["ts","c1","c2","c3"],"fields_types":[9,4,6,8],"fields_lengths":[8,4,4,10],"precision":0} +export class WsTmqQueryResponse extends WSQueryResponse{ + completed: boolean; + table_name: string; + rows:number; + message_id:number; + + + constructor(resp:MessageResp) { + super(resp); + this.completed = resp.msg.completed; + this.table_name = resp.msg.table_name; + this.rows = resp.msg.rows; + this.message_id = resp.msg.message_id; + } +} + +export class TaosTmqResult extends TaosResult { + topic: string; + database: string; + vgroup_id:number; + table_name:string; + constructor(resp: WsTmqQueryResponse, pollResp:WsPollResponse) { + super(resp); + this.table_name = resp.table_name; + // this._affectRows = resp.rows; + this.topic = pollResp.topic; + this.database = pollResp.database; + this.vgroup_id = pollResp.vgroup_id; + + } +} + +export class WSTmqFetchBlockResponse { + totalTime : number; + blockData : ArrayBuffer; + constructor(resp:MessageResp) { + this.totalTime = resp.totalTime + this.blockData = resp.msg + } +} +export class AssignmentResp{ + req_id: number; + code: number; + message: string; + action: string; + totalTime: number; + timing:bigint; + topicPartition:TopicPartition[]; + constructor(resp:MessageResp, topic:string) { + this.timing = BigInt(resp.msg.timing); + this.code = resp.msg.code; + this.message = resp.msg.message; + this.req_id = resp.msg.req_id; + this.action = resp.msg.action; + this.totalTime = resp.totalTime; + this.topicPartition = resp.msg.assignment; + for (let i in this.topicPartition) { + this.topicPartition[i].topic = topic; + } + } +} +export class SubscriptionResp{ + req_id: number; + code: number; + message: string; + action: string; + totalTime: number; + timing:bigint; + topics:string[]; + constructor(resp:MessageResp) { + this.timing = BigInt(resp.msg.timing); + this.code = resp.msg.code; + this.message = resp.msg.message; + this.req_id = resp.msg.req_id; + this.action = resp.msg.action; + this.totalTime = resp.totalTime; + this.topics = resp.msg.topics; + } +} + +export class PartitionsResp{ + req_id: number; + code: number; + message: string; + action: string; + totalTime: number; + timing:bigint; + positions:number[]; + constructor(resp:MessageResp) { + this.timing = BigInt(resp.msg.timing); + this.code = resp.msg.code; + this.message = resp.msg.message; + this.req_id = resp.msg.req_id; + this.action = resp.msg.action; + this.totalTime = resp.totalTime; + this.positions = resp.msg.position; + } + + SetTopicPartitions(topicPartitions:TopicPartition[]):TopicPartition[] { + if (topicPartitions.length != this.positions.length) { + throw new WebSocketInterfaceError(ErrorCode.ERR_PARTITIONS_TOPIC_VGROUP_LENGTH_NOT_EQUAL, 'TopicPartitions and positions are not equal in length'); + } + for (let i in this.positions) { + topicPartitions[i].offset = this.positions[i] + } + return topicPartitions; + } + +} + +export class CommitedResp extends PartitionsResp { + constructor(resp:MessageResp) { + super(resp); + this.positions = resp.msg.committed + } +} + +export class TopicPartition { + topic :string; + vgroup_id :number; + offset ?:number; + begin ?:number; + end ?:number; + constructor(msg:any) { + this.vgroup_id = msg.vgroup_id; + this.offset = msg.offset; + this.begin = msg.begin; + this.end = msg.end; + this.topic = '' + } +} + +export function parseTmqBlock(rows:number, resp: WSTmqFetchBlockResponse, taosResult: TaosResult): TaosResult { + let dataList:any[][] = new Array(rows); + if (!resp || !taosResult) { + return taosResult; + } + + let metaList = taosResult.GetTaosMeta() + let taosdata = taosResult.GetData() + if (metaList && rows && taosdata) { + //get bitmap length + let bitMapOffset:number = BitmapLen(rows); + //skip data head + let bufferOffset = 24 + 28 + 5 * metaList.length + + let dataBuffer:ArrayBuffer = resp.blockData.slice(bufferOffset); + let metaLens:number[]= [] + for (let i = 0; i< metaList.length; i++) { + //get data len + metaLens.push(new DataView(dataBuffer, i*4, 4).getInt32(0, true)) + } + bufferOffset = metaList.length * 4; + + for (let i = 0; i < metaList.length; i++) { + let data:any[] = []; + //get type code + let isVarType = _isVarType(metaList[i]) + //fixed length type + if (isVarType == ColumnsBlockType.SOLID) { + let bitMapArr = dataBuffer.slice(bufferOffset, bufferOffset + bitMapOffset); + bufferOffset += bitMapOffset; + //decode column data, data is array + data = readSolidDataToArray(dataBuffer, bufferOffset, rows, metaList[i], bitMapArr); + } else { + //Variable length type + let offset = bufferOffset; + let offsets:number[]= []; + for (let i = 0; i< rows; i++, offset += TDengineTypeLength['INT']) { + //get data length, -1 is null + offsets.push(new DataView(dataBuffer, offset, 4).getInt32(0, true)) + } + let start = offset + for (let i = 0; i< rows; i++) { + let value:any = '' + if (-1 == offsets[i]) { + value = null + }else{ + let header = start + offsets[i]; + let dataLength = new DataView(dataBuffer, header, 2).getInt16(0, true) & 0xFFFF; + if (isVarType == ColumnsBlockType.VARCHAR) { + //decode var char + value = readVarchar(dataBuffer, header + 2, dataLength) + } else if(isVarType == ColumnsBlockType.GEOMETRY || isVarType == ColumnsBlockType.VARBINARY) { + //decode binary + value = readBinary(dataBuffer, header + 2, dataLength) + } else { + //decode nchar + value = readNchar(dataBuffer, header + 2, dataLength) + } + + } + data.push(value); + } + bufferOffset += rows * 4 + } + bufferOffset += metaLens[i] + //column data to row data + for (let row = 0; row < data.length; row++) { + if (dataList[row] == null) { + dataList[row] = [] + } + dataList[row].push(data[row]) + } + } + taosdata.push(...dataList); + } + + + return taosResult; +} + +function BitmapLen(n:number) { + return (n + 0x7) >> 3; +} diff --git a/nodejs/src/tmq/wsTmq.ts b/nodejs/src/tmq/wsTmq.ts new file mode 100644 index 0000000..395d634 --- /dev/null +++ b/nodejs/src/tmq/wsTmq.ts @@ -0,0 +1,470 @@ +import { TmqConfig } from './config'; +import { TMQConstants, TMQMessageType } from './constant'; +import { WsClient } from '../client/wsClient'; +import { TaosResult } from '../common/taosResult'; +import { ErrorCode, TaosResultError, WebSocketInterfaceError } from '../common/wsError'; +import { AssignmentResp, CommitedResp, PartitionsResp, SubscriptionResp, TaosTmqResult, TopicPartition, WSTmqFetchBlockResponse, WsPollResponse, WsTmqQueryResponse, parseTmqBlock} from './tmqResponse'; +import { ReqId } from '../common/reqid'; + +export class WsConsumer { + private _wsClient: WsClient; + private _wsConfig:TmqConfig; + private _topics?:string[]; + private _commitTime?:number; + private constructor(wsConfig:Map) { + this._wsConfig = new TmqConfig(wsConfig) + console.log(this._wsConfig) + this._wsClient = new WsClient(this._wsConfig.url, this._wsConfig.timeout); + } + + private init():Promise { + return new Promise(async (resolve, reject) => { + try { + await this._wsClient.Ready(); + resolve(this); + } catch (e: any) { + reject(e) + } + }); + } + + static NewConsumer(wsConfig:Map):Promise { + if (wsConfig.size == 0 || !wsConfig.get(TMQConstants.WS_URL)) { + throw new WebSocketInterfaceError(ErrorCode.ERR_INVALID_URL, + 'invalid url, password or username needed.'); + } + let wsConsumer = new WsConsumer(wsConfig); + return wsConsumer.init() + + } + + Subscribe(topics: Array, reqId?:number): Promise { + if (!topics || topics.length == 0 ) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq Subscribe params is error!'); + } + + let queryMsg = { + action: TMQMessageType.Subscribe, + args: { + req_id :ReqId.getReqID(reqId), + user :this._wsConfig.user, + password :this._wsConfig.password, + group_id :this._wsConfig.group_id, + clien_id :this._wsConfig.clien_id, + topics :topics, + offset_rest:this._wsConfig.offset_rest, + auto_commit:this._wsConfig.auto_commit, + auto_commit_interval_ms: this._wsConfig.auto_commit_interval_ms + }, + }; + this._topics = topics + return this.execute(JSON.stringify(queryMsg)); + } + + Unsubscribe(reqId?:number): Promise { + let queryMsg = { + action: TMQMessageType.Unsubscribe, + args: { + req_id: ReqId.getReqID(reqId), + }, + }; + return this.execute(JSON.stringify(queryMsg)); + } + + Poll(timeoutMs: number, reqId?:number):Promise>{ + return new Promise(async (resolve, reject) => { + try { + if (this._wsConfig.auto_commit) { + if (this._commitTime) { + let currTime = new Date().getTime(); + let diff = Math.abs(currTime - this._commitTime); + if (diff >= this._wsConfig.auto_commit_interval_ms) { + await this.doCommit() + this._commitTime = new Date().getTime(); + } + } else { + this._commitTime = new Date().getTime(); + } + } + resolve(await this.poll(timeoutMs,reqId)) + } catch(e: any) { + reject(new TaosResultError(e.code, e.message)); + } + }) + } + + Assignment(topics?:string[]):Promise> { + return new Promise(async (resolve, reject) => { + if (!topics || topics.length == 0) { + topics = this._topics + } + + let topicPartitions:TopicPartition[] = []; + try { + if (topics && topics.length > 0) { + const allp:any[] = []; + for (let i in topics) { + allp.push(this.assignment(topics[i])); + } + let result = await Promise.all(allp) + result.forEach(e => { + topicPartitions.push(...e); + }) + } + resolve(topicPartitions) + } catch (e: any){ + reject(new TaosResultError(e.code, e.message)); + } + }); + } + + Subscription(reqId?:number):Promise> { + return new Promise(async (resolve, reject) => { + let queryMsg = { + action: TMQMessageType.ListTopics, + args: { + req_id: ReqId.getReqID(reqId), + }, + }; + try { + let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); + resolve(new SubscriptionResp(resp).topics) + } catch (e:any) { + reject(new TaosResultError(e.code, e.message)); + } + }); + } + + Commit(reqId?:number):Promise> { + return new Promise(async (resolve, reject) => { + try { + await this.doCommit(reqId) + resolve(await this.Assignment()) + } catch (e: any) { + reject(new TaosResultError(e.code, e.message)); + } + }) + } + + private doCommit(reqId?:number):Promise { + return new Promise(async (resolve, reject) => { + let queryMsg = { + action: TMQMessageType.Commit, + args: { + req_id : ReqId.getReqID(reqId), + message_id: 0 + }, + }; + try { + await this.execute(JSON.stringify(queryMsg)); + resolve() + } catch(e: any) { + reject(new TaosResultError(e.code, e.message)) + } + }) + } + + Commited(partitions:Array, reqId?:number):Promise>{ + if (!partitions || partitions.length == 0 ) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq Positions params is error!'); + } + + return new Promise(async (resolve, reject) => { + let offsets: TopicPartition[] = new Array(partitions.length); + for (let i = 0; i < partitions.length; i++) { + offsets[i] = { + topic: partitions[i].topic, + vgroup_id: partitions[i].vgroup_id + }; + offsets[i].vgroup_id = partitions[i].vgroup_id + } + + let queryMsg = { + action: TMQMessageType.Committed, + args: { + req_id : ReqId.getReqID(reqId), + topic_vgroup_ids:offsets + }, + }; + try { + let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); + resolve(new CommitedResp(resp).SetTopicPartitions(offsets)) + } catch (e:any) { + reject(new TaosResultError(e.code, e.message)); + } + }); + } + + CommitOffsets(partitions:Array):Promise> { + if (!partitions || partitions.length == 0) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq CommitOffsets params is error!'); + } + + return new Promise(async (resolve, reject) => { + try{ + const allp:any[] = [] + partitions.forEach(e => { + allp.push(this.CommitOffset(e)) + }) + await Promise.all(allp) + resolve(await this.Commited(partitions)) + }catch(e:any) { + reject(new TaosResultError(e.code, e.message)); + } + }) + } + + + CommitOffset(partition:TopicPartition, reqId?:number):Promise { + if (!partition) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq CommitOffsets params is error!'); + } + + let queryMsg = { + action: TMQMessageType.CommitOffset, + args: { + req_id : ReqId.getReqID(reqId), + vgroup_id :partition.vgroup_id, + topic :partition.topic, + offset :partition.offset, + }, + }; + return this.execute(JSON.stringify(queryMsg)); + + + } + + Positions(partitions:Array, reqId?:number):Promise> { + if (!partitions || partitions.length == 0 ) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq Positions params is error!'); + } + + return new Promise(async (resolve, reject) => { + let offsets: TopicPartition[] = new Array(partitions.length); + for (let i = 0; i < partitions.length; i++) { + offsets[i] = { + topic: partitions[i].topic, + vgroup_id: partitions[i].vgroup_id + }; + offsets[i].vgroup_id = partitions[i].vgroup_id + } + let queryMsg = { + action: TMQMessageType.Position, + args: { + req_id : ReqId.getReqID(reqId), + topic_vgroup_ids:offsets + }, + }; + try { + let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); + resolve(new PartitionsResp(resp).SetTopicPartitions(offsets)) + } catch (e:any) { + reject(new TaosResultError(e.code, e.message)); + } + }); + } + + Seek(partition:TopicPartition, reqId?:number):Promise { + if (!partition) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq Seek params is error!'); + } + + let queryMsg = { + action: TMQMessageType.Seek, + args: { + req_id : ReqId.getReqID(reqId), + vgroup_id :partition.vgroup_id, + topic :partition.topic, + offset :partition.offset, + }, + }; + return this.execute(JSON.stringify(queryMsg)); + } + + SeekToBeginning(partitions:Array):Promise { + if (!partitions || partitions.length == 0) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq SeekToBeginning params is error!'); + } + return this.seekToBeginOrEnd(partitions) + } + + SeekToEnd(partitions:Array):Promise { + if (!partitions || partitions.length == 0) { + throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, + 'WsTmq SeekToEnd params is error!'); + } + + return this.seekToBeginOrEnd(partitions, false) + } + + Close() { + this._wsClient.close(); + } + + private async execute(queryMsg: string): Promise { + try { + await this._wsClient.exec(queryMsg); + } catch (e:any) { + throw new TaosResultError(e.code, e.message); + } + } + + private async executeReturnAny(queryMsg: string): Promise { + try { + return await this._wsClient.exec(queryMsg, false); + } catch (e:any) { + console.log(e); + throw new TaosResultError(e.code, e.message); + } + } + + private fetch(pollResp: WsPollResponse):Promise { + let fetchMsg = { + action: 'fetch', + args: { + req_id: ReqId.getReqID(), + message_id:pollResp.message_id, + }, + }; + + return new Promise(async (resolve, reject) => { + let jsonStr = JSON.stringify(fetchMsg); + // console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + try { + let result = await this._wsClient.exec(jsonStr, false); + resolve(new WsTmqQueryResponse(result)); + } catch (e:any) { + reject(new WebSocketInterfaceError(e.code, e.message)) + } + }); + } + + private fetchBlockData(fetchResponse: WsTmqQueryResponse, taosResult: TaosResult):Promise { + let fetchMsg = { + action: 'fetch_block', + args: { + req_id: fetchResponse.req_id, + message_id: fetchResponse.message_id, + }, + }; + + return new Promise(async (resolve, reject) => { + try { + let jsonStr = JSON.stringify(fetchMsg); + // console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + let result = await this._wsClient.sendMsg(jsonStr) + resolve(parseTmqBlock(fetchResponse.rows, new WSTmqFetchBlockResponse(result), taosResult)) + } catch (e: any){ + reject(new WebSocketInterfaceError(e.code, e.message)) + } + }); + } + + private async poll(timeoutMs: number, reqId?:number): Promise> { + let queryMsg = { + action: TMQMessageType.Poll, + args: { + req_id : ReqId.getReqID(reqId), + blocking_time :timeoutMs + }, + }; + return new Promise(async (resolve, reject) => { + try { + var taosResults: Map = new Map(); + let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); + let pollResp = new WsPollResponse(resp) + if (pollResp.have_message == false || pollResp.message_type != TMQMessageType.ResDataType) { + resolve(taosResults); + } else { + // let count = 0 + // let startTime = new Date().getTime(); + while (true) { + // count++ + let fetchResp = await this.fetch(pollResp) + if (fetchResp.completed || fetchResp.rows == 0) { + let currTime = new Date().getTime(); + // console.log("----------count-->", count, Math.abs(currTime - startTime)) + break; + } + let taosResult = taosResults.get(pollResp.topic + pollResp.vgroup_id) + if (taosResult == null) { + taosResult = new TaosTmqResult(fetchResp, pollResp) + taosResults.set(pollResp.topic + pollResp.vgroup_id, taosResult) + } else { + taosResult.SetRowsAndTime(fetchResp.rows); + } + await this.fetchBlockData(fetchResp, taosResult) + + } + + resolve(taosResults); + } + } catch (e :any) { + console.log(e); + reject(new TaosResultError(e.code, e.message)); + } + }) + } + + private assignment(topic:string):Promise> { + return new Promise(async (resolve, reject) => { + try { + let queryMsg = { + action: TMQMessageType.GetTopicAssignment, + args: { + req_id: ReqId.getReqID(), + topic: topic + } + } + + let resp = await this.executeReturnAny(JSON.stringify(queryMsg)) + let assignmentInfo = new AssignmentResp(resp, queryMsg.args.topic); + resolve(assignmentInfo.topicPartition) + } catch (e:any){ + reject(new TaosResultError(e.code, e.message)); + } + }); + } + + private seekToBeginOrEnd(partitions:Array, bBegin:boolean = true):Promise { + return new Promise(async (resolve, reject) => { + let topics: string[] = []; + partitions.forEach(e => { + topics.push(e.topic) + }) + try { + let topicPartitions = await this.Assignment(topics) + let itemMap = topicPartitions.reduce((map, obj)=> { + map.set(obj.topic+'_'+obj.vgroup_id, obj) + return map + }, new Map()); + + const allp:any[] = [] + for(let i in partitions) { + if(itemMap.has(partitions[i].topic + '_' +partitions[i].vgroup_id)) { + let topicPartition = itemMap.get(partitions[i].topic + '_' +partitions[i].vgroup_id) + if (topicPartition) { + if(bBegin) { + topicPartition.offset = topicPartition.begin + }else{ + topicPartition.offset = topicPartition.end + } + allp.push(this.Seek(topicPartition)) + } + } + } + await Promise.all(allp) + resolve() + } catch (e:any){ + reject(new TaosResultError(e.code, e.message)); + } + }) + } + +} diff --git a/nodejs/test/bulkPulling/queryTables.test.ts b/nodejs/test/bulkPulling/queryTables.test.ts new file mode 100644 index 0000000..5b4149f --- /dev/null +++ b/nodejs/test/bulkPulling/queryTables.test.ts @@ -0,0 +1,298 @@ + +import { WSConfig } from "../../src/common/config"; +import { WsSql } from "../../src/sql/wsSql"; +import { createSTable, createSTableJSON, createTable, expectStableData, insertNTable, insertStable, jsonMeta, tableMeta, tagMeta } from "../utils"; +// const DSN = 'ws://root:taosdata@127.0.0.1:6041/ws' +let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; +let conf :WSConfig = new WSConfig(dsn) +const table = 'ws_q_n'; +const stable = 'ws_q_s'; +const tableCN = 'ws_q_n_cn'; +const stableCN = 'ws_q_s_cn'; +const db = 'ws_q_db' +const jsonTable = 'ws_q_j'; +const jsonTableCN = 'ws_q_j_cn'; + +const createDB = `create database if not exists ${db} keep 3650` +const dropDB = `drop database if exists ${db}` +const useDB = `use ${db}` + +const stableTags = [true, -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_tag_1', 'nchar_tag_1'] +const stableCNTags = [false, -1 * 2, -2 * 2, -3 * 2, BigInt(-4 * 2), 1 * 2, 2 * 2, 3 * 2, BigInt(4 * 2), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_标签_壹', 'nchar_标签_贰'] + +const tableValues = [ + [BigInt(1656677710000), 0, -1, -2, BigInt(-3), 0, 1, 2, BigInt(3), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_col_1', 'nchar_col_1', true, 'NULL' , 'POINT (4.0 8.0)', '0x7661726332'], + [BigInt(1656677720000), -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_col_2', 'nchar_col_2', false, 'NULL', 'POINT (3.0 5.0)', '0x7661726333'], + [BigInt(1656677730000), -2, -3, -4, BigInt(-5), 2, 3, 4, BigInt(5), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.14159265 * 3).toFixed(15)), 'varchar_col_3', 'nchar_col_3', true, 'NULL', 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)', '0x7661726334'], + [BigInt(1656677740000), -3, -4, -5, BigInt(-6), 3, 4, 5, BigInt(6), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.14159265 * 4).toFixed(15)), 'varchar_col_4', 'nchar_col_4', false, 'NULL', 'POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))', '0x7661726335'], + [BigInt(1656677750000), -4, -5, -6, BigInt(-7), 4, 5, 6, BigInt(7), parseFloat((3.1415 * 5).toFixed(5)), parseFloat((3.14159265 * 5).toFixed(15)), 'varchar_col_5', 'nchar_col_5', true, 'NULL', 'POINT (7.0 9.0)', '0x7661726335'], +] + +const tableCNValues = [ + [BigInt(1656677760000), 0, -1, -2, BigInt(-3), 0, 1, 2, BigInt(3), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_列_壹', 'nchar_列_甲', true, 'NULL', 'POINT (4.0 8.0)', '0x7661726332'], + [BigInt(1656677770000), -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_列_贰', 'nchar_列_乙', false, 'NULL', 'POINT (3.0 5.0)', '0x7661726333'], + [BigInt(1656677780000), -2, -3, -4, BigInt(-5), 2, 3, 4, BigInt(5), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.14159265 * 3).toFixed(15)), 'varchar_列_叁', 'nchar_列_丙', true, 'NULL', 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)', '0x7661726334'], + [BigInt(1656677790000), -3, -4, -5, BigInt(-6), 3, 4, 5, BigInt(6), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.14159265 * 4).toFixed(15)), 'varchar_列_肆', 'nchar_列_丁', false, 'NULL', 'POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))', '0x7661726335'], + [BigInt(1656677800000), -4, -5, -6, BigInt(-7), 4, 5, 6, BigInt(7), parseFloat((3.1415 * 5).toFixed(5)), parseFloat((3.14159265 * 5).toFixed(15)), 'varchar_列_伍', 'nchar_列_戊', true, 'NULL', 'POINT (7.0 9.0)', '0x7661726335'], +] +const jsonTags = ["{\"key1\":\"taos\",\"key2\":null,\"key3\":\"TDengine\",\"key4\":0,\"key5\":false}"] +const jsonTagsCN = ["{\"key1\":\"taosdata\",\"key2\":null,\"key3\":\"TDengine涛思数据\",\"key4\":1,\"key5\":true}"] + +const selectStable = `select * from ${stable}` +const selectStableCN = `select * from ${stableCN}` +const selectTable = `select * from ${table}` +const selectTableCN = `select * from ${tableCN}` +const selectJsonTable = `select * from ${jsonTable}` +const selectJsonTableCN = `select * from ${jsonTableCN}` + +beforeAll(async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(dropDB) + await ws.Exec(createDB); + await ws.Exec(useDB); + await ws.Exec(createSTable(stable)); + await ws.Exec(createSTable(stableCN)); + await ws.Exec(createTable(table)); + await ws.Exec(createTable(tableCN)); + await ws.Exec(createSTableJSON(jsonTable)); + await ws.Exec(createSTableJSON(jsonTableCN)); + ws.Close() +}) + +describe('ws.query(stable)', () => { + jest.setTimeout(20 * 1000) + test('Insert query stable without CN character', async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(useDB); + let insert = insertStable(tableValues, stableTags, stable) + let insertRes = await ws.Exec(insert) + expect(insertRes.GetAffectRows()).toBe(5) + + let queryRes = await ws.Exec(selectStable) + let expectMeta = tableMeta.concat(tagMeta) + let expectData = expectStableData(tableValues, stableTags) + let actualMeta = queryRes.GetMeta() + let actualData = queryRes.GetData() + ws.Close() + if (actualData && actualMeta) { + actualMeta.forEach((meta, index) => { + expect(meta.name).toBe(expectMeta[index].name) + expect(meta.type).toBe(expectMeta[index].type) + expect(meta.length).toBe(expectMeta[index].length) + }) + + for (let i = 0; i < actualData.length; i++) { + actualData[i].forEach((d, index) => { + // // console.log(i, index, d, expectData[i][index]) + if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { + expect(d).toBeTruthy() + } else { + expect(d).toBe(expectData[i][index]) + } + + }) + } + } else { + throw new Error("retrieve empty result") + } + + }) + + test('query stable with CN character', async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(useDB); + let insertCN = insertStable(tableCNValues, stableCNTags, stableCN) + // console.log(insertCN) + let insertRes = await ws.Exec(insertCN) + // console.log(insertRes) + expect(insertRes.GetAffectRows()).toBe(5) + + let queryRes = await ws.Exec(selectStableCN) + + let expectMeta = tableMeta.concat(tagMeta) + let expectData = expectStableData(tableCNValues, stableCNTags) + let actualMeta = queryRes.GetMeta() + let actualData = queryRes.GetData() + ws.Close() + if (actualData && actualMeta) { + actualMeta.forEach((meta, index) => { + expect(meta.name).toBe(expectMeta[index].name) + expect(meta.type).toBe(expectMeta[index].type) + expect(meta.length).toBe(expectMeta[index].length) + //// console.log(meta); + }) + + for (let i = 0; i < actualData.length; i++) { + actualData[i].forEach((d, index) => { + if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { + expect(d).toBeTruthy() + } else { + expect(d).toBe(expectData[i][index]) + } + }) + } + } else { + throw new Error("retrieve empty result") + } + }) +}) + +describe('ws.query(table)', () => { + test('Insert query normal table without CN character', async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(useDB); + let insert = insertNTable(tableValues, table) + // console.log(insert) + let insertRes = await ws.Exec(insert) + expect(insertRes.GetAffectRows()).toBe(5) + + let queryRes = await ws.Exec(selectTable) + + let expectMeta = tableMeta + let expectData = tableValues + let actualMeta = queryRes.GetMeta() + let actualData = queryRes.GetData() + ws.Close() + if (actualData && actualMeta) { + actualMeta.forEach((meta, index) => { + // console.log(meta,expectMeta[index]); + expect(meta.name).toBe(expectMeta[index].name) + expect(meta.type).toBe(expectMeta[index].type) + expect(meta.length).toBe(expectMeta[index].length) + }) + + for (let i = 0; i < actualData.length; i++) { + actualData[i].forEach((d, index) => { + if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { + expect(d).toBeTruthy() + } else { + expect(d).toBe(expectData[i][index]) + } + }) + } + } else { + throw new Error("retrieve empty result") + } + }) + + test('Insert query normal table with CN character', async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(useDB); + let insertCN = insertNTable(tableCNValues, tableCN) + // console.log(insertCN) + let insertRes = await ws.Exec(insertCN) + // console.log(insertRes) + expect(insertRes.GetAffectRows()).toBe(5) + + let queryRes = await ws.Exec(selectTableCN) + + let expectMeta = tableMeta + let expectData = tableCNValues + let actualMeta = queryRes.GetMeta() + let actualData = queryRes.GetData() + ws.Close() + if (actualData && actualMeta) { + actualMeta.forEach((meta, index) => { + // console.log(meta, expectMeta[index]); + + expect(meta.name).toBe(expectMeta[index].name) + expect(meta.type).toBe(expectMeta[index].type) + expect(meta.length).toBe(expectMeta[index].length) + }) + + for (let i = 0; i < actualData.length; i++) { + actualData[i].forEach((d, index) => { + if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { + expect(d).toBeTruthy() + } else { + expect(d).toBe(expectData[i][index]) + } + + }) + } + } else { + throw new Error("retrieve empty result") + } + }) +}) + +describe('ws.query(jsonTable)', () => { + test('Insert and query json data from table without CN', async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(useDB); + let insert = insertStable(tableValues, jsonTags, jsonTable) + // console.log(insert) + + let insertRes = await ws.Exec(insert); + expect(insertRes.GetAffectRows()).toBe(5) + + let queryRes = await ws.Exec(selectJsonTable) + let expectMeta = tableMeta.concat(jsonMeta) + let expectData = expectStableData(tableValues, jsonTags) + let actualMeta = queryRes.GetMeta() + let actualData = queryRes.GetData() + ws.Close() + if (actualData && actualMeta) { + actualMeta.forEach((meta, index) => { + // console.log(meta); + expect(meta.name).toBe(expectMeta[index].name) + expect(meta.type).toBe(expectMeta[index].type) + expect(meta.length).toBe(expectMeta[index].length) + }) + + for (let i = 0; i < actualData.length; i++) { + actualData[i].forEach((d, index) => { + if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { + expect(d).toBeTruthy() + } else { + expect(d).toBe(expectData[i][index]) + } + }) + } + } else { + throw new Error("retrieve empty result") + } + + }) + + + test('Insert and query json data from table with CN', async () => { + let ws = await WsSql.Open(conf); + await ws.Exec(useDB); + let insert = insertStable(tableCNValues, jsonTagsCN, jsonTableCN) + // console.log(insert) + + let insertRes = await ws.Exec(insert); + expect(insertRes.GetAffectRows()).toBe(5) + + let queryRes = await ws.Exec(selectJsonTableCN) + let expectMeta = tableMeta.concat(jsonMeta) + let expectData = expectStableData(tableCNValues, jsonTagsCN) + let actualMeta = queryRes.GetMeta() + let actualData = queryRes.GetData() + ws.Close() + if (actualData && actualMeta) { + actualMeta.forEach((meta, index) => { + // console.log(meta); + expect(meta.name).toBe(expectMeta[index].name) + expect(meta.type).toBe(expectMeta[index].type) + expect(meta.length).toBe(expectMeta[index].length) + }) + + for (let i = 0; i < actualData.length; i++) { + actualData[i].forEach((d, index) => { + if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { + expect(d).toBeTruthy() + } else { + expect(d).toBe(expectData[i][index]) + } + }) + } + } else { + throw new Error("retrieve empty result") + } + }) + +}) + +//--detectOpenHandles --maxConcurrency=1 --forceExit \ No newline at end of file diff --git a/nodejs/test/bulkPulling/schemaless.test.ts b/nodejs/test/bulkPulling/schemaless.test.ts new file mode 100644 index 0000000..04c0618 --- /dev/null +++ b/nodejs/test/bulkPulling/schemaless.test.ts @@ -0,0 +1,103 @@ +import { WSConfig } from "../../src/common/config"; +import { Precision, SchemalessProto } from "../../src/sql/wsProto"; +import { WsSql } from "../../src/sql/wsSql"; + + + + +beforeAll(async () => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + + let wsSql = await WsSql.Open(conf) + await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); + await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); + wsSql.Close() +}) + + +describe('TDWebSocket.WsSchemaless()', () => { + jest.setTimeout(20 * 1000) + let influxdbData = "st,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000" + let telnetData = "stb0_0 1626006833 4 host=host0 interface=eth0" + let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}" + + test('normal connect', async() => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + conf.SetDb('power') + let wsSchemaless = await WsSql.Open(conf) + expect(wsSchemaless.State()).toBeGreaterThan(0) + wsSchemaless.Close(); + }); + + test('connect db with error', async() => { + expect.assertions(1) + let wsSchemaless = null; + try { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + conf.SetDb('jest') + wsSchemaless = await WsSql.Open(conf) + }catch(e :any){ + console.log(e) + expect(e.message).toMatch('Database not exist') + }finally{ + if(wsSchemaless) { + wsSchemaless.Close() + } + } + }) + + test('normal insert', async() => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + conf.SetDb('power') + let wsSchemaless = await WsSql.Open(conf) + expect(wsSchemaless.State()).toBeGreaterThan(0) + await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NANO_SECONDS, 0); + await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); + await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); + wsSchemaless.Close(); + }); + + test('normal wsSql insert', async() => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + conf.SetDb('power') + let wsSchemaless = await WsSql.Open(conf) + expect(wsSchemaless.State()).toBeGreaterThan(0) + await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NOT_CONFIGURED, 0); + await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NANO_SECONDS, 0); + await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); + await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); + wsSchemaless.Close(); + }); + + test('SchemalessProto error', async() => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + conf.SetDb('power') + let wsSchemaless = await WsSql.Open(conf) + expect(wsSchemaless.State()).toBeGreaterThan(0) + try { + await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.NANO_SECONDS, 0); + }catch (e:any) { + expect(e.message).toMatch('invalid timestamp') + } + + wsSchemaless.Close(); + }); +}) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/sql.test.ts b/nodejs/test/bulkPulling/sql.test.ts new file mode 100644 index 0000000..12db9ca --- /dev/null +++ b/nodejs/test/bulkPulling/sql.test.ts @@ -0,0 +1,128 @@ +import { WSConfig } from "../../src/common/config"; +import { WsSql } from "../../src/sql/wsSql"; + +beforeAll(async () => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + let wsSql = await WsSql.Open(conf) + await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); + await wsSql.Exec('use power') + await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); + wsSql.Close() +}) + +describe('TDWebSocket.WsSql()', () => { + jest.setTimeout(20 * 1000) + test('normal connect', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsSql = null; + let conf :WSConfig = new WSConfig(dsn) + conf.SetDb('power') + wsSql = await WsSql.Open(conf) + expect(wsSql.State()).toBeGreaterThan(0) + wsSql.Close(); + }); + + test('connect db with error', async() => { + expect.assertions(1) + let wsSql = null; + try { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + conf.SetDb('jest') + wsSql = await WsSql.Open(conf) + }catch(e){ + let err:any = e + expect(err.message).toMatch('Database not exist') + }finally{ + if(wsSql) { + wsSql.Close() + } + } + }) + test('get taosc version', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await WsSql.Open(conf) + let version = await wsSql.Version() + wsSql.Close() + console.log(version); + expect(version).toBeTruthy() + }) + + test('show databases', async()=>{ + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await WsSql.Open(conf) + let taosResult = await wsSql.Exec('show databases') + wsSql.Close() + console.log(taosResult); + expect(taosResult).toBeTruthy() + }) + + test('create databases', async()=>{ + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await WsSql.Open(conf) + let taosResult = await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;') + wsSql.Close() + console.log(taosResult); + expect(taosResult).toBeTruthy() + }) + + test('create stable', async()=>{ + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await WsSql.Open(conf) + let taosResult = await wsSql.Exec('use power') + console.log(taosResult); + expect(taosResult).toBeTruthy() + + taosResult = await wsSql.Exec('CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); + wsSql.Close() + console.log(taosResult); + expect(taosResult).toBeTruthy() + }) + + test('insert recoder', async()=>{ + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await WsSql.Open(conf) + let taosResult = await wsSql.Exec('use power') + console.log(taosResult); + expect(taosResult).toBeTruthy() + + taosResult = await wsSql.Exec('describe meters') + console.log(taosResult); + + taosResult = await wsSql.Exec('INSERT INTO d1001 USING meters (location, groupid) TAGS ("California.SanFrancisco", 3) VALUES (NOW, 10.2, 219, 0.32)') + console.log(taosResult); + expect(taosResult.GetAffectRows()).toBeGreaterThanOrEqual(1) + + }) + + test('query sql', async()=>{ + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let wsSql = await WsSql.Open(conf) + let taosResult = await wsSql.Exec('use power') + console.log(taosResult); + expect(taosResult).toBeTruthy() + for (let i = 0; i < 10; i++) { + let wsRows = await wsSql.Query('select * from meters limit 3'); + expect(wsRows).toBeTruthy() + let meta = wsRows.GetMeta() + expect(meta).toBeTruthy() + console.log("wsRow:meta:=>", meta); + while (await wsRows.Next()) { + let result = await wsRows.GetData(); + expect(result).toBeTruthy() + } + wsRows.Close() + } + + wsSql.Close() + }) +}) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/stmt.func.test.ts b/nodejs/test/bulkPulling/stmt.func.test.ts new file mode 100644 index 0000000..ebd77f9 --- /dev/null +++ b/nodejs/test/bulkPulling/stmt.func.test.ts @@ -0,0 +1,389 @@ +import { WSConfig } from "../../src/common/config"; +import { WsSql } from "../../src/sql/wsSql"; + +beforeAll(async () => { + let dns = 'ws://192.168.1.95:6041/ws' + let conf :WSConfig = new WSConfig(dns) + conf.SetUser('root') + conf.SetPwd('taosdata') + let wsSql = await WsSql.Open(conf) + await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); + await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); + wsSql.Close() +}) +describe('TDWebSocket.Stmt()', () => { + jest.setTimeout(20 * 1000) + let tags = ['California.SanFrancisco', 3]; + let multi = [ + // [1709183268567], + // [10.2], + // [292], + // [0.32], + [1709183268567, 1709183268568, 1709183268569], + [10.2, 10.3, 10.4], + [292, 293, 294], + [0.32, 0.33, 0.34], + ]; + test('normal connect', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + stmt.Close() + connector.Close(); + }); + + test('connect db with error', async() => { + expect.assertions(1) + let connector = null; + try { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf :WSConfig = new WSConfig(dsn) + wsConf.SetDb('jest') + connector = await WsSql.Open(wsConf) + await connector.StmtInit() + }catch(e){ + let err:any = e + expect(err.message).toMatch('Database not exist') + }finally{ + if(connector) { + connector.Close() + } + } + }) + + test('normal Prepare', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn([tags[0]]); + params.SetIntColumn([tags[1]]); + await stmt.SetBinaryTags(params) + stmt.Close() + connector.Close(); + }); + + test('set tag error', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn([tags[0]]); + try { + await stmt.SetBinaryTags(params) + } catch(err:any) { + expect(err.message).toMatch('stmt tags count not match') + } + stmt.Close() + connector.Close(); + }); + + test('error Prepare table', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + try{ + await stmt.Prepare('INSERT ? INTO ? USING powr.meters TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + }catch(e) { + let err:any = e + expect(err.message).toMatch("syntax error near '? into ? using powr.meters tags (?, ?) values (?, ?, ?, ?)' (keyword INTO is expected)") + } + stmt.Close() + connector.Close(); + }); + + test('error Prepare tag', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + try{ + await stmt.Prepare('INSERT INTO ? USING powr.meters TAGS (?, ?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + }catch(e) { + let err:any = e + expect(err.message).toMatch("Database not exist") + } + stmt.Close() + connector.Close(); + }); + + test('normal BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + // let connector = WsStmtConnect.NewConnector(wsConf) + // let stmt = await connector.Init() + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + + let params = stmt.NewStmtParam() + params.SetVarcharColumn(['SanFrancisco']); + params.SetIntColumn([7]); + await stmt.SetBinaryTags(params) + + let lastTs = 0 + const allp:any[] = [] + for (let i = 0; i < 10; i++) { + for (let j = 0; j < multi[0].length; j++) { + multi[0][j] = multi[0][0] + j; + lastTs = multi[0][j] + } + + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi[0]) + dataParams.SetFloatColumn(multi[1]) + dataParams.SetIntColumn(multi[2]) + dataParams.SetFloatColumn(multi[3]) + allp.push(stmt.BinaryBind(dataParams)) + multi[0][0] = lastTs + 1 + + } + await Promise.all(allp) + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(30) + stmt.Close() + connector.Close(); + }); + + + test('error BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn(['SanFrancisco']); + params.SetIntColumn([7]); + await stmt.SetBinaryTags(params) + let multi = [ + [1709183268567, 1709183268568], + [10.2, 10.3, 10.4, 10.5], + [292, 293, 294], + [0.32, 0.33, 0.31], + ]; + try{ + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi[0]) + dataParams.SetFloatColumn(multi[1]) + dataParams.SetIntColumn(multi[2]) + dataParams.SetFloatColumn(multi[3]) + await stmt.BinaryBind(dataParams) + await stmt.Batch() + await stmt.Exec() + }catch(e) { + let err:any = e + expect(err.message).toMatch("wrong row length") + } + stmt.Close() + connector.Close(); + }); + + test('no Batch', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn(['SanFrancisco']); + params.SetIntColumn([7]); + await stmt.SetBinaryTags(params) + let multi = [ + [1709183268567, 1709183268568], + [10.2, 10.3], + [292, 293], + [0.32, 0.33], + ]; + try{ + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi[0]) + dataParams.SetFloatColumn(multi[1]) + dataParams.SetIntColumn(multi[2]) + dataParams.SetFloatColumn(multi[3]) + await stmt.BinaryBind(dataParams) + await stmt.Exec() + }catch(e) { + let err:any = e + expect(err.message).toMatch("Stmt API usage error") + } + stmt.Close() + connector.Close(); + }); + + test('Batch after BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn(['SanFrancisco']); + params.SetIntColumn([7]); + await stmt.SetBinaryTags(params) + let multi1 = [ + [1709188881548, 1709188881549], + [10.2, 10.3], + [292, 293], + [0.32, 0.33], + ]; + let multi2 = [ + [1709188881550, 1709188881551], + [10.2, 10.3], + [292, 293], + [0.32, 0.33], + ]; + + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi1[0]) + dataParams.SetFloatColumn(multi1[1]) + dataParams.SetIntColumn(multi1[2]) + dataParams.SetFloatColumn(multi1[3]) + await stmt.BinaryBind(dataParams) + await stmt.Batch() + + dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi2[0]) + dataParams.SetFloatColumn(multi2[1]) + dataParams.SetIntColumn(multi2[2]) + dataParams.SetFloatColumn(multi2[3]) + await stmt.BinaryBind(dataParams) + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(4) + stmt.Close() + connector.Close(); + }); + + test('no set tag', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + // await stmt.SetTags(tags) + try{ + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi[0]) + dataParams.SetFloatColumn(multi[1]) + dataParams.SetIntColumn(multi[2]) + dataParams.SetFloatColumn(multi[3]) + await stmt.BinaryBind(dataParams) + await stmt.Batch() + await stmt.Exec() + }catch(e) { + let err:any = e + expect(err.message).toMatch("Retry needed") + } + stmt.Close() + connector.Close(); + }); + + test('normal binary BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1002'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn(['SanFrancisco']); + params.SetIntColumn([7]); + await stmt.SetBinaryTags(params) + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi[0]) + dataParams.SetFloatColumn(multi[1]) + dataParams.SetIntColumn(multi[2]) + dataParams.SetFloatColumn(multi[3]) + await stmt.BinaryBind(dataParams) + + await stmt.Batch() + await stmt.Exec() + stmt.Close() + + let result = await connector.Exec("select * from power.meters") + console.log(result) + connector.Close(); + + }); + + test('normal json BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + let params = stmt.NewStmtParam() + params.SetVarcharColumn(['SanFrancisco']); + params.SetIntColumn([7]); + await stmt.SetBinaryTags(params) + let multi1 = [ + [1709188881548, 1709188881549], + [10.2, 10.3], + [292, 293], + [0.32, 0.33], + ]; + let dataParams = stmt.NewStmtParam() + dataParams.SetTimestampColumn(multi1[0]) + dataParams.SetFloatColumn(multi1[1]) + dataParams.SetIntColumn(multi1[2]) + dataParams.SetFloatColumn(multi1[3]) + await stmt.BinaryBind(dataParams) + await stmt.Batch() + await stmt.Exec() + stmt.Close() + connector.Close(); + }); +}) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/stmt.type.test.ts b/nodejs/test/bulkPulling/stmt.type.test.ts new file mode 100644 index 0000000..0c2767d --- /dev/null +++ b/nodejs/test/bulkPulling/stmt.type.test.ts @@ -0,0 +1,301 @@ +import { WSConfig } from "../../src/common/config"; +import { WsSql } from "../../src/sql/wsSql"; +import { createBaseSTable, createBaseSTableJSON, createSTableJSON, getInsertBind } from "../utils"; + +const stable = 'ws_stmt_stb'; +const table = 'stmt_001'; +const db = 'ws_stmt' +const createDB = `create database if not exists ${db} keep 3650` +const useDB = `use ${db}` +const dropDB = `drop database if exists ${db}` + +const tableCN = 'stmt_cn'; +const stableCN = 'ws_stmt_stb_cn'; +const jsonTable = 'stmt_json'; +const jsonTableCN = 'stmt_json_cn'; + + +const stableTags = [true, -1, -2, -3, -4, 1, 2, 3, 4, parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_tag_1', 'nchar_tag_1'] +const stableCNTags = [false, -1 * 2, -2 * 2, -3 * 2, -4 * 2, 1 * 2, 2 * 2, 3 * 2, 4 * 2, parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_标签_壹', 'nchar_标签_贰'] + +const tableValues = [ + [1656677710000, 1656677720000, 1656677730000, 1656677740000, 1656677750000], + [0, -1, -2, -3, -4], + [-1, -2,-3, -4, -5], + [-3, -4,-5, -6, -7], + + // [0, 1, 2, 3, 4], + [BigInt(-2), BigInt(-3), BigInt(-4), BigInt(-5), BigInt(-6)], + + [0, 1, 2, 3, 4], + [1, 2, 3, 4,5], + [2, 3, 4,5, 6], + + // [0, 1, 2, 3, 4], + [BigInt(3), BigInt(4), BigInt(5), BigInt(6), BigInt(7)], + + [parseFloat(3.1415.toFixed(5)), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.1415 * 5).toFixed(5))], + [parseFloat(3.14159265.toFixed(15)), parseFloat((3.14159265 * 2).toFixed(15)), parseFloat((3.14159265 * 3).toFixed(15)), parseFloat((3.14159265 * 4).toFixed(15)), parseFloat((3.14159265 * 5).toFixed(15))], + ['varchar_col_1', 'varchar_col_2', 'varchar_col_3', 'varchar_col_4', 'varchar_col_5' ], + ['nchar_col_1', 'nchar_col_2', '', 'nchar_col_4', 'nchar_col_5'], + [true, false, true, false, true], + [null, null, null, null, null] +] + +const tableCNValues = [ + [BigInt(1656677760000), BigInt(1656677770000), BigInt(1656677780000), BigInt(1656677790000), BigInt(1656677100000)], + [0, -1, -2, -3, -4], + [-1, -2,-3, -4, -5], + [ -2, -3, -4,-5, -6], + [BigInt(-3), BigInt(-4),BigInt(-5), BigInt(-6), BigInt(-7)], + [0, 1, 2, 3, 4], + [1, 2, 3, 4,5], + [2, 3, 4,5, 6], + [BigInt(3), BigInt(4), BigInt(5), BigInt(6), BigInt(7)], + [parseFloat(3.1415.toFixed(5)), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.1415 * 5).toFixed(5))], + [parseFloat(3.14159265.toFixed(15)), parseFloat((3.14159265 * 2).toFixed(15)), parseFloat((3.14159265 * 3).toFixed(15)), parseFloat((3.14159265 * 4).toFixed(15)), parseFloat((3.14159265 * 5).toFixed(15))], + ['varchar_列_壹','varchar_列_贰','varchar_列_叁','varchar_列_肆','varchar_列_伍'], + ['nchar_列_甲','nchar_列_乙','nchar_列_丙','nchar_列_丁','nchar_列_戊'], + [true, false, true, false, true], + [null, null, null, null, null], +] + +let geoDataArray:any[] = []; +let varbinary:any[] = []; +const encoder = new TextEncoder(); +for (let i = 0; i< 5; i++) { + let data = new Uint8Array([0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x59,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x40,]) + geoDataArray.push(data.buffer) ; + let vdata = encoder.encode(`varchar_col_${i+1}`) + varbinary.push(vdata.buffer) +} + +const jsonTags = ["{\"key1\":\"taos\",\"key2\":null,\"key3\":\"TDengine\",\"key4\":0,\"key5\":false}"] +const jsonTagsCN = ["{\"key1\":\"taosdata\",\"key2\":null,\"key3\":\"TDengine涛思数据\",\"key4\":1,\"key5\":true}"] + +const selectStable = `select * from ${stable}` +const selectStableCN = `select * from ${stableCN}` +const selectTable = `select * from ${table}` +const selectTableCN = `select * from ${tableCN}` +const selectJsonTable = `select * from ${jsonTable}` +const selectJsonTableCN = `select * from ${jsonTableCN}` + + +beforeAll(async () => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let ws = await WsSql.Open(conf); + await ws.Exec(dropDB); + await ws.Exec(createDB); + await ws.Exec(useDB); + await ws.Exec(createBaseSTable(stable)); + await ws.Exec(createSTableJSON(jsonTable)); + ws.Close() +}) + +describe('TDWebSocket.Stmt()', () => { + jest.setTimeout(20 * 1000) + test('normal BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb(db) + let connector = await WsSql.Open(wsConf) + let stmt = await (await connector).StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare(getInsertBind(tableValues.length + 2, stableTags.length, db, stable)); + await stmt.SetTableName(table); + let tagParams = stmt.NewStmtParam(); + tagParams.SetBooleanColumn([stableTags[0]]) + tagParams.SetTinyIntColumn([stableTags[1]]) + tagParams.SetSmallIntColumn([stableTags[2]]) + tagParams.SetIntColumn([stableTags[3]]) + tagParams.SetBigIntColumn([BigInt(stableTags[4])]) + tagParams.SetUTinyIntColumn([stableTags[5]]) + + tagParams.SetUSmallIntColumn([stableTags[6]]) + tagParams.SetUIntColumn([stableTags[7]]) + tagParams.SetUBigIntColumn([BigInt(stableTags[8])]) + tagParams.SetFloatColumn([stableTags[9]]) + tagParams.SetDoubleColumn([stableTags[10]]) + tagParams.SetBinaryColumn([stableTags[11]]) + tagParams.SetNcharColumn([stableTags[12]]) + await stmt.SetBinaryTags(tagParams); + + let bindParams = stmt.NewStmtParam(); + bindParams.SetTimestampColumn(tableValues[0]) + bindParams.SetTinyIntColumn(tableValues[1]) + bindParams.SetSmallIntColumn(tableValues[2]) + bindParams.SetIntColumn(tableValues[3]) + bindParams.SetBigIntColumn(tableValues[4]) + bindParams.SetUTinyIntColumn(tableValues[5]) + bindParams.SetUSmallIntColumn(tableValues[6]) + bindParams.SetUIntColumn(tableValues[7]) + bindParams.SetUBigIntColumn(tableValues[8]) + bindParams.SetFloatColumn(tableValues[9]) + bindParams.SetDoubleColumn(tableValues[10]) + + bindParams.SetBinaryColumn(tableValues[11]) + bindParams.SetNcharColumn(tableValues[12]) + bindParams.SetBooleanColumn(tableValues[13]) + bindParams.SetIntColumn(tableValues[14]) + bindParams.SetGeometryColumn(geoDataArray) + bindParams.SetVarBinaryColumn(varbinary) + + await stmt.BinaryBind(bindParams); + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(5) + await stmt.Close() + let result = await connector.Exec(`select * from ${db}.${stable}`) + console.log(result) + connector.Close(); + }); + + test('normal CN BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb(db) + let connector = await WsSql.Open(wsConf) + let stmt = await (await connector).StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare(getInsertBind(tableValues.length + 2, stableTags.length, db, stable)); + await stmt.SetTableName(table); + let tagParams = stmt.NewStmtParam(); + tagParams.SetBooleanColumn([stableCNTags[0]]) + tagParams.SetTinyIntColumn([stableCNTags[1]]) + tagParams.SetSmallIntColumn([stableCNTags[2]]) + tagParams.SetIntColumn([stableCNTags[3]]) + tagParams.SetBigIntColumn([BigInt(stableCNTags[4])]) + tagParams.SetUTinyIntColumn([stableCNTags[5]]) + + tagParams.SetUSmallIntColumn([stableCNTags[6]]) + tagParams.SetUIntColumn([stableCNTags[7]]) + tagParams.SetUBigIntColumn([BigInt(stableCNTags[8])]) + tagParams.SetFloatColumn([stableCNTags[9]]) + tagParams.SetDoubleColumn([stableCNTags[10]]) + tagParams.SetBinaryColumn([stableCNTags[11]]) + tagParams.SetNcharColumn([stableCNTags[12]]) + await stmt.SetBinaryTags(tagParams); + + let bindParams = stmt.NewStmtParam(); + bindParams.SetTimestampColumn(tableCNValues[0]) + bindParams.SetTinyIntColumn(tableCNValues[1]) + bindParams.SetSmallIntColumn(tableCNValues[2]) + bindParams.SetIntColumn(tableCNValues[3]) + bindParams.SetBigIntColumn(tableCNValues[4]) + bindParams.SetUTinyIntColumn(tableCNValues[5]) + bindParams.SetUSmallIntColumn(tableCNValues[6]) + bindParams.SetUIntColumn(tableCNValues[7]) + bindParams.SetUBigIntColumn(tableCNValues[8]) + bindParams.SetFloatColumn(tableCNValues[9]) + bindParams.SetDoubleColumn(tableCNValues[10]) + + bindParams.SetBinaryColumn(tableCNValues[11]) + bindParams.SetNcharColumn(tableCNValues[12]) + bindParams.SetBooleanColumn(tableCNValues[13]) + bindParams.SetIntColumn(tableCNValues[14]) + bindParams.SetGeometryColumn(geoDataArray) + bindParams.SetVarBinaryColumn(varbinary) + + await stmt.BinaryBind(bindParams); + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(5) + await stmt.Close() + let result = await connector.Exec(`select * from ${db}.${stable}`) + console.log(result) + connector.Close(); + }); + + test('normal json tag BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb(db) + let connector = await WsSql.Open(wsConf) + let stmt = await (await connector).StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare(getInsertBind(tableValues.length + 2, jsonTags.length, db, jsonTable)); + await stmt.SetTableName(`${jsonTable}_001`); + let tagParams = stmt.NewStmtParam(); + tagParams.SetJsonColumn(jsonTags); + await stmt.SetBinaryTags(tagParams); + + let bindParams = stmt.NewStmtParam(); + bindParams.SetTimestampColumn(tableCNValues[0]) + bindParams.SetTinyIntColumn(tableCNValues[1]) + bindParams.SetSmallIntColumn(tableCNValues[2]) + bindParams.SetIntColumn(tableCNValues[3]) + bindParams.SetBigIntColumn(tableCNValues[4]) + bindParams.SetUTinyIntColumn(tableCNValues[5]) + bindParams.SetUSmallIntColumn(tableCNValues[6]) + bindParams.SetUIntColumn(tableCNValues[7]) + bindParams.SetUBigIntColumn(tableCNValues[8]) + bindParams.SetFloatColumn(tableCNValues[9]) + bindParams.SetDoubleColumn(tableCNValues[10]) + + bindParams.SetBinaryColumn(tableCNValues[11]) + bindParams.SetNcharColumn(tableCNValues[12]) + bindParams.SetBooleanColumn(tableCNValues[13]) + bindParams.SetIntColumn(tableCNValues[14]) + bindParams.SetGeometryColumn(geoDataArray) + bindParams.SetVarBinaryColumn(varbinary) + + await stmt.BinaryBind(bindParams); + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(5) + await stmt.Close() + let result = await connector.Exec(`select * from ${db}.${jsonTable}`) + console.log(result) + connector.Close(); + }); + + test('normal json cn tag BindParam', async() => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb(db) + let connector = await WsSql.Open(wsConf) + let stmt = await (await connector).StmtInit() + expect(stmt).toBeTruthy() + expect(connector.State()).toBeGreaterThan(0) + await stmt.Prepare(getInsertBind(tableValues.length + 2, jsonTags.length, db, jsonTable)); + await stmt.SetTableName(`${jsonTable}_001`); + let tagParams = stmt.NewStmtParam(); + tagParams.SetJsonColumn(jsonTagsCN); + await stmt.SetBinaryTags(tagParams); + + let bindParams = stmt.NewStmtParam(); + bindParams.SetTimestampColumn(tableCNValues[0]) + bindParams.SetTinyIntColumn(tableCNValues[1]) + bindParams.SetSmallIntColumn(tableCNValues[2]) + bindParams.SetIntColumn(tableCNValues[3]) + bindParams.SetBigIntColumn(tableCNValues[4]) + bindParams.SetUTinyIntColumn(tableCNValues[5]) + bindParams.SetUSmallIntColumn(tableCNValues[6]) + bindParams.SetUIntColumn(tableCNValues[7]) + bindParams.SetUBigIntColumn(tableCNValues[8]) + bindParams.SetFloatColumn(tableCNValues[9]) + bindParams.SetDoubleColumn(tableCNValues[10]) + + bindParams.SetBinaryColumn(tableCNValues[11]) + bindParams.SetNcharColumn(tableCNValues[12]) + bindParams.SetBooleanColumn(tableCNValues[13]) + bindParams.SetIntColumn(tableCNValues[14]) + bindParams.SetGeometryColumn(geoDataArray) + bindParams.SetVarBinaryColumn(varbinary) + + await stmt.BinaryBind(bindParams); + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(5) + await stmt.Close() + let result = await connector.Exec(`select * from ${db}.${jsonTable}`) + console.log(result) + connector.Close(); + }); + +}) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/tmq.test.ts b/nodejs/test/bulkPulling/tmq.test.ts new file mode 100644 index 0000000..b36a6ee --- /dev/null +++ b/nodejs/test/bulkPulling/tmq.test.ts @@ -0,0 +1,191 @@ + +import { TMQConstants } from "../../src/tmq/constant"; +import { WsConsumer } from "../../src/tmq/wsTmq"; +import { WSConfig } from "../../src/common/config"; +import { WsSql } from "../../src/sql/wsSql"; +import { createSTable, insertStable } from "../utils"; +const stable = 'st'; +const db = 'ws_tmq_test' +const topics:string[] = ['topic_ws_bean'] +// const topic2 = 'topic_ws_bean_2' +// let createTopic = `create topic if not exists ${topic} as select ts, c1, c2, c3, c4, c5, t1 from ${db}.${stable}` +// let createTopic2 = `create topic if not exists ${topic2} as select ts, c1, c4, c5, t1 from ${db}.${stable}` +let createTopic = `create topic if not exists ${topics[0]} as select * from ${db}.${stable}` +let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};` +// let dropTopic2 = `DROP TOPIC IF EXISTS ${topic2};` +beforeAll(async () => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + const createDB = `create database if not exists ${db} keep 3650` + const dropDB = `drop database if exists ${db}` + const useDB = `use ${db}` + + const stableTags = [true, -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_tag_1', 'nchar_tag_1'] + + const tableValues = [ + [BigInt(1656677710000), 0, -1, -2, BigInt(-3), 0, 1, 2, BigInt(3), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_col_1', 'nchar_col_1', true, 'NULL', 'POINT (4.0 8.0)', '0x7661726332'], + [BigInt(1656677720000), -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_col_2', 'nchar_col_2', false, 'NULL', 'POINT (3.0 5.0)', '0x7661726333'], + [BigInt(1656677730000), -2, -3, -4, BigInt(-5), 2, 3, 4, BigInt(5), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.14159265 * 3).toFixed(15)), 'varchar_col_3', 'nchar_col_3', true, 'NULL', 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)', '0x7661726334'], + [BigInt(1656677740000), -3, -4, -5, BigInt(-6), 3, 4, 5, BigInt(6), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.14159265 * 4).toFixed(15)), 'varchar_col_4', 'nchar_col_4', false, 'NULL', 'POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))', '0x7661726335'], + [BigInt(1656677750000), -4, -5, -6, BigInt(-7), 4, 5, 6, BigInt(7), parseFloat((3.1415 * 5).toFixed(5)), parseFloat((3.14159265 * 5).toFixed(15)), 'varchar_col_5', 'nchar_col_5', true, 'NULL', 'POINT (7.0 9.0)', '0x7661726335'], + ] + + const tableCNValues = [ + [BigInt(1656677760000), 0, -1, -2, BigInt(-3), 0, 1, 2, BigInt(3), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_列_壹', 'nchar_列_甲', true, 'NULL', 'POINT (4.0 8.0)', '0x7661726332'], + [BigInt(1656677770000), -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_列_贰', 'nchar_列_乙', false, 'NULL', 'POINT (3.0 5.0)', '0x7661726333'], + [BigInt(1656677780000), -2, -3, -4, BigInt(-5), 2, 3, 4, BigInt(5), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.14159265 * 3).toFixed(15)), 'varchar_列_叁', 'nchar_列_丙', true, 'NULL', 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)', '0x7661726334'], + [BigInt(1656677790000), -3, -4, -5, BigInt(-6), 3, 4, 5, BigInt(6), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.14159265 * 4).toFixed(15)), 'varchar_列_肆', 'nchar_列_丁', false, 'NULL', 'POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))', '0x7661726335'], + [BigInt(1656677800000), -4, -5, -6, BigInt(-7), 4, 5, 6, BigInt(7), parseFloat((3.1415 * 5).toFixed(5)), parseFloat((3.14159265 * 5).toFixed(15)), 'varchar_列_伍', 'nchar_列_戊', true, 'NULL', 'POINT (7.0 9.0)', '0x7661726335'], + ] + + let ws = await WsSql.Open(conf); + await ws.Exec(dropTopic); + // await ws.Exec(dropTopic2); + await ws.Exec(dropDB); + await ws.Exec(createDB); + await ws.Exec(useDB); + await ws.Exec(createSTable(stable)); + await ws.Exec(createTopic); + // await ws.Exec(createTopic2); + let insert = insertStable(tableValues, stableTags, stable) + let insertRes = await ws.Exec(insert) + insert = insertStable(tableCNValues, stableTags, stable) + insertRes = await ws.Exec(insert) + ws.Close() +}) + + +describe('TDWebSocket.Tmq()', () => { + jest.setTimeout(20 * 1000) + let configMap = new Map([ + [TMQConstants.GROUP_ID, "gId"], + [TMQConstants.CONNECT_USER, "root"], + [TMQConstants.CONNECT_PASS, "taosdata"], + [TMQConstants.AUTO_OFFSET_RESET, "earliest"], + [TMQConstants.CLIENT_ID, 'test_tmq_client'], + [TMQConstants.WS_URL, 'ws://192.168.1.95:6041/rest/tmq'], + [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], + [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] + ]); + + + test('normal connect', async() => { + // let dsn = 'ws://root:taosdata@192.168.1.95:6041/rest/tmq'; + // configMap.set(TMQConstants.WS_URL, dsn) + let consumer = await WsConsumer.NewConsumer(configMap); + consumer.Close(); + }); + + test('connect error', async() => { + expect.assertions(1) + let consumer = null; + let errConfigMap = new Map([ + [TMQConstants.GROUP_ID, "test"], + [TMQConstants.CONNECT_USER, "root"], + [TMQConstants.CONNECT_PASS, "test"], + [TMQConstants.AUTO_OFFSET_RESET, "earliest1"], + [TMQConstants.CLIENT_ID, 'test_tmq_client'], + [TMQConstants.WS_URL, 'ws://192.168.1.95:6041/rest/tmq'], + [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], + [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] + ]); + try { + consumer = await WsConsumer.NewConsumer(errConfigMap); + await consumer.Subscribe(topics); + }catch(e :any){ + expect(e.message).toMatch('fail') + }finally{ + if(consumer) { + consumer.Close() + } + } + }) + + test('normal Subscribe', async() => { + + // let dsn = 'ws://root:taosdata@192.168.1.95:6041/rest/tmq'; + // configMap.set(TMQConstants.WS_URL, dsn) + let consumer = await WsConsumer.NewConsumer(configMap); + await consumer.Subscribe(topics); + + let assignment = await consumer.Assignment() + console.log(assignment) + let counts:number[]=[0, 0] + let useTime:number[] = []; + for (let i = 0; i < 5; i++) { + let startTime = new Date().getTime(); + let res = await consumer.Poll(500); + let currTime = new Date().getTime(); + useTime.push(Math.abs(currTime - startTime)); + for (let [key, value] of res) { + let data = value.GetData() + if (data) { + counts[0] += data.length; + } + } + if (res.size == 0) { + break; + } + + // await Sleep(100) + } + + await consumer.SeekToBeginning(assignment) + + for (let i = 0; i < 5; i++) { + let startTime = new Date().getTime(); + let res = await consumer.Poll(500); + let currTime = new Date().getTime(); + useTime.push(Math.abs(currTime - startTime)); + for (let [key, value] of res) { + let data = value.GetData() + if (data) { + counts[1] += data.length; + } + } + if (res.size == 0) { + break; + } + // await Sleep(100) + } + assignment = await consumer.Commit(); + console.log(assignment) + assignment = await consumer.Commited(assignment) + console.log(assignment) + await consumer.Unsubscribe() + consumer.Close(); + console.log("------------->", useTime) + console.log("------------->", counts) + expect(counts).toEqual([10, 10]) + }); + + test('Topic not exist', async() => { + let consumer = await WsConsumer.NewConsumer(configMap); + try { + await consumer.Subscribe(["aaa"]); + }catch(e:any) { + expect(e.message).toMatch("Topic not exist"); + } + consumer.Close(); + }); + + test('normal seek', async() => { + let consumer = await WsConsumer.NewConsumer(configMap); + await consumer.Subscribe(topics); + let assignment = await consumer.Assignment() + console.log("------START--------",assignment) + + await consumer.SeekToEnd(assignment) + await consumer.SeekToBeginning(assignment) + await consumer.SeekToEnd(assignment) + assignment = await consumer.Assignment() + console.log("------END--------",assignment) + for (let i = 0; i< assignment.length; i++) { + expect(assignment[i].offset).toEqual(assignment[i].end) + } + + await consumer.Unsubscribe() + consumer.Close(); + }); + +}) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/wsConnectPool.test.ts b/nodejs/test/bulkPulling/wsConnectPool.test.ts new file mode 100644 index 0000000..c850706 --- /dev/null +++ b/nodejs/test/bulkPulling/wsConnectPool.test.ts @@ -0,0 +1,137 @@ +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; +import { WSConfig } from "../../src/common/config"; +import { ReqId } from "../../src/common/reqid"; +import { WsSql } from "../../src/sql/wsSql"; +import { TMQConstants } from "../../src/tmq/constant"; +import { WsConsumer } from "../../src/tmq/wsTmq"; + +let tags = ['California.SanFrancisco', 3]; +let multi = [ +[1709183268567, 1709183268568, 1709183268569], +[10.2, 10.3, 10.4], +[292, 293, 294], +[0.32, 0.33, 0.34], +]; + + +let configMap = new Map([ + [TMQConstants.GROUP_ID, "gId"], + [TMQConstants.CONNECT_USER, "root"], + [TMQConstants.CONNECT_PASS, "taosdata"], + [TMQConstants.AUTO_OFFSET_RESET, "earliest"], + [TMQConstants.CLIENT_ID, 'test_tmq_client'], + [TMQConstants.WS_URL, 'ws://192.168.1.95:6041/rest/tmq'], + [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], + [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] +]); +const stable = 'meters'; +const db = 'power' +const topics:string[] = ['pwer_meters_topic'] +let createTopic = `create topic if not exists ${topics[0]} as select * from ${db}.${stable}` +let stmtIds:number[] = [] + +async function connect() { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsSql = null; + let conf :WSConfig = new WSConfig(dsn) + conf.SetDb('power') + wsSql = await WsSql.Open(conf) + expect(wsSql.State()).toBeGreaterThan(0) + console.log(await wsSql.Version()) + wsSql.Close(); +} + +async function stmtConnect() { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let wsConf = new WSConfig(dsn); + wsConf.SetDb('power') + // let connector = WsStmtConnect.NewConnector(wsConf) + // let stmt = await connector.Init() + let connector = await WsSql.Open(wsConf) + let stmt = await connector.StmtInit() + let id = stmt.getStmtId() + if (id) { + stmtIds.push(id) + } + expect(stmt).toBeTruthy() + await stmt.Prepare('INSERT INTO ? USING power.meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); + await stmt.SetTableName('d1001'); + await stmt.SetTags(tags) + let lastTs = 0 + const allp:any[] = [] + for (let i = 0; i < 10; i++) { + for (let j = 0; j < multi[0].length; j++) { + multi[0][j] = multi[0][0] + j; + lastTs = multi[0][j] + } + allp.push(stmt.Bind(multi)) + multi[0][0] = lastTs + 1 + + } + await Promise.all(allp) + await stmt.Batch() + await stmt.Exec() + expect(stmt.GetLastAffected()).toEqual(30) + stmt.Close() + connector.Close(); +} + +async function tmqConnect() { + let consumer = null + try { + consumer = await WsConsumer.NewConsumer(configMap); + await consumer.Subscribe(topics); + + let res = await consumer.Poll(500); + for (let [key, value] of res) { + console.log(key, value); + } + + await consumer.Commit(); + + + let assignment = await consumer.Assignment() + console.log(assignment) + if (arguments && arguments.length > 0) + await consumer.SeekToBeginning(assignment) + + await consumer.Unsubscribe() + } catch (e) { + console.error(e); + } finally { + if (consumer) { + consumer.Close(); + } + } +} + +beforeAll(async () => { + let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let conf :WSConfig = new WSConfig(dsn) + let ws = await WsSql.Open(conf); + await ws.Exec(createTopic, ReqId.getReqID()); + ws.Close() +}) + +describe('TDWebSocket.WsSql()', () => { + jest.setTimeout(20 * 1000) + test('ReqId', async()=> { + const allp:any[] = [] + for (let i =0; i < 10; i++) { + allp.push(console.log(ReqId.getReqID())) + } + await Promise.all(allp) + }); + + test.skip('normal connect', async() => { + const allp:any[] = [] + for (let i =0; i < 20; i++) { + allp.push(connect()) + allp.push(stmtConnect()) + allp.push(tmqConnect()) + } + await Promise.all(allp) + WebSocketConnectionPool.Instance().Destroyed() + console.log(stmtIds) + }); +}) \ No newline at end of file diff --git a/nodejs/test/utils.ts b/nodejs/test/utils.ts new file mode 100644 index 0000000..6eff84d --- /dev/null +++ b/nodejs/test/utils.ts @@ -0,0 +1,305 @@ +import { TDengineMeta } from "../src/common/taosResult"; + + + +export function getInsertBind(valuesLen: number, tagsLen: number, db: string, stable: string): string { + let sql = `insert into ? using ${db}.${stable} tags ( ?` + + for (let i = 1; i < tagsLen; i++) { + sql += ', ?' + } + + sql += ') values( ?' + for (let i = 1; i < valuesLen; i++) { + sql += ', ?' + } + sql += ')' + return sql; +} + +export function insertStable(values: Array>, tags: Array, stable: string, table: string = 'empty'): string { + let childTable = table == 'empty' ? stable + '_s_01' : table; + let sql = `insert into ${childTable} using ${stable} tags (` + tags.forEach((tag) => { + if ((typeof tag) == 'string') { + if (tag == 'NULL') { + sql += tag + ',' + } else { + sql += `\'${tag}\',` + } + } else { + sql += tag + sql += ',' + } + }) + + sql = sql.slice(0, sql.length - 1) + sql += ')' + + sql += 'values' + values.forEach(value => { + sql += '(' + value.forEach(v => { + if ((typeof v) == 'string') { + sql += `\'${v}\',` + } else { + sql += v + sql += ',' + } + }) + sql = sql.slice(0, sql.length - 1) + sql += ')' + }) + return sql; +} + +export function insertNTable(values: Array>, table: string): string { + let sql = `insert into ${table} values ` + values.forEach(value => { + sql += '(' + value.forEach(v => { + if ((typeof v) == 'string') { + if (v == 'NULL') { + sql += v + ',' + } else { + sql += `\'${v}\',` + } + } else { + sql += v + sql += ',' + } + }) + sql = sql.slice(0, sql.length - 1) + sql += ')' + }) + + return sql; +} + + +export const tableMeta: Array = [ + { + name: 'ts', + type: 'TIMESTAMP', + length: 8 + }, + { + name: 'i1', + type: 'TINYINT', + length: 1 + }, + { + name: 'i2', + type: 'SMALLINT', + length: 2 + }, + { + name: 'i4', + type: 'INT', + length: 4 + }, + { + name: 'i8', + type: 'BIGINT', + length: 8 + }, + { + name: 'u1', + type: 'TINYINT UNSIGNED', + length: 1 + }, + { + name: 'u2', + type: 'SMALLINT UNSIGNED', + length: 2 + }, + { + name: 'u4', + type: 'INT UNSIGNED', + length: 4 + }, + { + name: 'u8', + type: 'BIGINT UNSIGNED', + length: 8 + }, + { + name: 'f4', + type: 'FLOAT', + length: 4 + }, + { + name: 'd8', + type: 'DOUBLE', + length: 8 + }, + { + name: 'bnr', + type: 'VARCHAR', + length: 200 + }, + { + name: 'nchr', + type: 'NCHAR', + length: 200 + }, + { + name: 'b', + type: 'BOOL', + length: 1 + }, + { + name: 'nilcol', + type: 'INT', + length: 4 + }, + { + name: 'geo', + type: 'GEOMETRY', + length: 512 + }, + { + name: 'vbinary', + type: 'VARBINARY', + length: 32 + }, +] + +export const jsonMeta: Array = [ + { + name: 'json_tag', + type: 'JSON', + length: 4095 + }, +] +export const tagMeta: Array = [ + { + name: 'tb', + type: 'BOOL', + length: 1 + }, + { + name: 'ti1', + type: 'TINYINT', + length: 1 + }, + { + name: 'ti2', + type: 'SMALLINT', + length: 2 + }, + { + name: 'ti4', + type: 'INT', + length: 4 + }, + { + name: 'ti8', + type: 'BIGINT', + length: 8 + }, + { + name: 'tu1', + type: 'TINYINT UNSIGNED', + length: 1 + }, + { + name: 'tu2', + type: 'SMALLINT UNSIGNED', + length: 2 + }, + { + name: 'tu4', + type: 'INT UNSIGNED', + length: 4 + }, + { + name: 'tu8', + type: 'BIGINT UNSIGNED', + length: 8 + }, + { + name: 'tf4', + type: 'FLOAT', + length: 4 + }, + { + name: 'td8', + type: 'DOUBLE', + length: 8 + }, + { + name: 'tbnr', + type: 'VARCHAR', + length: 200 + }, + { + name: 'tnchr', + type: 'NCHAR', + length: 200 + }, +] + +export function createBaseSTable(stable: string): string { + return `create table if not exists ${stable}( ts timestamp,i1 tinyint,i2 smallint,i4 int,i8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,d8 double,bnr binary(200),nchr nchar(200),b bool,nilcol int, g1 geometry(512), c4 varbinary(100))` + + 'tags( tb bool,ti1 tinyint,ti2 smallint,ti4 int,ti8 bigint,tu1 tinyint unsigned,tu2 smallint unsigned,tu4 int unsigned,tu8 bigint unsigned,tf4 float,td8 double,tbnr binary(200),tnchr nchar(200));' +} +export function createBaseSTableJSON(stable: string): string { + return `create table if not exists ${stable}(ts timestamp,i1 tinyint,i2 smallint,i4 int,i8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,d8 double,bnr binary(200),nchr nchar(200),b bool,nilcol int)` + + 'tags(json_tag json);' +} +export function createBaseTable(table: string): string { + return `create table if not exists ${table}(ts timestamp,i1 tinyint,i2 smallint,i4 int,i8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,d8 double,bnr binary(200),nchr nchar(200),b bool,nilcol int)` +} + +export function createSTable(stable: string): string { + return `create table if not exists ${stable}( ts timestamp,i1 tinyint,i2 smallint,i4 int,i8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,d8 double,bnr binary(200),nchr nchar(200),b bool,nilcol int, geo geometry(512), vbinary varbinary(32))` + + 'tags( tb bool,ti1 tinyint,ti2 smallint,ti4 int,ti8 bigint,tu1 tinyint unsigned,tu2 smallint unsigned,tu4 int unsigned,tu8 bigint unsigned,tf4 float,td8 double,tbnr binary(200),tnchr nchar(200));' +} +export function createSTableJSON(stable: string): string { + return `create table if not exists ${stable}(ts timestamp,i1 tinyint,i2 smallint,i4 int,i8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,d8 double,bnr binary(200),nchr nchar(200),b bool,nilcol int, geo geometry(512), vbinary varbinary(32))` + + 'tags(json_tag json);' +} +export function createTable(table: string): string { + return `create table if not exists ${table}(ts timestamp,i1 tinyint,i2 smallint,i4 int,i8 bigint,u1 tinyint unsigned,u2 smallint unsigned,u4 int unsigned,u8 bigint unsigned,f4 float,d8 double,bnr binary(200),nchr nchar(200),b bool,nilcol int, geo geometry(512), vbinary varbinary(32))` +} + + + +export function expectStableData(rows: Array>, tags: Array): Array> { + let resArr:Array> =[] + rows.forEach((row, index, rows) => { + resArr.push(row.concat(tags)) + }) + return resArr; +} +function hexToBytes(hex: string): ArrayBuffer { + let byteLen = hex.length / 2; + let a = new Uint16Array(byteLen) + for (let i = 0, count = 0; i < hex.length; i += 2, count++) { + let item = parseInt(hex.slice(i, i+2), 16); + a[count] = item + console.log(item, a[count]) + } + return a.buffer +} + +export function createStmtData():Array> { + let multi:any[][] = [ + [1709183268567, 1709183268568, 1709183268569], + [10.2, 10.3, 10.4], + [292, 293, 294], + [0.32, 0.33, 0.34], + ]; + let res = hexToBytes("0101000020E6100000000000000000F03F0000000000000040") + let geom = Array.from(new Uint8Array(res)) + multi.push([geom, geom, geom]) + + + res = new TextEncoder().encode("ab") + let binary = Array.from(new Uint8Array(res)) + multi.push([binary, binary, binary]) + return multi + + +} diff --git a/nodejs/tsconfig.json b/nodejs/tsconfig.json new file mode 100644 index 0000000..121250c --- /dev/null +++ b/nodejs/tsconfig.json @@ -0,0 +1,101 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ES2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist/", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 381663bc6c9cba597e09e97660da9799fe1538ff Mon Sep 17 00:00:00 2001 From: menshibin Date: Sat, 13 Apr 2024 10:09:48 +0800 Subject: [PATCH 02/17] config ci workflows --- .github/workflows/native_3.0_pull_push.yaml | 68 - .github/workflows/rest3.0_pull_push.yaml | 67 - .gitignore | 1 + nodejs/example/basicSchemaless.ts | 2 +- nodejs/example/basicSql.ts | 4 +- nodejs/index.ts | 10 +- nodejs/package-lock.json | 9870 ------------------- nodejs/package.json | 14 +- nodejs/src/client/wsClient.ts | 37 +- nodejs/src/client/wsConnector.ts | 19 +- nodejs/src/client/wsConnectorPool.ts | 19 +- nodejs/src/client/wsEventCallback.ts | 3 +- nodejs/src/common/config.ts | 9 +- nodejs/src/common/taosResult.ts | 27 +- nodejs/src/common/ut8Helper.ts | 2 - nodejs/src/common/utils.ts | 6 + nodejs/src/common/wsError.ts | 6 +- nodejs/src/sql/wsRows.ts | 19 +- nodejs/src/sql/wsSql.ts | 19 +- nodejs/src/stmt/wsParams.ts | 41 +- nodejs/src/stmt/wsProto.ts | 3 - nodejs/src/stmt/wsStmt.ts | 2 +- nodejs/src/tmq/config.ts | 5 +- nodejs/src/tmq/tmqResponse.ts | 4 +- nodejs/src/tmq/wsTmq.ts | 24 +- nodejs/test/bulkPulling/queryTables.test.ts | 6 +- nodejs/test/bulkPulling/schemaless.test.ts | 13 +- nodejs/test/bulkPulling/sql.test.ts | 18 +- nodejs/test/bulkPulling/stmt.func.test.ts | 28 +- nodejs/test/bulkPulling/stmt.type.test.ts | 12 +- nodejs/test/bulkPulling/tmq.test.ts | 12 +- nodejs/test/utils.ts | 22 +- 32 files changed, 195 insertions(+), 10197 deletions(-) delete mode 100644 .github/workflows/native_3.0_pull_push.yaml delete mode 100644 .github/workflows/rest3.0_pull_push.yaml delete mode 100644 nodejs/package-lock.json diff --git a/.github/workflows/native_3.0_pull_push.yaml b/.github/workflows/native_3.0_pull_push.yaml deleted file mode 100644 index eacddfb..0000000 --- a/.github/workflows/native_3.0_pull_push.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Triggered by pull request or push to develop branch -# Test Nodejs connector. -name: native 3.0 on push&pull - -on: - push: - branches: [ '3.0' ] - pull_request: - branches: [ '3.0' ] - -jobs: - build: - - runs-on: ubuntu-20.04 - - strategy: - matrix: - node-version: [12.x] - - steps: - - - name: Build Tools - run: | - sudo apt-get update - sudo apt-get install -y build-essential cmake - sudo apt-get install -y python3 python3-pip python-is-python3 - - - name: Checkout TDengine 3.0 - uses: actions/checkout@v3 - with: - fetch-depth: 1 - repository: 'taosdata/TDengine' - path: 'TDengine' - ref: '3.0' - - - name: Build TDengine 3.0 - run: | - cd TDengine - mkdir debug - cd debug - cmake .. - make -j8 - sudo make install - - - name: shell - run: | - cat >start.sh<', result); } - await wsRows.Close() + wsRows.Close() } catch (e) { let err:any = e @@ -50,7 +50,7 @@ let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; } finally { if (wsRows) { - await wsRows.Close(); + wsRows.Close(); } if (wsSql) { wsSql.Close(); diff --git a/nodejs/index.ts b/nodejs/index.ts index 7a46e34..ff989b1 100644 --- a/nodejs/index.ts +++ b/nodejs/index.ts @@ -1,6 +1,8 @@ import { WsSql } from './src/sql/wsSql' import { WSConfig } from './src/common/config'; import { WsConsumer } from './src/tmq/wsTmq'; +import logger from "./src/common/log" +import winston from 'winston'; let sqlConnect = async (conf: WSConfig) => { try { @@ -20,4 +22,10 @@ let tmqConnect = async (configMap: Map) => { } }; -export { sqlConnect, tmqConnect }; \ No newline at end of file +let setLogLevel = (level: string) => { + logger.level = level + if (level == 'debug') { + logger.transports.push(new winston.transports.Console()) + } +}; +export { sqlConnect, tmqConnect, setLogLevel }; \ No newline at end of file diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json deleted file mode 100644 index b05ed16..0000000 --- a/nodejs/package-lock.json +++ /dev/null @@ -1,9870 +0,0 @@ -{ - "name": "@tdengine/websocket", - "version": "3.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@tdengine/websocket", - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "json-bigint": "^1.0.0", - "websocket": "^1.0.34" - }, - "devDependencies": { - "@parcel/packager-ts": "^2.7.0", - "@parcel/transformer-typescript-types": "^2.7.0", - "@types/jest": "^29.2.1", - "@types/json-bigint": "^1.0.1", - "@types/node": "^18.0.0", - "@types/websocket": "^1.0.5", - "jest": "^29.2.2", - "parcel": "^2.7.0", - "ts-jest": "^29.0.3", - "typescript": "^4.6.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.1.tgz", - "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.1.tgz", - "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.20.0.tgz", - "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@jest/console/-/console-29.2.1.tgz", - "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/core/-/core-29.2.2.tgz", - "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==", - "dev": true, - "dependencies": { - "@jest/console": "^29.2.1", - "@jest/reporters": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.2.2", - "jest-haste-map": "^29.2.1", - "jest-message-util": "^29.2.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.2.2", - "jest-resolve-dependencies": "^29.2.2", - "jest-runner": "^29.2.2", - "jest-runtime": "^29.2.2", - "jest-snapshot": "^29.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "jest-watcher": "^29.2.2", - "micromatch": "^4.0.4", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-29.2.2.tgz", - "integrity": "sha512-OWn+Vhu0I1yxuGBJEFFekMYc8aGBGrY4rt47SOh/IFaI+D7ZHCk7pKRiSoZ2/Ml7b0Ony3ydmEHRx/tEOC7H1A==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "jest-mock": "^29.2.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/expect/-/expect-29.2.2.tgz", - "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==", - "dev": true, - "dependencies": { - "expect": "^29.2.2", - "jest-snapshot": "^29.2.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.2.2.tgz", - "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.2.2.tgz", - "integrity": "sha512-nqaW3y2aSyZDl7zQ7t1XogsxeavNpH6kkdq+EpXncIDvAkjvFD7hmhcIs1nWloengEWUoWqkqSA6MSbf9w6DgA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.2.1", - "jest-mock": "^29.2.2", - "jest-util": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-29.2.2.tgz", - "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.2.2", - "@jest/expect": "^29.2.2", - "@jest/types": "^29.2.1", - "jest-mock": "^29.2.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.2.2.tgz", - "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.2.1", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1", - "jest-worker": "^29.2.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.2.1.tgz", - "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.2.1", - "@jest/types": "^29.2.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz", - "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.2.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-29.2.2.tgz", - "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.2.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.2.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.2.1.tgz", - "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@lezer/common": { - "version": "0.15.12", - "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-0.15.12.tgz", - "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", - "dev": true - }, - "node_modules/@lezer/lr": { - "version": "0.15.8", - "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-0.15.8.tgz", - "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", - "dev": true, - "dependencies": { - "@lezer/common": "^0.15.0" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@mischnic/json-sourcemap": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", - "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", - "dev": true, - "dependencies": { - "@lezer/common": "^0.15.7", - "@lezer/lr": "^0.15.4", - "json5": "^2.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz", - "integrity": "sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz", - "integrity": "sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz", - "integrity": "sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz", - "integrity": "sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz", - "integrity": "sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz", - "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@parcel/bundler-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", - "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/cache": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/cache/-/cache-2.7.0.tgz", - "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", - "dev": true, - "dependencies": { - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/utils": "2.7.0", - "lmdb": "2.5.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/codeframe": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/codeframe/-/codeframe-2.7.0.tgz", - "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/compressor-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", - "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/config-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/config-default/-/config-default-2.7.0.tgz", - "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", - "dev": true, - "dependencies": { - "@parcel/bundler-default": "2.7.0", - "@parcel/compressor-raw": "2.7.0", - "@parcel/namer-default": "2.7.0", - "@parcel/optimizer-css": "2.7.0", - "@parcel/optimizer-htmlnano": "2.7.0", - "@parcel/optimizer-image": "2.7.0", - "@parcel/optimizer-svgo": "2.7.0", - "@parcel/optimizer-terser": "2.7.0", - "@parcel/packager-css": "2.7.0", - "@parcel/packager-html": "2.7.0", - "@parcel/packager-js": "2.7.0", - "@parcel/packager-raw": "2.7.0", - "@parcel/packager-svg": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/resolver-default": "2.7.0", - "@parcel/runtime-browser-hmr": "2.7.0", - "@parcel/runtime-js": "2.7.0", - "@parcel/runtime-react-refresh": "2.7.0", - "@parcel/runtime-service-worker": "2.7.0", - "@parcel/transformer-babel": "2.7.0", - "@parcel/transformer-css": "2.7.0", - "@parcel/transformer-html": "2.7.0", - "@parcel/transformer-image": "2.7.0", - "@parcel/transformer-js": "2.7.0", - "@parcel/transformer-json": "2.7.0", - "@parcel/transformer-postcss": "2.7.0", - "@parcel/transformer-posthtml": "2.7.0", - "@parcel/transformer-raw": "2.7.0", - "@parcel/transformer-react-refresh-wrap": "2.7.0", - "@parcel/transformer-svg": "2.7.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/core": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/core/-/core-2.7.0.tgz", - "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", - "dev": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/graph": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/css": { - "version": "1.14.0", - "resolved": "https://registry.npmmirror.com/@parcel/css/-/css-1.14.0.tgz", - "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", - "dev": true, - "dependencies": { - "lightningcss": "^1.14.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/diagnostic": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", - "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", - "dev": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/events": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/events/-/events-2.7.0.tgz", - "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/fs": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/fs/-/fs-2.7.0.tgz", - "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", - "dev": true, - "dependencies": { - "@parcel/fs-search": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/fs-search": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/fs-search/-/fs-search-2.7.0.tgz", - "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/graph": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/graph/-/graph-2.7.0.tgz", - "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", - "dev": true, - "dependencies": { - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/hash": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/hash/-/hash-2.7.0.tgz", - "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/logger": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/logger/-/logger-2.7.0.tgz", - "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", - "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/namer-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/namer-default/-/namer-default-2.7.0.tgz", - "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/node-resolver-core": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", - "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/optimizer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", - "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", - "dev": true, - "dependencies": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/optimizer-htmlnano": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", - "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/optimizer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", - "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/optimizer-svgo": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", - "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "svgo": "^2.4.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/optimizer-terser": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", - "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/package-manager": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/package-manager/-/package-manager-2.7.0.tgz", - "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/packager-css": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-css/-/packager-css-2.7.0.tgz", - "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/packager-html": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-html/-/packager-html-2.7.0.tgz", - "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/packager-js": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-js/-/packager-js-2.7.0.tgz", - "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/packager-js/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@parcel/packager-js/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@parcel/packager-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", - "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/packager-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", - "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "posthtml": "^0.16.4" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/packager-ts": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", - "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/plugin/-/plugin-2.7.0.tgz", - "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", - "dev": true, - "dependencies": { - "@parcel/types": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/reporter-cli": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", - "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "term-size": "^2.2.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/reporter-dev-server": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", - "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/resolver-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", - "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", - "dev": true, - "dependencies": { - "@parcel/node-resolver-core": "2.7.0", - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", - "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/runtime-js": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", - "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/runtime-react-refresh": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", - "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/runtime-service-worker": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", - "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": "^12.18.3 || >=14" - } - }, - "node_modules/@parcel/transformer-babel": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", - "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", - "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", - "dev": true, - "dependencies": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-html": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", - "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", - "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-js": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", - "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-json": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", - "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "json5": "^2.2.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-postcss": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", - "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-posthtml": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", - "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", - "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", - "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-refresh": "^0.9.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", - "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-typescript-types": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", - "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "peerDependencies": { - "typescript": ">=3.0.0" - } - }, - "node_modules/@parcel/ts-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", - "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", - "dev": true, - "dependencies": { - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "typescript": ">=3.0.0" - } - }, - "node_modules/@parcel/types": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/types/-/types-2.7.0.tgz", - "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", - "dev": true, - "dependencies": { - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.7.0", - "utility-types": "^3.10.0" - } - }, - "node_modules/@parcel/utils": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/utils/-/utils-2.7.0.tgz", - "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", - "dev": true, - "dependencies": { - "@parcel/codeframe": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/markdown-ansi": "2.7.0", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.0.6.tgz", - "integrity": "sha512-6CaHXp6BNrFY5375OGQLSeaxfO8csgGWbO1U2nUqufDtUks7ZIG5wAyj/wR1zkOxRrhN0EaZWvlgSKYqo7a9lg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@parcel/workers": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/workers/-/workers-2.7.0.tgz", - "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.4", - "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.4.tgz", - "integrity": "sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.4.12", - "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.4.12.tgz", - "integrity": "sha512-R6RmwS9Dld5lNvwKlPn62+piU+WDG1sMfsnfJioXCciyko/gZ0DQ4Mqglhq1iGU1nQ/RcGkAwfMH+elMSkJH3Q==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-29.2.1.tgz", - "integrity": "sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmmirror.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.2.2.tgz", - "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.2.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmmirror.com/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "engines": { - "node": "*" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001429", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz", - "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==", - "dev": true - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.2.0.tgz", - "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "node_modules/dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/expect/-/expect-29.2.2.tgz", - "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.2.2", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.2.2", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/htmlnano": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/htmlnano/-/htmlnano-2.0.2.tgz", - "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.1", - "posthtml": "^0.16.5", - "timsort": "^0.3.0" - }, - "peerDependencies": { - "cssnano": "^5.0.11", - "postcss": "^8.3.11", - "purgecss": "^4.0.3", - "relateurl": "^0.2.7", - "srcset": "^5.0.0", - "svgo": "^2.8.0", - "terser": "^5.10.0", - "uncss": "^0.17.3" - }, - "peerDependenciesMeta": { - "cssnano": { - "optional": true - }, - "postcss": { - "optional": true - }, - "purgecss": { - "optional": true - }, - "relateurl": { - "optional": true - }, - "srcset": { - "optional": true - }, - "svgo": { - "optional": true - }, - "terser": { - "optional": true - }, - "uncss": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest/-/jest-29.2.2.tgz", - "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.2.2", - "@jest/types": "^29.2.1", - "import-local": "^3.0.2", - "jest-cli": "^29.2.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.2.2.tgz", - "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.2.2", - "@jest/expect": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.2.1", - "jest-matcher-utils": "^29.2.2", - "jest-message-util": "^29.2.1", - "jest-runtime": "^29.2.2", - "jest-snapshot": "^29.2.2", - "jest-util": "^29.2.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.2.2.tgz", - "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/types": "^29.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-29.2.2.tgz", - "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.2.2", - "@jest/types": "^29.2.1", - "babel-jest": "^29.2.2", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.2.2", - "jest-environment-node": "^29.2.2", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.2.2", - "jest-runner": "^29.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.2.1.tgz", - "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.2.0", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-29.2.1.tgz", - "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.2.1", - "pretty-format": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.2.2.tgz", - "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.2.2", - "@jest/fake-timers": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "jest-mock": "^29.2.2", - "jest-util": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.2.1.tgz", - "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.2.1", - "jest-worker": "^29.2.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", - "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz", - "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.2.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.2.1.tgz", - "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.2.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.2.2.tgz", - "integrity": "sha512-1leySQxNAnivvbcx0sCB37itu8f4OX2S/+gxLAV4Z62shT4r4dTG9tACDywUAEZoLSr36aYUTsVp3WKwWt4PMQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "@types/node": "*", - "jest-util": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.2.2.tgz", - "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz", - "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.2.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.2.2.tgz", - "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.2.1", - "@jest/environment": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.2.2", - "jest-haste-map": "^29.2.1", - "jest-leak-detector": "^29.2.1", - "jest-message-util": "^29.2.1", - "jest-resolve": "^29.2.2", - "jest-runtime": "^29.2.2", - "jest-util": "^29.2.1", - "jest-watcher": "^29.2.2", - "jest-worker": "^29.2.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.2.2.tgz", - "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.2.2", - "@jest/fake-timers": "^29.2.2", - "@jest/globals": "^29.2.2", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "jest-message-util": "^29.2.1", - "jest-mock": "^29.2.2", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.2.2", - "jest-snapshot": "^29.2.2", - "jest-util": "^29.2.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.2.2.tgz", - "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.2.2", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.2.2", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.2.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.2.1", - "jest-matcher-utils": "^29.2.2", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.2.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.2.1.tgz", - "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.2.2.tgz", - "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.2.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.2.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-watcher": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.2.2.tgz", - "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.2.1", - "@jest/types": "^29.2.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.2.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.2.1.tgz", - "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.2.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.16.0.tgz", - "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.16.0", - "lightningcss-darwin-x64": "1.16.0", - "lightningcss-linux-arm-gnueabihf": "1.16.0", - "lightningcss-linux-arm64-gnu": "1.16.0", - "lightningcss-linux-arm64-musl": "1.16.0", - "lightningcss-linux-x64-gnu": "1.16.0", - "lightningcss-linux-x64-musl": "1.16.0", - "lightningcss-win32-x64-msvc": "1.16.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", - "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", - "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", - "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", - "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", - "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", - "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", - "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", - "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2" - } - }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/msgpackr": { - "version": "1.7.2", - "resolved": "https://registry.npmmirror.com/msgpackr/-/msgpackr-1.7.2.tgz", - "integrity": "sha512-mWScyHTtG6TjivXX9vfIy2nBtRupaiAj0HQ2mtmpmYujAmqZmaaEVPaSZ1NKLMvicaMLFzEaMk0ManxMRg8rMQ==", - "dev": true, - "optionalDependencies": { - "msgpackr-extract": "^2.1.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz", - "integrity": "sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.0.3" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "2.1.2" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "dev": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ordered-binary": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/ordered-binary/-/ordered-binary-1.4.0.tgz", - "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", - "dev": true - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parcel": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/parcel/-/parcel-2.7.0.tgz", - "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", - "dev": true, - "dependencies": { - "@parcel/config-default": "2.7.0", - "@parcel/core": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/reporter-cli": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0", - "v8-compile-cache": "^2.0.0" - }, - "bin": { - "parcel": "lib/bin.js" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", - "dev": true, - "dependencies": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/posthtml-parser": { - "version": "0.10.2", - "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz", - "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", - "dev": true, - "dependencies": { - "is-json": "^2.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml/node_modules/posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/pretty-format": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.2.1.tgz", - "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", - "dev": true - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmmirror.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmmirror.com/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.6.1", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.6.1.tgz", - "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", - "dev": true - }, - "@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.1.tgz", - "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", - "dev": true, - "requires": { - "@babel/types": "^7.19.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.1.tgz", - "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.20.0.tgz", - "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@jest/console/-/console-29.2.1.tgz", - "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/core/-/core-29.2.2.tgz", - "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==", - "dev": true, - "requires": { - "@jest/console": "^29.2.1", - "@jest/reporters": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.2.2", - "jest-haste-map": "^29.2.1", - "jest-message-util": "^29.2.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.2.2", - "jest-resolve-dependencies": "^29.2.2", - "jest-runner": "^29.2.2", - "jest-runtime": "^29.2.2", - "jest-snapshot": "^29.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "jest-watcher": "^29.2.2", - "micromatch": "^4.0.4", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-29.2.2.tgz", - "integrity": "sha512-OWn+Vhu0I1yxuGBJEFFekMYc8aGBGrY4rt47SOh/IFaI+D7ZHCk7pKRiSoZ2/Ml7b0Ony3ydmEHRx/tEOC7H1A==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "jest-mock": "^29.2.2" - } - }, - "@jest/expect": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/expect/-/expect-29.2.2.tgz", - "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==", - "dev": true, - "requires": { - "expect": "^29.2.2", - "jest-snapshot": "^29.2.2" - } - }, - "@jest/expect-utils": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.2.2.tgz", - "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0" - } - }, - "@jest/fake-timers": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.2.2.tgz", - "integrity": "sha512-nqaW3y2aSyZDl7zQ7t1XogsxeavNpH6kkdq+EpXncIDvAkjvFD7hmhcIs1nWloengEWUoWqkqSA6MSbf9w6DgA==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.2.1", - "jest-mock": "^29.2.2", - "jest-util": "^29.2.1" - } - }, - "@jest/globals": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-29.2.2.tgz", - "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==", - "dev": true, - "requires": { - "@jest/environment": "^29.2.2", - "@jest/expect": "^29.2.2", - "@jest/types": "^29.2.1", - "jest-mock": "^29.2.2" - } - }, - "@jest/reporters": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.2.2.tgz", - "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.2.1", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1", - "jest-worker": "^29.2.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.2.1.tgz", - "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==", - "dev": true, - "requires": { - "@jest/console": "^29.2.1", - "@jest/types": "^29.2.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz", - "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.2.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-29.2.2.tgz", - "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.2.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.2.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.2.1.tgz", - "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@lezer/common": { - "version": "0.15.12", - "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-0.15.12.tgz", - "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", - "dev": true - }, - "@lezer/lr": { - "version": "0.15.8", - "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-0.15.8.tgz", - "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", - "dev": true, - "requires": { - "@lezer/common": "^0.15.0" - } - }, - "@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", - "dev": true, - "optional": true - }, - "@mischnic/json-sourcemap": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", - "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", - "dev": true, - "requires": { - "@lezer/common": "^0.15.7", - "@lezer/lr": "^0.15.4", - "json5": "^2.2.1" - } - }, - "@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz", - "integrity": "sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz", - "integrity": "sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz", - "integrity": "sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz", - "integrity": "sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz", - "integrity": "sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz", - "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", - "dev": true, - "optional": true - }, - "@parcel/bundler-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", - "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/cache": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/cache/-/cache-2.7.0.tgz", - "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", - "dev": true, - "requires": { - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/utils": "2.7.0", - "lmdb": "2.5.2" - } - }, - "@parcel/codeframe": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/codeframe/-/codeframe-2.7.0.tgz", - "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - } - }, - "@parcel/compressor-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", - "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/config-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/config-default/-/config-default-2.7.0.tgz", - "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", - "dev": true, - "requires": { - "@parcel/bundler-default": "2.7.0", - "@parcel/compressor-raw": "2.7.0", - "@parcel/namer-default": "2.7.0", - "@parcel/optimizer-css": "2.7.0", - "@parcel/optimizer-htmlnano": "2.7.0", - "@parcel/optimizer-image": "2.7.0", - "@parcel/optimizer-svgo": "2.7.0", - "@parcel/optimizer-terser": "2.7.0", - "@parcel/packager-css": "2.7.0", - "@parcel/packager-html": "2.7.0", - "@parcel/packager-js": "2.7.0", - "@parcel/packager-raw": "2.7.0", - "@parcel/packager-svg": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/resolver-default": "2.7.0", - "@parcel/runtime-browser-hmr": "2.7.0", - "@parcel/runtime-js": "2.7.0", - "@parcel/runtime-react-refresh": "2.7.0", - "@parcel/runtime-service-worker": "2.7.0", - "@parcel/transformer-babel": "2.7.0", - "@parcel/transformer-css": "2.7.0", - "@parcel/transformer-html": "2.7.0", - "@parcel/transformer-image": "2.7.0", - "@parcel/transformer-js": "2.7.0", - "@parcel/transformer-json": "2.7.0", - "@parcel/transformer-postcss": "2.7.0", - "@parcel/transformer-posthtml": "2.7.0", - "@parcel/transformer-raw": "2.7.0", - "@parcel/transformer-react-refresh-wrap": "2.7.0", - "@parcel/transformer-svg": "2.7.0" - } - }, - "@parcel/core": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/core/-/core-2.7.0.tgz", - "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", - "dev": true, - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/graph": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - } - }, - "@parcel/css": { - "version": "1.14.0", - "resolved": "https://registry.npmmirror.com/@parcel/css/-/css-1.14.0.tgz", - "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", - "dev": true, - "requires": { - "lightningcss": "^1.14.0" - } - }, - "@parcel/diagnostic": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", - "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", - "dev": true, - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/events": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/events/-/events-2.7.0.tgz", - "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", - "dev": true - }, - "@parcel/fs": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/fs/-/fs-2.7.0.tgz", - "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", - "dev": true, - "requires": { - "@parcel/fs-search": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.7.0" - } - }, - "@parcel/fs-search": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/fs-search/-/fs-search-2.7.0.tgz", - "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3" - } - }, - "@parcel/graph": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/graph/-/graph-2.7.0.tgz", - "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", - "dev": true, - "requires": { - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/hash": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/hash/-/hash-2.7.0.tgz", - "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" - } - }, - "@parcel/logger": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/logger/-/logger-2.7.0.tgz", - "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0" - } - }, - "@parcel/markdown-ansi": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", - "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - } - }, - "@parcel/namer-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/namer-default/-/namer-default-2.7.0.tgz", - "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/node-resolver-core": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", - "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - } - }, - "@parcel/optimizer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", - "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", - "dev": true, - "requires": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - } - }, - "@parcel/optimizer-htmlnano": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", - "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" - } - }, - "@parcel/optimizer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", - "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "detect-libc": "^1.0.3" - } - }, - "@parcel/optimizer-svgo": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", - "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "svgo": "^2.4.0" - } - }, - "@parcel/optimizer-terser": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", - "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - } - }, - "@parcel/package-manager": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/package-manager/-/package-manager-2.7.0.tgz", - "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "semver": "^5.7.1" - } - }, - "@parcel/packager-css": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-css/-/packager-css-2.7.0.tgz", - "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/packager-html": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-html/-/packager-html-2.7.0.tgz", - "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" - } - }, - "@parcel/packager-js": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-js/-/packager-js-2.7.0.tgz", - "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" - }, - "dependencies": { - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@parcel/packager-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", - "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/packager-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", - "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "posthtml": "^0.16.4" - } - }, - "@parcel/packager-ts": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", - "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/plugin/-/plugin-2.7.0.tgz", - "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", - "dev": true, - "requires": { - "@parcel/types": "2.7.0" - } - }, - "@parcel/reporter-cli": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", - "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "term-size": "^2.2.1" - } - }, - "@parcel/reporter-dev-server": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", - "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - } - }, - "@parcel/resolver-default": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", - "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", - "dev": true, - "requires": { - "@parcel/node-resolver-core": "2.7.0", - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/runtime-browser-hmr": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", - "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - } - }, - "@parcel/runtime-js": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", - "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/runtime-react-refresh": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", - "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" - } - }, - "@parcel/runtime-service-worker": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", - "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3" - } - }, - "@parcel/transformer-babel": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", - "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.0" - } - }, - "@parcel/transformer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", - "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", - "dev": true, - "requires": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - } - }, - "@parcel/transformer-html": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", - "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", - "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/transformer-js": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", - "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-json": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", - "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "json5": "^2.2.0" - } - }, - "@parcel/transformer-postcss": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", - "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-posthtml": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", - "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", - "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/transformer-react-refresh-wrap": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", - "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-refresh": "^0.9.0" - } - }, - "@parcel/transformer-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", - "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-typescript-types": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", - "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/ts-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", - "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", - "dev": true, - "requires": { - "nullthrows": "^1.1.1" - } - }, - "@parcel/types": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/types/-/types-2.7.0.tgz", - "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", - "dev": true, - "requires": { - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.7.0", - "utility-types": "^3.10.0" - } - }, - "@parcel/utils": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/utils/-/utils-2.7.0.tgz", - "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", - "dev": true, - "requires": { - "@parcel/codeframe": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/markdown-ansi": "2.7.0", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" - } - }, - "@parcel/watcher": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.0.6.tgz", - "integrity": "sha512-6CaHXp6BNrFY5375OGQLSeaxfO8csgGWbO1U2nUqufDtUks7ZIG5wAyj/wR1zkOxRrhN0EaZWvlgSKYqo7a9lg==", - "dev": true, - "requires": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - } - }, - "@parcel/workers": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/@parcel/workers/-/workers-2.7.0.tgz", - "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - } - }, - "@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.4", - "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.4.tgz", - "integrity": "sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@swc/helpers": { - "version": "0.4.12", - "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.4.12.tgz", - "integrity": "sha512-R6RmwS9Dld5lNvwKlPn62+piU+WDG1sMfsnfJioXCciyko/gZ0DQ4Mqglhq1iGU1nQ/RcGkAwfMH+elMSkJH3Q==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-29.2.1.tgz", - "integrity": "sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", - "dev": true - }, - "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmmirror.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "babel-jest": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.2.2.tgz", - "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==", - "dev": true, - "requires": { - "@jest/transform": "^29.2.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmmirror.com/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmmirror.com/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001429", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz", - "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.2.0.tgz", - "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==", - "dev": true - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "dependencies": { - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/expect/-/expect-29.2.2.tgz", - "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.2.2", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.2.2", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1" - } - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "requires": { - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "htmlnano": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/htmlnano/-/htmlnano-2.0.2.tgz", - "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.1", - "posthtml": "^0.16.5", - "timsort": "^0.3.0" - } - }, - "htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest/-/jest-29.2.2.tgz", - "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==", - "dev": true, - "requires": { - "@jest/core": "^29.2.2", - "@jest/types": "^29.2.1", - "import-local": "^3.0.2", - "jest-cli": "^29.2.2" - } - }, - "jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.2.2.tgz", - "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==", - "dev": true, - "requires": { - "@jest/environment": "^29.2.2", - "@jest/expect": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.2.1", - "jest-matcher-utils": "^29.2.2", - "jest-message-util": "^29.2.1", - "jest-runtime": "^29.2.2", - "jest-snapshot": "^29.2.2", - "jest-util": "^29.2.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.2.2.tgz", - "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==", - "dev": true, - "requires": { - "@jest/core": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/types": "^29.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-29.2.2.tgz", - "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.2.2", - "@jest/types": "^29.2.1", - "babel-jest": "^29.2.2", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.2.2", - "jest-environment-node": "^29.2.2", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.2.2", - "jest-runner": "^29.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.2.1.tgz", - "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.2.0", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.2.1" - } - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-29.2.1.tgz", - "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.2.1", - "pretty-format": "^29.2.1" - } - }, - "jest-environment-node": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.2.2.tgz", - "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==", - "dev": true, - "requires": { - "@jest/environment": "^29.2.2", - "@jest/fake-timers": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "jest-mock": "^29.2.2", - "jest-util": "^29.2.1" - } - }, - "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true - }, - "jest-haste-map": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.2.1.tgz", - "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.2.1", - "jest-worker": "^29.2.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz", - "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.2.1" - } - }, - "jest-matcher-utils": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz", - "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.2.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.2.1" - } - }, - "jest-message-util": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.2.1.tgz", - "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.2.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.2.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.2.2.tgz", - "integrity": "sha512-1leySQxNAnivvbcx0sCB37itu8f4OX2S/+gxLAV4Z62shT4r4dTG9tACDywUAEZoLSr36aYUTsVp3WKwWt4PMQ==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "@types/node": "*", - "jest-util": "^29.2.1" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true - }, - "jest-resolve": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.2.2.tgz", - "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.2.1", - "jest-validate": "^29.2.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz", - "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==", - "dev": true, - "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.2.2" - } - }, - "jest-runner": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.2.2.tgz", - "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==", - "dev": true, - "requires": { - "@jest/console": "^29.2.1", - "@jest/environment": "^29.2.2", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.2.2", - "jest-haste-map": "^29.2.1", - "jest-leak-detector": "^29.2.1", - "jest-message-util": "^29.2.1", - "jest-resolve": "^29.2.2", - "jest-runtime": "^29.2.2", - "jest-util": "^29.2.1", - "jest-watcher": "^29.2.2", - "jest-worker": "^29.2.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.2.2.tgz", - "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==", - "dev": true, - "requires": { - "@jest/environment": "^29.2.2", - "@jest/fake-timers": "^29.2.2", - "@jest/globals": "^29.2.2", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.2.1", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.2.1", - "jest-message-util": "^29.2.1", - "jest-mock": "^29.2.2", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.2.2", - "jest-snapshot": "^29.2.2", - "jest-util": "^29.2.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.2.2.tgz", - "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.2.2", - "@jest/transform": "^29.2.2", - "@jest/types": "^29.2.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.2.2", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.2.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.2.1", - "jest-matcher-utils": "^29.2.2", - "jest-message-util": "^29.2.1", - "jest-util": "^29.2.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.2.1", - "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "jest-util": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.2.1.tgz", - "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.2.2.tgz", - "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==", - "dev": true, - "requires": { - "@jest/types": "^29.2.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.2.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.2.2", - "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.2.2.tgz", - "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==", - "dev": true, - "requires": { - "@jest/test-result": "^29.2.1", - "@jest/types": "^29.2.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.2.1", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.2.1.tgz", - "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.2.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "lightningcss": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.16.0.tgz", - "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "lightningcss-darwin-arm64": "1.16.0", - "lightningcss-darwin-x64": "1.16.0", - "lightningcss-linux-arm-gnueabihf": "1.16.0", - "lightningcss-linux-arm64-gnu": "1.16.0", - "lightningcss-linux-arm64-musl": "1.16.0", - "lightningcss-linux-x64-gnu": "1.16.0", - "lightningcss-linux-x64-musl": "1.16.0", - "lightningcss-win32-x64-msvc": "1.16.0" - } - }, - "lightningcss-darwin-arm64": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", - "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", - "dev": true, - "optional": true - }, - "lightningcss-darwin-x64": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", - "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm-gnueabihf": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", - "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", - "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", - "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", - "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", - "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", - "dev": true, - "optional": true - }, - "lightningcss-win32-x64-msvc": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", - "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", - "dev": true, - "optional": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", - "dev": true, - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2", - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "dependencies": { - "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "msgpackr": { - "version": "1.7.2", - "resolved": "https://registry.npmmirror.com/msgpackr/-/msgpackr-1.7.2.tgz", - "integrity": "sha512-mWScyHTtG6TjivXX9vfIy2nBtRupaiAj0HQ2mtmpmYujAmqZmaaEVPaSZ1NKLMvicaMLFzEaMk0ManxMRg8rMQ==", - "dev": true, - "requires": { - "msgpackr-extract": "^2.1.2" - } - }, - "msgpackr-extract": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz", - "integrity": "sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==", - "dev": true, - "optional": true, - "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "2.1.2", - "node-gyp-build-optional-packages": "5.0.3" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" - }, - "node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "ordered-binary": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/ordered-binary/-/ordered-binary-1.4.0.tgz", - "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parcel": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/parcel/-/parcel-2.7.0.tgz", - "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", - "dev": true, - "requires": { - "@parcel/config-default": "2.7.0", - "@parcel/core": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/reporter-cli": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0", - "v8-compile-cache": "^2.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", - "dev": true, - "requires": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "dependencies": { - "posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "requires": { - "htmlparser2": "^7.1.1" - } - } - } - }, - "posthtml-parser": { - "version": "0.10.2", - "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz", - "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", - "dev": true, - "requires": { - "htmlparser2": "^7.1.1" - } - }, - "posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", - "dev": true, - "requires": { - "is-json": "^2.0.1" - } - }, - "pretty-format": { - "version": "29.2.1", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.2.1.tgz", - "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", - "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmmirror.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmmirror.com/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.6.1", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.6.1.tgz", - "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/nodejs/package.json b/nodejs/package.json index 2ce63d0..e3ef6ee 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -23,7 +23,6 @@ "url": "git+https://github.com/taosdata/taos-connector-node.git" }, "keywords": [ - "WebSocket", "taosdata", "taos", "IOT", @@ -39,7 +38,11 @@ "homepage": "https://github.com/taosdata/taos-connector-node#readme", "dependencies": { "json-bigint": "^1.0.0", - "websocket": "^1.0.34" + "typescript": "^5.3.3", + "uuid": "^9.0.1", + "websocket": "^1.0.34", + "winston": "^3.13.0", + "winston-daily-rotate-file": "^5.0.0" }, "devDependencies": { "@parcel/packager-ts": "^2.7.0", @@ -47,11 +50,14 @@ "@types/jest": "^29.2.1", "@types/json-bigint": "^1.0.1", "@types/node": "^18.0.0", - "@types/websocket": "^1.0npm install async-mutex.5", + "@types/websocket": "^1.0", "jest": "^29.2.2", "parcel": "^2.7.0", "ts-jest": "^29.0.3", "typescript": "^5.3.3", - "async-mutex": "^0.5.0" + "async-mutex": "^0.5.0", + "uuid": "^9.0.1", + "winston": "^3.13.0", + "winston-daily-rotate-file": "^5.0.0" } } diff --git a/nodejs/src/client/wsClient.ts b/nodejs/src/client/wsClient.ts index fa07041..22ecdcb 100644 --- a/nodejs/src/client/wsClient.ts +++ b/nodejs/src/client/wsClient.ts @@ -10,13 +10,13 @@ import { WSFetchResponse, } from './wsResponse'; import { ReqId } from '../common/reqid'; +import logger from '../common/log'; export class WsClient { private _wsConnector?: WebSocketConnector; - private _req_id = 1000000; private _timeout?:number | undefined | null; - private _url:URL; + private readonly _url:URL; constructor(url: URL, timeout ?:number | undefined | null) { this.checkURL(url); @@ -65,7 +65,7 @@ export class WsClient { execNoResp(queryMsg: string): Promise { return new Promise((resolve, reject) => { - console.log('[wsQueryInterface.query.queryMsg]===>' + queryMsg); + logger.debug('[wsQueryInterface.query.queryMsg]===>' + queryMsg); if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendMsgNoResp(queryMsg) .then(() => {resolve();}) @@ -78,13 +78,13 @@ export class WsClient { } // need to construct Response. - exec(queryMsg: string, bSqlQurey:boolean = true): Promise { + exec(queryMsg: string, bSqlQuery:boolean = true): Promise { return new Promise((resolve, reject) => { // console.log('[wsQueryInterface.query.queryMsg]===>' + queryMsg); if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendMsg(queryMsg).then((e: any) => { if (e.msg.code == 0) { - if (bSqlQurey) { + if (bSqlQuery) { resolve(new WSQueryResponse(e)); }else{ resolve(e) @@ -102,12 +102,12 @@ export class WsClient { // need to construct Response. - sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, bSqlQurey:boolean = true): Promise { + sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, bSqlQuery:boolean = true): Promise { return new Promise((resolve, reject) => { if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendBinaryMsg(reqId, action, message).then((e: any) => { if (e.msg.code == 0) { - if (bSqlQurey) { + if (bSqlQuery) { resolve(new WSQueryResponse(e)); }else{ resolve(e) @@ -139,7 +139,7 @@ export class WsClient { if (this._wsConnector.readyState() <= 0) { await this._wsConnector.Ready() } - console.log("ready status ", this._url, this._wsConnector.readyState()) + logger.debug("ready status ", this._url, this._wsConnector.readyState()) resolve() }catch(e: any) { reject(e) @@ -159,7 +159,7 @@ export class WsClient { // console.log(res) return new Promise((resolve, reject) => { let jsonStr = JSONBig.stringify(fetchMsg); - console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + logger.debug('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendMsg(jsonStr).then((e: any) => { if (e.msg.code == 0) { @@ -190,7 +190,7 @@ export class WsClient { if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendMsg(jsonStr).then((e: any) => { let resp:MessageResp = e - taosResult.AddtotalTime(resp.totalTime) + taosResult.AddTotalTime(resp.totalTime) resolve(parseBlock(fetchResponse.rows, new WSFetchBlockResponse(resp.msg), taosResult)); // if retrieve JSON then reject with message // else is binary , so parse raw block to TaosResult @@ -248,11 +248,11 @@ export class WsClient { if (this._wsConnector.readyState() <= 0) { await this._wsConnector.Ready() } - let resoult:any = await this._wsConnector.sendMsg(JSONBig.stringify(versionMsg)); - if (resoult.msg.code == 0) { - resolve(new WSVersionResponse(resoult).version); + let result:any = await this._wsConnector.sendMsg(JSONBig.stringify(versionMsg)); + if (result.msg.code == 0) { + resolve(new WSVersionResponse(result).version); } else { - reject(new WebSocketInterfaceError(resoult.msg.code, resoult.msg.message)); + reject(new WebSocketInterfaceError(result.msg.code, result.msg.message)); } } catch (e:any) { reject(e); @@ -279,13 +279,4 @@ export class WsClient { } } - // private getReqID() { - // return ReqId.getReqID() - // // if (this._req_id == 1999999) { - // // this._req_id = 1000000; - // // } else { - // // this._req_id += 1; - // // } - // // return this._req_id; - // } } diff --git a/nodejs/src/client/wsConnector.ts b/nodejs/src/client/wsConnector.ts index ae650dd..8e00a1a 100644 --- a/nodejs/src/client/wsConnector.ts +++ b/nodejs/src/client/wsConnector.ts @@ -1,7 +1,7 @@ import { ICloseEvent, w3cwebsocket } from 'websocket'; import { ErrorCode, TDWebSocketClientError, WebSocketQueryError } from '../common/wsError' import { OnMessageType, WsEventCallback } from './wsEventCallback'; - +import logger from '../common/log'; export class WebSocketConnector { private _wsConn: w3cwebsocket; @@ -20,7 +20,7 @@ export class WebSocketConnector { this._timeout = timeout } this._wsConn = new w3cwebsocket(origin.concat(pathname).concat(search)); - this._wsConn.onerror = function (err: Error) { console.log(err.message); throw err } + this._wsConn.onerror = function (err: Error) { logger.error(err.message); throw err } this._wsConn.onclose = this._onclose @@ -34,7 +34,7 @@ export class WebSocketConnector { Ready(): Promise { return new Promise((resolve, reject) => { this._wsConn.onopen = () => { - console.log("websocket connection opened") + logger.debug("websocket connection opened") resolve(this); } }) @@ -49,7 +49,7 @@ export class WebSocketConnector { private _onmessage(event: any) { let data = event.data; - console.log("wsClient._onMessage()===="+ (Object.prototype.toString.call(data))) + logger.debug("wsClient._onMessage()===="+ (Object.prototype.toString.call(data))) if (Object.prototype.toString.call(data) === '[object ArrayBuffer]') { let id = new DataView(data, 8, 8).getBigUint64(0, true); WsEventCallback.Instance().HandleEventCallback({id:id, action:'', req_id:BigInt(0)}, @@ -64,7 +64,7 @@ export class WebSocketConnector { } else if (Object.prototype.toString.call(data) === '[object String]') { let msg = JSON.parse(data) - console.log("[_onmessage.stringType]==>:" + data); + logger.debug("[_onmessage.stringType]==>:" + data); WsEventCallback.Instance().HandleEventCallback({id:BigInt(0), action:msg.action, req_id:msg.req_id}, OnMessageType.MESSAGE_TYPE_STRING, msg); } else { @@ -86,7 +86,7 @@ export class WebSocketConnector { } sendMsgNoResp(message: string):Promise { - console.log("[wsClient.sendMsgNoResp()]===>" + message) + logger.debug("[wsClient.sendMsgNoResp()]===>" + message) let msg = JSON.parse(message); if (msg.args.id !== undefined) { msg.args.id = BigInt(msg.args.id) @@ -105,7 +105,7 @@ export class WebSocketConnector { sendMsg(message: string, register: Boolean = true) { - console.log("[wsClient.sendMessage()]===>" + message) + logger.debug("[wsClient.sendMessage()]===>" + message) let msg = JSON.parse(message); if (msg.args.id !== undefined) { msg.args.id = BigInt(msg.args.id) @@ -118,7 +118,7 @@ export class WebSocketConnector { timeout:this._timeout, id: msg.args.id === undefined ? msg.args.id : BigInt(msg.args.id) }, resolve, reject); } - console.log("[wsClient.sendMessage.msg]===>\n", message) + logger.debug("[wsClient.sendMessage.msg]===>\n", message) this._wsConn.send(message) } else { reject(new WebSocketQueryError(ErrorCode.ERR_WEBSOCKET_CONNECTION, @@ -128,7 +128,6 @@ export class WebSocketConnector { } sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, register: Boolean = true) { - return new Promise((resolve, reject) => { if (this._wsConn && this._wsConn.readyState > 0) { if (register) { @@ -136,7 +135,7 @@ export class WebSocketConnector { timeout:this._timeout, id: reqId}, resolve, reject); } - console.log("[wsClient.sendBinaryMsg()]===>" + reqId, action, message.byteLength) + logger.debug("[wsClient.sendBinaryMsg()]===>" + reqId, action, message.byteLength) this._wsConn.send(message) } else { reject(new WebSocketQueryError(ErrorCode.ERR_WEBSOCKET_CONNECTION, diff --git a/nodejs/src/client/wsConnectorPool.ts b/nodejs/src/client/wsConnectorPool.ts index 8f7b01a..e6c4386 100644 --- a/nodejs/src/client/wsConnectorPool.ts +++ b/nodejs/src/client/wsConnectorPool.ts @@ -1,13 +1,14 @@ import { Mutex } from "async-mutex"; import { WebSocketConnector } from "./wsConnector"; import { ErrorCode, TDWebSocketClientError } from "../common/wsError"; +import logger from "../common/log"; const mutex = new Mutex(); export class WebSocketConnectionPool { private static _instance?:WebSocketConnectionPool; private pool: Map = new Map(); - private _connectionCount: number; - private _maxConnections: number; + private _connectionCount: number; + private readonly _maxConnections: number; private constructor(maxConnections: number = -1) { this._maxConnections = maxConnections; this._connectionCount = 0; @@ -35,11 +36,11 @@ export class WebSocketConnectionPool { } if (connector) { - console.log("get connection success:", this._connectionCount) + logger.debug("get connection success:", this._connectionCount) return connector; } if (this._maxConnections != -1 && this._connectionCount > this._maxConnections) { - throw new TDWebSocketClientError(ErrorCode.ERR_WEBSOCKET_CONNECTION_ARRIVED_LIMIT, "websocket connect arrived limite:" + this._connectionCount) + throw new TDWebSocketClientError(ErrorCode.ERR_WEBSOCKET_CONNECTION_ARRIVED_LIMIT, "websocket connect arrived limited:" + this._connectionCount) } this._connectionCount++ @@ -83,7 +84,7 @@ export class WebSocketConnectionPool { } } } - console.log("destroyed connect:" + this._connectionCount) + logger.debug("destroyed connect:" + this._connectionCount) this._connectionCount = 0 this.pool = new Map() } @@ -91,20 +92,18 @@ export class WebSocketConnectionPool { process.on('beforeExit', (code) => { - console.log("begin destroy connect") + logger.info("begin destroy connect") WebSocketConnectionPool.Instance().Destroyed() }); process.on('SIGINT', () => { - console.log('Received SIGINT. Press Control-D to exit.'); - console.log("begin destroy connect") + logger.info('Received SIGINT. Press Control-D to exit, begin destroy connect...'); WebSocketConnectionPool.Instance().Destroyed() process.exit() }); process.on('SIGTERM', () => { - console.log('Received SIGINT. Press Control-D to exit.'); - console.log("begin destroy connect") + console.log('Received SIGINT. Press Control-D to exit, begin destroy connect'); WebSocketConnectionPool.Instance().Destroyed() process.exit() }); diff --git a/nodejs/src/client/wsEventCallback.ts b/nodejs/src/client/wsEventCallback.ts index 9cd951c..b604b65 100644 --- a/nodejs/src/client/wsEventCallback.ts +++ b/nodejs/src/client/wsEventCallback.ts @@ -1,6 +1,7 @@ import { Mutex } from "async-mutex"; import { ErrorCode, TDWebSocketClientError, WebSocketQueryError } from "../common/wsError"; import { MessageResp } from "../common/taosResult"; +import logger from "../common/log"; interface MessageId { action: string, @@ -93,7 +94,7 @@ export class WsEventCallback { }; action.resolve(resp); } else { - console.log("no find callback msg:=", msg) + logger.error("no find callback msg:=", msg) throw new TDWebSocketClientError(ErrorCode.ERR_WS_NO_CALLBACK, "no callback registered for fetch_block with req_id=" + msg.req_id + " action" + msg.action); } diff --git a/nodejs/src/common/config.ts b/nodejs/src/common/config.ts index e77d337..49a63b3 100644 --- a/nodejs/src/common/config.ts +++ b/nodejs/src/common/config.ts @@ -4,12 +4,19 @@ export class WSConfig { private _db: string | undefined | null; private _url: string; private _timeout:number| undefined | null; - + private _token:string | undefined | null; constructor(url:string) { this._url = url; } + public GetToken(): string | undefined | null { + return this._token; + } + public SetToken(token: string) { + this._token = token; + } + public GetUser(): string | undefined | null { return this._user; } diff --git a/nodejs/src/common/taosResult.ts b/nodejs/src/common/taosResult.ts index bf4c2ff..e91443a 100644 --- a/nodejs/src/common/taosResult.ts +++ b/nodejs/src/common/taosResult.ts @@ -2,6 +2,7 @@ import { WSFetchBlockResponse, WSQueryResponse } from "../client/wsResponse"; import { ColumnsBlockType, TDengineTypeCode, TDengineTypeName } from './constant' import { ErrorCode, TaosResultError, WebSocketQueryInterFaceError } from "./wsError"; import { AppendRune } from "./ut8Helper" +import logger from "./log"; export interface TDengineMeta { name: string, @@ -61,7 +62,6 @@ export class TaosResult { this._timing = queryResponse.timing this._precision = queryResponse.precision this._totalTime = queryResponse.totalTime - // console.log(`typeof this.timing:${typeof this.timing}, typeof fetchResponse.timing:${typeof queryResponse.timing}`) } public SetRowsAndTime(rows: number, timing?:bigint) { @@ -100,7 +100,7 @@ export class TaosResult { public GetTotalTime() { return this._totalTime; } - public AddtotalTime(totalTime:number) { + public AddTotalTime(totalTime:number) { this._totalTime += totalTime; } @@ -136,9 +136,6 @@ export function parseBlock(rows: number, blocks: WSFetchBlockResponse, taosResul let metaList = taosResult.GetTaosMeta() let dataList = taosResult.GetData() if (metaList && dataList) { - // console.log(typeof taosResult.timing) - // console.log(typeof blocks.timing) - // console.log(blocks.id) taosResult.SetTiming(blocks.timing) const INT_32_SIZE = 4; @@ -164,9 +161,6 @@ export function parseBlock(rows: number, blocks: WSFetchBlockResponse, taosResul for (let j = 0; j < metaList.length; j++) { let isVarType = _isVarType(metaList[j]) - // console.log("== dataBuffer Length:" + dataBuffer.byteLength) - // console.log("== loop i:" + i + "J=" + j + "col:" + metaList[j].name + "type:" + metaList[j].type) - // console.log("== loop isVarType:" + isVarType); if (isVarType == ColumnsBlockType.SOLID) { colDataHead = colBlockHead + bitMapSize + metaList[j].length * i @@ -174,11 +168,6 @@ export function parseBlock(rows: number, blocks: WSFetchBlockResponse, taosResul let byteArrayIndex = i >> 3; let bitwiseOffset = 7 - (i & 7) let bitMapArr = dataBuffer.slice(colBlockHead, colBlockHead + bitMapSize) - // console.log("==i:" + i + "byteArrayIndex=" + byteArrayIndex) - // console.log("== loop colblockhead:" + colBlockHead) - // console.log("== loop bitmap:" + bitMapSize) - // console.log("== loop bitMap length=" + bitMapArr.byteLength) - // console.log("==loop bitMap bitwiseoffset:" + bitwiseOffset + "byteArrayIndex:" + byteArrayIndex) let bitFlag = ((new DataView(bitMapArr).getUint8(byteArrayIndex)) & (1 << bitwiseOffset)) >> bitwiseOffset if (bitFlag == 1) { @@ -186,20 +175,18 @@ export function parseBlock(rows: number, blocks: WSFetchBlockResponse, taosResul } else { row.push(readSolidData(dataBuffer, colDataHead, metaList[j])) } - // console.log("=====(new DataView(dataBuffer, INT_32_SIZE * j, INT_32_SIZE).getInt32(0))=" + (new DataView(dataBuffer, INT_32_SIZE * j, INT_32_SIZE).getInt32(0, true))); + colBlockHead = colBlockHead + bitMapSize + (new DataView(dataBuffer, INT_32_SIZE * j, INT_32_SIZE).getInt32(0, true)) } else { // if null check let varOffset = new DataView(dataBuffer, colBlockHead + (INT_32_SIZE * i), INT_32_SIZE).getInt32(0, true) - // console.log("== var type offset:" + varOffset) if (varOffset == -1) { row.push("NULL") colBlockHead = colBlockHead + INT_32_SIZE * rows + (new DataView(dataBuffer, j * INT_32_SIZE, INT_32_SIZE).getInt32(0, true)) } else { colDataHead = colBlockHead + INT_32_SIZE * rows + varOffset let dataLength = (new DataView(dataBuffer, colDataHead, 2).getInt16(0, true)) - // console.log("== loop var type length:" + dataLength, isVarType) if (isVarType == ColumnsBlockType.VARCHAR) { row.push(readVarchar(dataBuffer, colDataHead + 2, dataLength)) } else if(isVarType == ColumnsBlockType.GEOMETRY || isVarType == ColumnsBlockType.VARBINARY) { @@ -356,7 +343,7 @@ export function readSolidDataToArray(buffer: ArrayBuffer, colBlockHead:number, break; } default: { - throw new WebSocketQueryInterFaceError(ErrorCode.ERR_UNSPPORTED_TDENGINE_TYPE, `unspported type ${meta.type} for column ${meta.name}`) + throw new WebSocketQueryInterFaceError(ErrorCode.ERR_UNSUPPORTED_TDENGINE_TYPE, `unspported type ${meta.type} for column ${meta.name}`) } } return result; @@ -403,7 +390,7 @@ export function readSolidData(dataBuffer: ArrayBuffer, colDataHead: number, meta // could change } default: { - throw new WebSocketQueryInterFaceError(ErrorCode.ERR_UNSPPORTED_TDENGINE_TYPE, `unspported type ${meta.type} for column ${meta.name}`) + throw new WebSocketQueryInterFaceError(ErrorCode.ERR_UNSUPPORTED_TDENGINE_TYPE, `unspported type ${meta.type} for column ${meta.name}`) } } } @@ -421,11 +408,9 @@ export function readVarchar(dataBuffer: ArrayBuffer, colDataHead: number, length } export function readNchar(dataBuffer: ArrayBuffer, colDataHead: number, length: number): string { - let decoder = new TextDecoder(); let data = ""; let buff: ArrayBuffer = dataBuffer.slice(colDataHead, colDataHead + length); for (let i = 0; i < length / 4; i++) { - // console.log("== readNchar data:" + new DataView(buff, i * 4, 4).getUint32(0, true)) data += AppendRune(new DataView(buff, i * 4, 4).getUint32(0, true)) } @@ -436,7 +421,7 @@ export function readNchar(dataBuffer: ArrayBuffer, colDataHead: number, length: function iteratorBuff(arr: ArrayBuffer) { let buf = Buffer.from(arr); for (const value of buf) { - console.log(value.toString()) + logger.debug(value.toString()) } } diff --git a/nodejs/src/common/ut8Helper.ts b/nodejs/src/common/ut8Helper.ts index 954bd17..c9f9e20 100644 --- a/nodejs/src/common/ut8Helper.ts +++ b/nodejs/src/common/ut8Helper.ts @@ -22,8 +22,6 @@ const rune3Max = (1 << 16) - 1; // it appends the encoding of RuneError. export function AppendRune(r:any) { let p:Array = []; - // console.log("== AppendRun r:"); - // console.log(r) if (r <= rune1Max) { p.push(r & 0xff); return Buffer.from(p).toString(); diff --git a/nodejs/src/common/utils.ts b/nodejs/src/common/utils.ts index 6edb6b7..19018e6 100644 --- a/nodejs/src/common/utils.ts +++ b/nodejs/src/common/utils.ts @@ -8,6 +8,12 @@ export function GetUrl(wsConfig:WSConfig):URL { if (wsConfig.GetPwd()) { url.password = wsConfig.GetPwd() || '' } + + let token = wsConfig.GetToken() + if (token) { + url.searchParams.set("token", token) + } + url.pathname = '/ws' return url } diff --git a/nodejs/src/common/wsError.ts b/nodejs/src/common/wsError.ts index ce6d77f..d25e326 100644 --- a/nodejs/src/common/wsError.ts +++ b/nodejs/src/common/wsError.ts @@ -17,8 +17,8 @@ export class TDWebSocketClientError extends Error { export class WebSocketQueryError extends TDWebSocketClientError { } export class WebSocketInterfaceError extends TDWebSocketClientError {} export class WebSocketQueryInterFaceError extends WebSocketInterfaceError{} -export class TaosResultError extends TDWebSocketClientError{}; -export class TaosError extends TDWebSocketClientError{}; +export class TaosResultError extends TDWebSocketClientError{} +export class TaosError extends TDWebSocketClientError{} export enum ErrorCode { ERR_INVALID_PARAMS = 100, @@ -28,7 +28,7 @@ export enum ErrorCode { ERR_WEBSOCKET_CONNECTION = 104, ERR_WEBSOCKET_QUERY_TIMEOUT = 105, ERR_INVALID_AUTHENTICATION = 106, - ERR_UNSPPORTED_TDENGINE_TYPE = 107, + ERR_UNSUPPORTED_TDENGINE_TYPE = 107, ERR_CONNECTION_CLOSED = 108, ERR_INVALID_FETCH_MESSAGE_DATA = 109, ERR_PARTITIONS_TOPIC_VGROUP_LENGTH_NOT_EQUAL = 110, diff --git a/nodejs/src/sql/wsRows.ts b/nodejs/src/sql/wsRows.ts index 9a10c5f..a79e883 100644 --- a/nodejs/src/sql/wsRows.ts +++ b/nodejs/src/sql/wsRows.ts @@ -2,10 +2,11 @@ import { TDengineMeta, TaosResult } from '../common/taosResult'; import { TaosResultError } from '../common/wsError'; import { WSQueryResponse } from '../client/wsResponse'; import { WsClient } from '../client/wsClient'; +import logger from '../common/log'; export class WSRows { private _wsClient: WsClient; - private _wsQueryResponse: WSQueryResponse; + private readonly _wsQueryResponse: WSQueryResponse; private _taosResult: TaosResult; private _isClose : boolean; constructor(wsInterface: WsClient, resp: WSQueryResponse) { @@ -16,8 +17,8 @@ export class WSRows { } async Next(): Promise { - if (this._wsQueryResponse.is_update == true || this._isClose) { - console.log("WSRows::Next::End=>", this._taosResult, this._isClose) + if (this._wsQueryResponse.is_update || this._isClose) { + logger.debug("WSRows::Next::End=>", this._taosResult, this._isClose) return false; } @@ -29,17 +30,17 @@ export class WSRows { } this._taosResult = await this.getBlockData(); - if (this._taosResult.GetData() == null) { - return false; + if (this._taosResult.GetData()) { + return true; } - return true; + return false; } private async getBlockData():Promise { try { let wsFetchResponse = await this._wsClient.fetch(this._wsQueryResponse); - console.log("[wsQuery.execute.wsFetchResponse]==>\n", wsFetchResponse) - if (wsFetchResponse.completed == true) { + logger.debug("[wsQuery.execute.wsFetchResponse]==>\n", wsFetchResponse) + if (wsFetchResponse.completed) { this.Close(); this._taosResult.SetData(null); } else { @@ -58,7 +59,7 @@ export class WSRows { } GetData(): Array | undefined { - if (this._wsQueryResponse.is_update == true) { + if (this._wsQueryResponse.is_update) { return undefined; } diff --git a/nodejs/src/sql/wsSql.ts b/nodejs/src/sql/wsSql.ts index 049c65a..23179bc 100644 --- a/nodejs/src/sql/wsSql.ts +++ b/nodejs/src/sql/wsSql.ts @@ -9,6 +9,7 @@ import { Precision, SchemalessMessageInfo, SchemalessProto } from './wsProto' import { WsStmt } from '../stmt/wsStmt' import { ReqId } from '../common/reqid' import { PrecisionLength } from '../common/constant' +import logger from '../common/log' export class WsSql{ private wsConfig:WSConfig; @@ -92,7 +93,7 @@ export class WsSql{ let wsStmt = await WsStmt.NewStmt(this._wsClient, precision, reqId); resolve(wsStmt); } catch(e) { - console.log(e) + logger.error(e) reject(e); } }else{ @@ -119,30 +120,27 @@ export class WsSql{ try { let wsQueryResponse:WSQueryResponse = await this._wsClient.exec(this.getSql(sql, reqId, action)); let taosResult = new TaosResult(wsQueryResponse); - if (wsQueryResponse.is_update == true) { + if (wsQueryResponse.is_update) { return taosResult; } else { try{ while (true) { let wsFetchResponse = await this._wsClient.fetch(wsQueryResponse) - if (wsFetchResponse.completed == true) { + if (wsFetchResponse.completed) { break; } else { taosResult.SetRowsAndTime(wsFetchResponse.rows, wsFetchResponse.timing); - let tmp: TaosResult = await this._wsClient.fetchBlock(wsFetchResponse, taosResult); - taosResult = tmp; + taosResult = await this._wsClient.fetchBlock(wsFetchResponse, taosResult); } } return taosResult; - } catch(e){ - let err :any = e + } catch(err: any){ throw new TaosResultError(err.code, err.message); } finally { this._wsClient.freeResult(wsQueryResponse) } } - } catch(e) { - let err :any = e + } catch(err: any) { throw new TaosResultError(err.code, err.message); } } @@ -163,8 +161,7 @@ export class WsSql{ try { let wsQueryResponse:WSQueryResponse = await this._wsClient.exec(this.getSql(sql, reqId)); return new WSRows(this._wsClient, wsQueryResponse); - } catch (e) { - let err :any = e + } catch (err: any) { throw new TaosResultError(err.code, err.message); } diff --git a/nodejs/src/stmt/wsParams.ts b/nodejs/src/stmt/wsParams.ts index 1b0915e..48d6cf3 100644 --- a/nodejs/src/stmt/wsParams.ts +++ b/nodejs/src/stmt/wsParams.ts @@ -17,8 +17,8 @@ export class ColumnInfo { } export class StmtBindParams { - private precisionLength:number = PrecisionLength['ms'] - private _params: ColumnInfo[]; + private readonly precisionLength:number = PrecisionLength['ms'] + private readonly _params: ColumnInfo[]; private _dataTotalLen:number = 0; private _rows = 0; constructor(precision?:number) { @@ -45,7 +45,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBooleanColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "boolean", TDengineTypeLength['BOOL'], TDengineTypeCode['BOOL']) + let arrayBuffer = this.encodeDigitColumns(params, "boolean", TDengineTypeLength['BOOL'], TDengineTypeCode['BOOL']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['BOOL'], TDengineTypeLength['BOOL'])) ; } @@ -54,7 +54,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetTinyIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['TINYINT'], TDengineTypeCode['TINYINT']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['TINYINT'], TDengineTypeCode['TINYINT']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['TINYINT'], TDengineTypeLength['TINYINT'])); } @@ -62,7 +62,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetUTinyIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['TINYINT UNSIGNED'], TDengineTypeCode['TINYINT UNSIGNED']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['TINYINT UNSIGNED'], TDengineTypeCode['TINYINT UNSIGNED']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['TINYINT UNSIGNED'], TDengineTypeLength['TINYINT UNSIGNED'])); } @@ -70,7 +70,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetSmallIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['SMALLINT'], TDengineTypeCode['SMALLINT']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['SMALLINT'], TDengineTypeCode['SMALLINT']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['SMALLINT'], TDengineTypeLength['SMALLINT'])); } @@ -79,7 +79,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetSmallIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['SMALLINT UNSIGNED'], TDengineTypeCode['SMALLINT UNSIGNED']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['SMALLINT UNSIGNED'], TDengineTypeCode['SMALLINT UNSIGNED']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['SMALLINT UNSIGNED'], TDengineTypeLength['SMALLINT UNSIGNED'])); } @@ -87,7 +87,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['INT'], TDengineTypeCode['INT']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['INT'], TDengineTypeCode['INT']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['INT'], TDengineTypeLength['INT'])); } @@ -95,7 +95,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetUIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['INT UNSIGNED'], TDengineTypeCode['INT UNSIGNED']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['INT UNSIGNED'], TDengineTypeCode['INT UNSIGNED']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['INT UNSIGNED'], TDengineTypeLength['INT UNSIGNED'])); } @@ -103,7 +103,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBigIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "bigint", TDengineTypeLength['BIGINT'], TDengineTypeCode['BIGINT']) + let arrayBuffer = this.encodeDigitColumns(params, "bigint", TDengineTypeLength['BIGINT'], TDengineTypeCode['BIGINT']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['INT'], TDengineTypeLength['BIGINT'])); } @@ -111,7 +111,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetUBigIntColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "bigint", TDengineTypeLength['BIGINT UNSIGNED'], TDengineTypeCode['BIGINT UNSIGNED']) + let arrayBuffer = this.encodeDigitColumns(params, "bigint", TDengineTypeLength['BIGINT UNSIGNED'], TDengineTypeCode['BIGINT UNSIGNED']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['BIGINT UNSIGNED'], TDengineTypeLength['BIGINT UNSIGNED'])); } @@ -119,7 +119,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetFloatColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['FLOAT'], TDengineTypeCode['FLOAT']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['FLOAT'], TDengineTypeCode['FLOAT']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['FLOAT'], TDengineTypeLength['FLOAT'])); } @@ -127,7 +127,7 @@ export class StmtBindParams { if (!params || params.length == 0) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetDoubleColumn params is invalid!"); } - let arrayBuffer = this.encodeColumnNumbers(params, "number", TDengineTypeLength['DOUBLE'], TDengineTypeCode['DOUBLE']) + let arrayBuffer = this.encodeDigitColumns(params, "number", TDengineTypeLength['DOUBLE'], TDengineTypeCode['DOUBLE']) this._params.push(new ColumnInfo(arrayBuffer, TDengineTypeCode['DOUBLE'], TDengineTypeLength['DOUBLE'])); } @@ -201,15 +201,15 @@ export class StmtBindParams { data = params[i] } //statistical bits of digit - let ndigit = this.countBigintDigits(data) + let digit = this.countBigintDigits(data) //check digit same table Precision if (this.precisionLength == PrecisionLength['ns']) { - if (this.precisionLength <= ndigit) { + if (this.precisionLength <= digit) { dataBuffer.setBigInt64(i * 8, data, true); } else { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params precisionLength is invalid! param:=" + params[i]) } - } else if (this.precisionLength == ndigit) { + } else if (this.precisionLength == digit) { dataBuffer.setBigInt64(i * 8, data, true); } else { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params is invalid! param:=" + params[i]) @@ -228,7 +228,7 @@ export class StmtBindParams { } - private encodeColumnNumbers(params:any[], dataType:string = 'number', typeLen:number, columnType:number):[number, ArrayBuffer] { + private encodeDigitColumns(params:any[], dataType:string = 'number', typeLen:number, columnType:number):[number, ArrayBuffer] { let bitMapLen:number = BitmapLen(params.length) let arrayBuffer = new ArrayBuffer(typeLen * params.length + bitMapLen); let bitmapBuffer = new DataView(arrayBuffer) @@ -243,7 +243,6 @@ export class StmtBindParams { for (let i = 0; i < params.length; i++) { if (!IsEmpty(params[i])) { - // console.log("ddddd=>", bitMapLen, typeLen * params.length, columnType, params[i]) if (typeof params[i] == dataType) { switch (columnType) { case TDengineTypeCode['BOOL']: { @@ -300,7 +299,7 @@ export class StmtBindParams { break; } default: { - throw new TaosError(ErrorCode.ERR_UNSPPORTED_TDENGINE_TYPE, "unspported type for column" + columnType) + throw new TaosError(ErrorCode.ERR_UNSUPPORTED_TDENGINE_TYPE, "unsupported type for column" + columnType) } } @@ -368,7 +367,7 @@ export class StmtBindParams { } //splicing encode params to arraybuffer private getBinaryColumnArrayBuffer(data:ArrayBuffer[], paramsLenBuffer: ArrayBuffer, dataLength:number):ArrayBuffer { - //creat arraybuffer + //create arraybuffer let paramsBuffer = new ArrayBuffer(paramsLenBuffer.byteLength + dataLength) //get length data range const paramsUint8 = new Uint8Array(paramsBuffer); @@ -413,7 +412,7 @@ export class StmtBindParams { let codes:number[] = []; let strNcharParams:string = params[i]; for (let j = 0; j < params[i].length; j++) { - //get char, cn char neet 3~4 byte + //get char, cn char need 3~4 byte codes.push(strNcharParams.charCodeAt(j)); } diff --git a/nodejs/src/stmt/wsProto.ts b/nodejs/src/stmt/wsProto.ts index 1fe7030..bdf7b19 100644 --- a/nodejs/src/stmt/wsProto.ts +++ b/nodejs/src/stmt/wsProto.ts @@ -96,9 +96,6 @@ export function binaryBlockEncode(bindParams :StmtBindParams, bindType:StmtBindT headOffset += 5 } - // console.log('bindParams.GetDataTotalLen -->', new Uint8Array(arrayBuffer)) - - // throw new TaosResultError(ErrorCode.ERR_INVALID_FETCH_MESSAGE_DATA, `test`) return arrayBuffer; } \ No newline at end of file diff --git a/nodejs/src/stmt/wsStmt.ts b/nodejs/src/stmt/wsStmt.ts index 2a3f185..b7a79b3 100644 --- a/nodejs/src/stmt/wsStmt.ts +++ b/nodejs/src/stmt/wsStmt.ts @@ -193,7 +193,7 @@ export class WsStmt { this.lastAffected = resp.affected } return - } catch (e:any) { + } catch (e: any) { throw new TaosResultError(e.code, e.message); } } diff --git a/nodejs/src/tmq/config.ts b/nodejs/src/tmq/config.ts index a0fc036..99e8646 100644 --- a/nodejs/src/tmq/config.ts +++ b/nodejs/src/tmq/config.ts @@ -6,7 +6,7 @@ export class TmqConfig { user: string; password: string; group_id: string; - clien_id: string; + client_id: string; offset_rest: string; topics?: Array; auto_commit: boolean; @@ -19,7 +19,7 @@ export class TmqConfig { this.user = wsConfig.get(TMQConstants.CONNECT_USER); this.password = wsConfig.get(TMQConstants.CONNECT_PASS); this.group_id = wsConfig.get(TMQConstants.GROUP_ID); - this.clien_id = wsConfig.get(TMQConstants.CLIENT_ID); + this.client_id = wsConfig.get(TMQConstants.CLIENT_ID); this.offset_rest = wsConfig.get(TMQConstants.AUTO_OFFSET_RESET); this.auto_commit = wsConfig.get(TMQConstants.ENABLE_AUTO_COMMIT); @@ -49,6 +49,7 @@ export class TmqConfig { }else{ this.password = this.url.password; } + this.url.pathname = '/rest/tmq' } } diff --git a/nodejs/src/tmq/tmqResponse.ts b/nodejs/src/tmq/tmqResponse.ts index 5a44617..e146ff1 100644 --- a/nodejs/src/tmq/tmqResponse.ts +++ b/nodejs/src/tmq/tmqResponse.ts @@ -1,5 +1,3 @@ -// resp: {"code":0,"message":"","action":"poll","req_id":3,"have_message":true,"topic":"test_tmq_ws_topic","database":"test_ws_tmq","vgroup_id":6,"message_id":1} - import { WSQueryResponse } from "../client/wsResponse"; import { ColumnsBlockType, TDengineTypeLength } from "../common/constant"; import { MessageResp, TaosResult, _isVarType, readBinary, readNchar, readSolidDataToArray, readVarchar } from "../common/taosResult"; @@ -150,7 +148,7 @@ export class PartitionsResp{ } -export class CommitedResp extends PartitionsResp { +export class CommittedResp extends PartitionsResp { constructor(resp:MessageResp) { super(resp); this.positions = resp.msg.committed diff --git a/nodejs/src/tmq/wsTmq.ts b/nodejs/src/tmq/wsTmq.ts index 395d634..a01f95f 100644 --- a/nodejs/src/tmq/wsTmq.ts +++ b/nodejs/src/tmq/wsTmq.ts @@ -3,8 +3,9 @@ import { TMQConstants, TMQMessageType } from './constant'; import { WsClient } from '../client/wsClient'; import { TaosResult } from '../common/taosResult'; import { ErrorCode, TaosResultError, WebSocketInterfaceError } from '../common/wsError'; -import { AssignmentResp, CommitedResp, PartitionsResp, SubscriptionResp, TaosTmqResult, TopicPartition, WSTmqFetchBlockResponse, WsPollResponse, WsTmqQueryResponse, parseTmqBlock} from './tmqResponse'; +import { AssignmentResp, CommittedResp, PartitionsResp, SubscriptionResp, TaosTmqResult, TopicPartition, WSTmqFetchBlockResponse, WsPollResponse, WsTmqQueryResponse, parseTmqBlock} from './tmqResponse'; import { ReqId } from '../common/reqid'; +import logger from '../common/log'; export class WsConsumer { private _wsClient: WsClient; @@ -13,7 +14,7 @@ export class WsConsumer { private _commitTime?:number; private constructor(wsConfig:Map) { this._wsConfig = new TmqConfig(wsConfig) - console.log(this._wsConfig) + logger.debug(this._wsConfig) this._wsClient = new WsClient(this._wsConfig.url, this._wsConfig.timeout); } @@ -51,7 +52,7 @@ export class WsConsumer { user :this._wsConfig.user, password :this._wsConfig.password, group_id :this._wsConfig.group_id, - clien_id :this._wsConfig.clien_id, + client_id :this._wsConfig.client_id, topics :topics, offset_rest:this._wsConfig.offset_rest, auto_commit:this._wsConfig.auto_commit, @@ -165,7 +166,7 @@ export class WsConsumer { }) } - Commited(partitions:Array, reqId?:number):Promise>{ + Committed(partitions:Array, reqId?:number):Promise>{ if (!partitions || partitions.length == 0 ) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq Positions params is error!'); } @@ -189,7 +190,7 @@ export class WsConsumer { }; try { let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); - resolve(new CommitedResp(resp).SetTopicPartitions(offsets)) + resolve(new CommittedResp(resp).SetTopicPartitions(offsets)) } catch (e:any) { reject(new TaosResultError(e.code, e.message)); } @@ -209,7 +210,7 @@ export class WsConsumer { allp.push(this.CommitOffset(e)) }) await Promise.all(allp) - resolve(await this.Commited(partitions)) + resolve(await this.Committed(partitions)) }catch(e:any) { reject(new TaosResultError(e.code, e.message)); } @@ -319,7 +320,7 @@ export class WsConsumer { try { return await this._wsClient.exec(queryMsg, false); } catch (e:any) { - console.log(e); + logger.error(e); throw new TaosResultError(e.code, e.message); } } @@ -379,17 +380,12 @@ export class WsConsumer { var taosResults: Map = new Map(); let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); let pollResp = new WsPollResponse(resp) - if (pollResp.have_message == false || pollResp.message_type != TMQMessageType.ResDataType) { + if (!pollResp.have_message || pollResp.message_type != TMQMessageType.ResDataType) { resolve(taosResults); } else { - // let count = 0 - // let startTime = new Date().getTime(); while (true) { - // count++ let fetchResp = await this.fetch(pollResp) if (fetchResp.completed || fetchResp.rows == 0) { - let currTime = new Date().getTime(); - // console.log("----------count-->", count, Math.abs(currTime - startTime)) break; } let taosResult = taosResults.get(pollResp.topic + pollResp.vgroup_id) @@ -406,7 +402,7 @@ export class WsConsumer { resolve(taosResults); } } catch (e :any) { - console.log(e); + logger.error(e); reject(new TaosResultError(e.code, e.message)); } }) diff --git a/nodejs/test/bulkPulling/queryTables.test.ts b/nodejs/test/bulkPulling/queryTables.test.ts index 5b4149f..d377e47 100644 --- a/nodejs/test/bulkPulling/queryTables.test.ts +++ b/nodejs/test/bulkPulling/queryTables.test.ts @@ -2,8 +2,8 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; import { createSTable, createSTableJSON, createTable, expectStableData, insertNTable, insertStable, jsonMeta, tableMeta, tagMeta } from "../utils"; -// const DSN = 'ws://root:taosdata@127.0.0.1:6041/ws' -let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; +// const DSN = 'ws://root:taosdata@127.0.0.1:6041' +let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) const table = 'ws_q_n'; const stable = 'ws_q_s'; @@ -119,13 +119,13 @@ describe('ws.query(stable)', () => { expect(meta.name).toBe(expectMeta[index].name) expect(meta.type).toBe(expectMeta[index].type) expect(meta.length).toBe(expectMeta[index].length) - //// console.log(meta); }) for (let i = 0; i < actualData.length; i++) { actualData[i].forEach((d, index) => { if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { expect(d).toBeTruthy() + } else { expect(d).toBe(expectData[i][index]) } diff --git a/nodejs/test/bulkPulling/schemaless.test.ts b/nodejs/test/bulkPulling/schemaless.test.ts index 04c0618..e96bd7a 100644 --- a/nodejs/test/bulkPulling/schemaless.test.ts +++ b/nodejs/test/bulkPulling/schemaless.test.ts @@ -6,7 +6,7 @@ import { WsSql } from "../../src/sql/wsSql"; beforeAll(async () => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -25,7 +25,7 @@ describe('TDWebSocket.WsSchemaless()', () => { let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}" test('normal connect', async() => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -39,7 +39,7 @@ describe('TDWebSocket.WsSchemaless()', () => { expect.assertions(1) let wsSchemaless = null; try { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -56,7 +56,7 @@ describe('TDWebSocket.WsSchemaless()', () => { }) test('normal insert', async() => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -70,7 +70,7 @@ describe('TDWebSocket.WsSchemaless()', () => { }); test('normal wsSql insert', async() => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -81,11 +81,12 @@ describe('TDWebSocket.WsSchemaless()', () => { await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NANO_SECONDS, 0); await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); + wsSchemaless.Close(); }); test('SchemalessProto error', async() => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') diff --git a/nodejs/test/bulkPulling/sql.test.ts b/nodejs/test/bulkPulling/sql.test.ts index 12db9ca..d0a4dab 100644 --- a/nodejs/test/bulkPulling/sql.test.ts +++ b/nodejs/test/bulkPulling/sql.test.ts @@ -2,7 +2,7 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; beforeAll(async () => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -16,7 +16,7 @@ beforeAll(async () => { describe('TDWebSocket.WsSql()', () => { jest.setTimeout(20 * 1000) test('normal connect', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsSql = null; let conf :WSConfig = new WSConfig(dsn) conf.SetDb('power') @@ -29,7 +29,7 @@ describe('TDWebSocket.WsSql()', () => { expect.assertions(1) let wsSql = null; try { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) conf.SetDb('jest') wsSql = await WsSql.Open(conf) @@ -43,7 +43,7 @@ describe('TDWebSocket.WsSql()', () => { } }) test('get taosc version', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let version = await wsSql.Version() @@ -53,7 +53,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('show databases', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('show databases') @@ -63,7 +63,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('create databases', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;') @@ -73,7 +73,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('create stable', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('use power') @@ -87,7 +87,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('insert recoder', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('use power') @@ -104,7 +104,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('query sql', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('use power') diff --git a/nodejs/test/bulkPulling/stmt.func.test.ts b/nodejs/test/bulkPulling/stmt.func.test.ts index ebd77f9..da79c21 100644 --- a/nodejs/test/bulkPulling/stmt.func.test.ts +++ b/nodejs/test/bulkPulling/stmt.func.test.ts @@ -2,7 +2,7 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; beforeAll(async () => { - let dns = 'ws://192.168.1.95:6041/ws' + let dns = 'ws://192.168.1.95:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -25,7 +25,7 @@ describe('TDWebSocket.Stmt()', () => { [0.32, 0.33, 0.34], ]; test('normal connect', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -40,7 +40,7 @@ describe('TDWebSocket.Stmt()', () => { expect.assertions(1) let connector = null; try { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf :WSConfig = new WSConfig(dsn) wsConf.SetDb('jest') connector = await WsSql.Open(wsConf) @@ -56,7 +56,7 @@ describe('TDWebSocket.Stmt()', () => { }) test('normal Prepare', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -74,7 +74,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('set tag error', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -95,7 +95,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('error Prepare table', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -114,7 +114,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('error Prepare tag', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -133,7 +133,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') // let connector = WsStmtConnect.NewConnector(wsConf) @@ -176,7 +176,7 @@ describe('TDWebSocket.Stmt()', () => { test('error BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -213,7 +213,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('no Batch', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -249,7 +249,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('Batch after BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -297,7 +297,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('no set tag', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -325,7 +325,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal binary BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -356,7 +356,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal json BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) diff --git a/nodejs/test/bulkPulling/stmt.type.test.ts b/nodejs/test/bulkPulling/stmt.type.test.ts index 0c2767d..afeee4c 100644 --- a/nodejs/test/bulkPulling/stmt.type.test.ts +++ b/nodejs/test/bulkPulling/stmt.type.test.ts @@ -83,7 +83,7 @@ const selectJsonTableCN = `select * from ${jsonTableCN}` beforeAll(async () => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) let ws = await WsSql.Open(conf); await ws.Exec(dropDB); @@ -97,7 +97,7 @@ beforeAll(async () => { describe('TDWebSocket.Stmt()', () => { jest.setTimeout(20 * 1000) test('normal BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) @@ -154,7 +154,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal CN BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) @@ -205,13 +205,13 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Exec() expect(stmt.GetLastAffected()).toEqual(5) await stmt.Close() - let result = await connector.Exec(`select * from ${db}.${stable}`) + let result = await connector.Exec(`select count(*) from ${db}.${stable}`) console.log(result) connector.Close(); }); test('normal json tag BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) @@ -255,7 +255,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal json cn tag BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) diff --git a/nodejs/test/bulkPulling/tmq.test.ts b/nodejs/test/bulkPulling/tmq.test.ts index b36a6ee..a8f89b5 100644 --- a/nodejs/test/bulkPulling/tmq.test.ts +++ b/nodejs/test/bulkPulling/tmq.test.ts @@ -14,7 +14,7 @@ let createTopic = `create topic if not exists ${topics[0]} as select * from ${db let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};` // let dropTopic2 = `DROP TOPIC IF EXISTS ${topic2};` beforeAll(async () => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) const createDB = `create database if not exists ${db} keep 3650` const dropDB = `drop database if exists ${db}` @@ -63,14 +63,14 @@ describe('TDWebSocket.Tmq()', () => { [TMQConstants.CONNECT_PASS, "taosdata"], [TMQConstants.AUTO_OFFSET_RESET, "earliest"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://192.168.1.95:6041/rest/tmq'], + [TMQConstants.WS_URL, 'ws://192.168.1.95:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); test('normal connect', async() => { - // let dsn = 'ws://root:taosdata@192.168.1.95:6041/rest/tmq'; + // let dsn = 'ws://root:taosdata@192.168.1.95:6041'; // configMap.set(TMQConstants.WS_URL, dsn) let consumer = await WsConsumer.NewConsumer(configMap); consumer.Close(); @@ -85,7 +85,7 @@ describe('TDWebSocket.Tmq()', () => { [TMQConstants.CONNECT_PASS, "test"], [TMQConstants.AUTO_OFFSET_RESET, "earliest1"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://192.168.1.95:6041/rest/tmq'], + [TMQConstants.WS_URL, 'ws://192.168.1.95:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); @@ -103,7 +103,7 @@ describe('TDWebSocket.Tmq()', () => { test('normal Subscribe', async() => { - // let dsn = 'ws://root:taosdata@192.168.1.95:6041/rest/tmq'; + // let dsn = 'ws://root:taosdata@192.168.1.95:6041'; // configMap.set(TMQConstants.WS_URL, dsn) let consumer = await WsConsumer.NewConsumer(configMap); await consumer.Subscribe(topics); @@ -150,7 +150,7 @@ describe('TDWebSocket.Tmq()', () => { } assignment = await consumer.Commit(); console.log(assignment) - assignment = await consumer.Commited(assignment) + assignment = await consumer.Committed(assignment) console.log(assignment) await consumer.Unsubscribe() consumer.Close(); diff --git a/nodejs/test/utils.ts b/nodejs/test/utils.ts index 6eff84d..3b0dc89 100644 --- a/nodejs/test/utils.ts +++ b/nodejs/test/utils.ts @@ -273,6 +273,7 @@ export function expectStableData(rows: Array>, tags: Array): Arr }) return resArr; } + function hexToBytes(hex: string): ArrayBuffer { let byteLen = hex.length / 2; let a = new Uint16Array(byteLen) @@ -284,22 +285,33 @@ function hexToBytes(hex: string): ArrayBuffer { return a.buffer } -export function createStmtData():Array> { +export function createStmtData(varbinary:string = "ab", + geoHex:string = "0101000020E6100000000000000000F03F0000000000000040"):Array> { let multi:any[][] = [ [1709183268567, 1709183268568, 1709183268569], [10.2, 10.3, 10.4], [292, 293, 294], [0.32, 0.33, 0.34], ]; - let res = hexToBytes("0101000020E6100000000000000000F03F0000000000000040") + let res = hexToBytes(geoHex) let geom = Array.from(new Uint8Array(res)) multi.push([geom, geom, geom]) - res = new TextEncoder().encode("ab") + res = new TextEncoder().encode(varbinary) let binary = Array.from(new Uint8Array(res)) multi.push([binary, binary, binary]) return multi - - } + +export function compareUint8Arrays(arr1: Uint8Array, arr2: Uint8Array): boolean { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0; i < arr1.length; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} From 3c53dbdbfdd6eb8eb6ebce3a16cfad4205e470aa Mon Sep 17 00:00:00 2001 From: menshibin Date: Mon, 15 Apr 2024 12:57:20 +0800 Subject: [PATCH 03/17] modify reviw problems --- .gitignore | 2 ++ nodejs/example/basicSql.ts | 4 +-- nodejs/package.json | 2 -- nodejs/src/common/log.ts | 26 ++++++++++++++++ nodejs/test/bulkPulling/queryTables.test.ts | 34 ++++++++++++++++++--- nodejs/test/utils.ts | 11 ++++--- 6 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 nodejs/src/common/log.ts diff --git a/.gitignore b/.gitignore index 81055de..d7a452b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,11 @@ nodejs/dist/ nodejs/node_modules/ nodejs/tsc/ nodejs/coverage/ +nodejs/logs/ .DS_Store nodejs/*.log .idea node_modules/ npminstall-debug.log .vscode/ + diff --git a/nodejs/example/basicSql.ts b/nodejs/example/basicSql.ts index a7d27a0..b29ceef 100644 --- a/nodejs/example/basicSql.ts +++ b/nodejs/example/basicSql.ts @@ -1,6 +1,3 @@ - -require('qingwa')(); - import { WSConfig } from '../src/common/config'; import { sqlConnect } from '../index' @@ -55,5 +52,6 @@ let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; if (wsSql) { wsSql.Close(); } + console.log("finish!") } })(); diff --git a/nodejs/package.json b/nodejs/package.json index e3ef6ee..0602650 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -14,8 +14,6 @@ "test": "jest --coverage", "example": "tsc && node dist/example/basicSql.js", "build": "tsc", - "watch": "parcel watch", - "prepare": "parcel build", "prepublish": "npm run build" }, "repository": { diff --git a/nodejs/src/common/log.ts b/nodejs/src/common/log.ts new file mode 100644 index 0000000..26498ea --- /dev/null +++ b/nodejs/src/common/log.ts @@ -0,0 +1,26 @@ +import winston from 'winston'; +import DailyRotateFile from 'winston-daily-rotate-file'; + +const transport = new DailyRotateFile({ + filename: './logs/app-%DATE%.log', // Here is the file name template + datePattern: 'YYYY-MM-DD', // date format + zippedArchive: true, // Whether to compress the archive file into gzip format + maxSize: '20m', // Single file size limit + maxFiles: '14d', // Keep log files for 14 days + handleExceptions: true, // Whether to handle exceptions + json: false, // Whether to output logs in JSON format + format: winston.format.combine( + winston.format.timestamp(), + winston.format.printf(({ timestamp, level, message }) => { + return `${timestamp} [${level.toUpperCase()}]: ${message}`; + }), + ), + level: 'info', // set log level +}); + +const logger = winston.createLogger({ + transports: [transport], + exitOnError: false, // Do not exit the process when an error occurs +}); + +export default logger; diff --git a/nodejs/test/bulkPulling/queryTables.test.ts b/nodejs/test/bulkPulling/queryTables.test.ts index d377e47..856fee8 100644 --- a/nodejs/test/bulkPulling/queryTables.test.ts +++ b/nodejs/test/bulkPulling/queryTables.test.ts @@ -1,10 +1,23 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; -import { createSTable, createSTableJSON, createTable, expectStableData, insertNTable, insertStable, jsonMeta, tableMeta, tagMeta } from "../utils"; +import { compareUint8Arrays, createSTable, createSTableJSON, createTable, expectStableData, hexToBytes, insertNTable, insertStable, jsonMeta, tableMeta, tagMeta } from "../utils"; // const DSN = 'ws://root:taosdata@127.0.0.1:6041' let dsn = 'ws://root:taosdata@192.168.1.95:6041'; let conf :WSConfig = new WSConfig(dsn) +const resultMap:Map = new Map(); +resultMap.set("POINT (4.0 8.0)", hexToBytes("010100000000000000000010400000000000002040")); +resultMap.set("POINT (3.0 5.0)", hexToBytes("010100000000000000000008400000000000001440")); +resultMap.set("LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)", + hexToBytes("010200000003000000000000000000f03f000000000000f03f0000000000000040000000000000004000000000000014400000000000001440")); +resultMap.set("POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))", + hexToBytes("010300000001000000050000000000000000000840000000000000184000000000000014400000000000001840000000000000144000000000000020400000000000000840000000000000204000000000000008400000000000001840")); +resultMap.set("POINT (7.0 9.0)", hexToBytes("01010000000000000000001c400000000000002240")); +resultMap.set("0x7661726332", hexToBytes("307837363631373236333332")); +resultMap.set("0x7661726333", hexToBytes("307837363631373236333333")); +resultMap.set("0x7661726334", hexToBytes("307837363631373236333334")); +resultMap.set("0x7661726335", hexToBytes("307837363631373236333335")); + const table = 'ws_q_n'; const stable = 'ws_q_s'; const tableCN = 'ws_q_n_cn'; @@ -85,7 +98,13 @@ describe('ws.query(stable)', () => { actualData[i].forEach((d, index) => { // // console.log(i, index, d, expectData[i][index]) if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { - expect(d).toBeTruthy() + let buffer:ArrayBuffer = resultMap.get(expectData[i][index]) + if (buffer) { + let dbData :ArrayBuffer = d + console.log(i, index, dbData, expectData[i][index], buffer, compareUint8Arrays(new Uint8Array(dbData), new Uint8Array(buffer))) + expect(compareUint8Arrays(new Uint8Array(dbData), new Uint8Array(buffer))).toBe(true) + } + } else { expect(d).toBe(expectData[i][index]) } @@ -124,8 +143,13 @@ describe('ws.query(stable)', () => { for (let i = 0; i < actualData.length; i++) { actualData[i].forEach((d, index) => { if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') { - expect(d).toBeTruthy() - + let buffer:ArrayBuffer = resultMap.get(expectData[i][index]) + if (buffer) { + let dbData :ArrayBuffer = d + console.log(i, index, dbData, expectData[i][index], buffer, compareUint8Arrays(new Uint8Array(dbData), new Uint8Array(buffer))) + expect(compareUint8Arrays(new Uint8Array(dbData), new Uint8Array(buffer))).toBe(true) + } + } else { expect(d).toBe(expectData[i][index]) } @@ -295,4 +319,6 @@ describe('ws.query(jsonTable)', () => { }) + + //--detectOpenHandles --maxConcurrency=1 --forceExit \ No newline at end of file diff --git a/nodejs/test/utils.ts b/nodejs/test/utils.ts index 3b0dc89..a19fa67 100644 --- a/nodejs/test/utils.ts +++ b/nodejs/test/utils.ts @@ -274,14 +274,14 @@ export function expectStableData(rows: Array>, tags: Array): Arr return resArr; } -function hexToBytes(hex: string): ArrayBuffer { +export function hexToBytes(hex: string): ArrayBuffer { let byteLen = hex.length / 2; - let a = new Uint16Array(byteLen) + let a = new Uint8Array(byteLen) for (let i = 0, count = 0; i < hex.length; i += 2, count++) { let item = parseInt(hex.slice(i, i+2), 16); a[count] = item - console.log(item, a[count]) } + console.log(hex, "===>", a.buffer) return a.buffer } @@ -305,11 +305,14 @@ export function createStmtData(varbinary:string = "ab", } export function compareUint8Arrays(arr1: Uint8Array, arr2: Uint8Array): boolean { + console.log(arr1,"!==", arr2) if (arr1.length !== arr2.length) { + console.log(arr1.length,"!==", arr2.length) return false; } for (let i = 0; i < arr1.length; i++) { - if (arr1[i] !== arr2[i]) { + if (arr1[i] !== arr2[i]) { + console.log(arr1[i],"!==", arr2[i]) return false; } } From 7eb700356c86c3b7863e8637b64205228174d836 Mon Sep 17 00:00:00 2001 From: menshibin Date: Mon, 15 Apr 2024 13:35:43 +0800 Subject: [PATCH 04/17] add workflows --- .github/workflows/release.yaml | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/release.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..d9248e0 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,68 @@ +# Triggered by pull request or push to develop branch +# Test TypeScript rest connector. +name: nodejs Release + +on: + push: + branches: ['main'] + pull_request: + branches: ['main'] + +jobs: + build: + + runs-on: ubuntu-20.04 + + strategy: + matrix: + node-version: [12.x,16.x] + steps: + + - name: Build Tools + run: | + sudo apt-get update + sudo apt-get install -y build-essential cmake + sudo apt-get install -y python3 python3-pip python-is-python3 + + - name: Checkout TDengine + uses: actions/checkout@v3 + with: + fetch-depth: 1 + repository: 'taosdata/TDengine' + path: 'TDengine' + ref: '3.0' + submodules: 'recursive' + + - name: Build TDengine + run: | + cd TDengine + mkdir debug + cd debug + cmake .. -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_HTTP=false + make -j + sudo make install + + - name: start taosd + run: | + nohup sudo taosd & + + - name: start taosadapter + run: | + nohup sudo taosadapter & + + - uses: actions/checkout@v3 + with: + path : "node-taos" + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: test typescript-rest + working-directory: node-taos/typescript-rest + run: | + ls -al + npm install + npm run example + npm run test From 12b61416c2b48c67598e58d2db46071d329ff5f0 Mon Sep 17 00:00:00 2001 From: menshibin Date: Mon, 15 Apr 2024 13:47:14 +0800 Subject: [PATCH 05/17] modify workflows --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d9248e0..e198198 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -59,8 +59,8 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: test typescript-rest - working-directory: node-taos/typescript-rest + - name: test nodejs websocket + working-directory: nodejs run: | ls -al npm install From 1191d209aaa681b491382bec41bae6f29c9a2236 Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 17:45:27 +0800 Subject: [PATCH 06/17] modify workflows --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e198198..371a3d6 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -60,7 +60,7 @@ jobs: node-version: ${{ matrix.node-version }} - name: test nodejs websocket - working-directory: nodejs + working-directory: node-taos/nodejs run: | ls -al npm install From 0c307002dbfaad6ef83ee7e60083270aa7af5948 Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 18:09:30 +0800 Subject: [PATCH 07/17] modify workflows --- .github/workflows/release.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 371a3d6..d13e62f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,8 +51,6 @@ jobs: nohup sudo taosadapter & - uses: actions/checkout@v3 - with: - path : "node-taos" - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 @@ -60,7 +58,7 @@ jobs: node-version: ${{ matrix.node-version }} - name: test nodejs websocket - working-directory: node-taos/nodejs + working-directory: nodejs run: | ls -al npm install From 3f392b4d93234d86053442ab6f63778a5c0682e6 Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 18:14:34 +0800 Subject: [PATCH 08/17] modify workflows --- .github/workflows/release.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d13e62f..929e18f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -33,14 +33,16 @@ jobs: ref: '3.0' submodules: 'recursive' - - name: Build TDengine - run: | + - name: install TDengine + run: | cd TDengine mkdir debug cd debug - cmake .. -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_HTTP=false - make -j + cmake .. -DBUILD_HTTP=false -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_TEST=off + make -j 4 sudo make install + which taosd + which taosadapter - name: start taosd run: | From 1b686999827773fa09c1b5d547617bc04adc774e Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 18:18:21 +0800 Subject: [PATCH 09/17] modify workflows --- .github/workflows/release.yaml | 68 ---------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 .github/workflows/release.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index 929e18f..0000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Triggered by pull request or push to develop branch -# Test TypeScript rest connector. -name: nodejs Release - -on: - push: - branches: ['main'] - pull_request: - branches: ['main'] - -jobs: - build: - - runs-on: ubuntu-20.04 - - strategy: - matrix: - node-version: [12.x,16.x] - steps: - - - name: Build Tools - run: | - sudo apt-get update - sudo apt-get install -y build-essential cmake - sudo apt-get install -y python3 python3-pip python-is-python3 - - - name: Checkout TDengine - uses: actions/checkout@v3 - with: - fetch-depth: 1 - repository: 'taosdata/TDengine' - path: 'TDengine' - ref: '3.0' - submodules: 'recursive' - - - name: install TDengine - run: | - cd TDengine - mkdir debug - cd debug - cmake .. -DBUILD_HTTP=false -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_TEST=off - make -j 4 - sudo make install - which taosd - which taosadapter - - - name: start taosd - run: | - nohup sudo taosd & - - - name: start taosadapter - run: | - nohup sudo taosadapter & - - - uses: actions/checkout@v3 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: test nodejs websocket - working-directory: nodejs - run: | - ls -al - npm install - npm run example - npm run test From 56caee3fc7b2e86d3fed9508a01b8f715359778a Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 18:18:46 +0800 Subject: [PATCH 10/17] modify workflows --- .github/workflows/push.yaml | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/push.yaml diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 0000000..929e18f --- /dev/null +++ b/.github/workflows/push.yaml @@ -0,0 +1,68 @@ +# Triggered by pull request or push to develop branch +# Test TypeScript rest connector. +name: nodejs Release + +on: + push: + branches: ['main'] + pull_request: + branches: ['main'] + +jobs: + build: + + runs-on: ubuntu-20.04 + + strategy: + matrix: + node-version: [12.x,16.x] + steps: + + - name: Build Tools + run: | + sudo apt-get update + sudo apt-get install -y build-essential cmake + sudo apt-get install -y python3 python3-pip python-is-python3 + + - name: Checkout TDengine + uses: actions/checkout@v3 + with: + fetch-depth: 1 + repository: 'taosdata/TDengine' + path: 'TDengine' + ref: '3.0' + submodules: 'recursive' + + - name: install TDengine + run: | + cd TDengine + mkdir debug + cd debug + cmake .. -DBUILD_HTTP=false -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_TEST=off + make -j 4 + sudo make install + which taosd + which taosadapter + + - name: start taosd + run: | + nohup sudo taosd & + + - name: start taosadapter + run: | + nohup sudo taosadapter & + + - uses: actions/checkout@v3 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: test nodejs websocket + working-directory: nodejs + run: | + ls -al + npm install + npm run example + npm run test From 7a189c1fc11cd647f832ac37964f8360d2e6cf03 Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 18:22:02 +0800 Subject: [PATCH 11/17] modify workflows --- .github/workflows/push.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 929e18f..fbd5ae6 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -33,16 +33,16 @@ jobs: ref: '3.0' submodules: 'recursive' - - name: install TDengine - run: | - cd TDengine - mkdir debug - cd debug - cmake .. -DBUILD_HTTP=false -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_TEST=off - make -j 4 - sudo make install - which taosd - which taosadapter + - name: install TDengine + run: | + cd TDengine + mkdir debug + cd debug + cmake .. -DBUILD_HTTP=false -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_TEST=off + make -j 4 + sudo make install + which taosd + which taosadapter - name: start taosd run: | From ae343e4a2fed84545a53da5c54f4a086bf811bd2 Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 18:57:00 +0800 Subject: [PATCH 12/17] modify workflows --- nodejs/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nodejs/package.json b/nodejs/package.json index 0602650..6457db1 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -40,6 +40,7 @@ "uuid": "^9.0.1", "websocket": "^1.0.34", "winston": "^3.13.0", + "async-mutex": "^0.5.0", "winston-daily-rotate-file": "^5.0.0" }, "devDependencies": { @@ -49,6 +50,7 @@ "@types/json-bigint": "^1.0.1", "@types/node": "^18.0.0", "@types/websocket": "^1.0", + "@types/uuid": "^9.0.8", "jest": "^29.2.2", "parcel": "^2.7.0", "ts-jest": "^29.0.3", From 7bb9e209561314aede60722a671e55f744a0760c Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 19:51:02 +0800 Subject: [PATCH 13/17] modify workflows --- .github/workflows/push.yaml | 2 +- .gitignore | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index fbd5ae6..5913284 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [12.x,16.x] + node-version: [14.x,16.x] steps: - name: Build Tools diff --git a/.gitignore b/.gitignore index d7a452b..4ddf54b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,6 @@ nodejs/*.log node_modules/ npminstall-debug.log .vscode/ +package-lock.json +nodejs/package-lock.json From 2f1697cb27c4a9b768fe7586d148cbcece97dd4a Mon Sep 17 00:00:00 2001 From: menshibin Date: Tue, 16 Apr 2024 20:33:46 +0800 Subject: [PATCH 14/17] modify test case ip --- README.md | 14 +++++----- nodejs/example/basicSchemaless.ts | 2 +- nodejs/example/basicSql.ts | 2 +- nodejs/example/basicStmt.ts | 4 +-- nodejs/example/basicTmq.ts | 4 +-- nodejs/test/bulkPulling/queryTables.test.ts | 2 +- nodejs/test/bulkPulling/schemaless.test.ts | 12 ++++---- nodejs/test/bulkPulling/sql.test.ts | 18 ++++++------ nodejs/test/bulkPulling/stmt.func.test.ts | 28 +++++++++---------- nodejs/test/bulkPulling/stmt.type.test.ts | 10 +++---- nodejs/test/bulkPulling/tmq.test.ts | 11 ++------ nodejs/test/bulkPulling/wsConnectPool.test.ts | 8 +++--- 12 files changed, 55 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 369a3cd..07cac95 100644 --- a/README.md +++ b/README.md @@ -233,7 +233,7 @@ A complete DSN string example: ```TypeScript import { WSConfig } from '../src/common/config'; import { sqlConnect } from '../index' -let dsn = 'ws://root:taosdata@127.0.0.1:6041/ws'; +let dsn = 'ws://root:taosdata@127.0.0.1:6041'; (async () => { let wsSql = null; try { @@ -360,7 +360,7 @@ let multi = [ let connector = null; try { await Prepare(); - let dsn = 'ws://root:taosdata@127.0.0.1:6041/ws'; + let dsn = 'ws://root:taosdata@127.0.0.1:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) connector = await sqlConnect(wsConf); @@ -404,7 +404,7 @@ import { Precision, SchemalessProto } from '../src/sql/wsProto'; import { sqlConnect } from '../index'; let db = 'power' -let dsn = 'ws://root:taosdata@127.0.0.1:6041/ws'; +let dsn = 'ws://root:taosdata@127.0.0.1:6041'; let influxdbData = "st,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000"; let telnetData = "stb0_0 1626006833 4 host=host0 interface=eth0"; let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}"; @@ -444,7 +444,7 @@ create subscriptions ```TypeScript let createTopic = `create topic if not exists pwer_meters_topic as select * from power.meters` - let dsn = 'ws://root:taosdata@127.0.0.1:6041/ws'; + let dsn = 'ws://root:taosdata@127.0.0.1:6041'; let conf :WSConfig = new WSConfig(dsn) let ws = await sqlConnect(conf); await ws.Exec(createTopic); @@ -466,7 +466,7 @@ Create Consumer and Subscribe topic [TMQConstants.CONNECT_PASS, "taosdata"], [TMQConstants.AUTO_OFFSET_RESET, "earliest"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://127.0.0.1:6041/rest/tmq'], + [TMQConstants.WS_URL, 'ws://127.0.0.1:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); @@ -495,13 +495,13 @@ let configMap = new Map([ [TMQConstants.CONNECT_PASS, "taosdata"], [TMQConstants.AUTO_OFFSET_RESET, "earliest"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://127.0.0.1:6041/rest/tmq'], + [TMQConstants.WS_URL, 'ws://127.0.0.1:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); async function Prepare() { - let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) const createDB = `create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;` const createStable = `CREATE STABLE if not exists ${db}.${stable} (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);` diff --git a/nodejs/example/basicSchemaless.ts b/nodejs/example/basicSchemaless.ts index 0e209a0..7a7223f 100644 --- a/nodejs/example/basicSchemaless.ts +++ b/nodejs/example/basicSchemaless.ts @@ -1,7 +1,7 @@ import { WSConfig } from '../src/common/config'; import { Precision, SchemalessProto } from '../src/sql/wsProto'; import { sqlConnect } from '../index'; -let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; +let dsn = 'ws://root:taosdata@localhost:6041'; let db = 'power' let influxdbData = "meters,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000"; let telnetData = "stb0_0 1626006833 4 host=host0 interface=eth0"; diff --git a/nodejs/example/basicSql.ts b/nodejs/example/basicSql.ts index b29ceef..70412b2 100644 --- a/nodejs/example/basicSql.ts +++ b/nodejs/example/basicSql.ts @@ -1,7 +1,7 @@ import { WSConfig } from '../src/common/config'; import { sqlConnect } from '../index' -let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; +let dsn = 'ws://root:taosdata@localhost:6041'; (async () => { let wsSql = null; let wsRows = null; diff --git a/nodejs/example/basicStmt.ts b/nodejs/example/basicStmt.ts index f6ac35d..bf46a34 100644 --- a/nodejs/example/basicStmt.ts +++ b/nodejs/example/basicStmt.ts @@ -13,7 +13,7 @@ let multi = [ ]; async function Prepare() { - let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await sqlConnect(conf) await wsSql.Exec(`create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;`) @@ -26,7 +26,7 @@ async function Prepare() { let connector = null; try { await Prepare(); - let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) connector = await sqlConnect(wsConf); diff --git a/nodejs/example/basicTmq.ts b/nodejs/example/basicTmq.ts index 4699976..1567c59 100644 --- a/nodejs/example/basicTmq.ts +++ b/nodejs/example/basicTmq.ts @@ -13,13 +13,13 @@ let configMap = new Map([ [TMQConstants.CONNECT_PASS, "taosdata"], [TMQConstants.AUTO_OFFSET_RESET, "earliest"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://192.168.1.95:6051/rest/tmq'], + [TMQConstants.WS_URL, 'ws://localhost:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); async function Prepare() { - let dsn = 'ws://root:taosdata@192.168.1.95:6051/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) const createDB = `create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;` const createStable = `CREATE STABLE if not exists ${db}.${stable} (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);` diff --git a/nodejs/test/bulkPulling/queryTables.test.ts b/nodejs/test/bulkPulling/queryTables.test.ts index 856fee8..824a36d 100644 --- a/nodejs/test/bulkPulling/queryTables.test.ts +++ b/nodejs/test/bulkPulling/queryTables.test.ts @@ -3,7 +3,7 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; import { compareUint8Arrays, createSTable, createSTableJSON, createTable, expectStableData, hexToBytes, insertNTable, insertStable, jsonMeta, tableMeta, tagMeta } from "../utils"; // const DSN = 'ws://root:taosdata@127.0.0.1:6041' -let dsn = 'ws://root:taosdata@192.168.1.95:6041'; +let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) const resultMap:Map = new Map(); resultMap.set("POINT (4.0 8.0)", hexToBytes("010100000000000000000010400000000000002040")); diff --git a/nodejs/test/bulkPulling/schemaless.test.ts b/nodejs/test/bulkPulling/schemaless.test.ts index e96bd7a..50909e5 100644 --- a/nodejs/test/bulkPulling/schemaless.test.ts +++ b/nodejs/test/bulkPulling/schemaless.test.ts @@ -6,7 +6,7 @@ import { WsSql } from "../../src/sql/wsSql"; beforeAll(async () => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -25,7 +25,7 @@ describe('TDWebSocket.WsSchemaless()', () => { let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}" test('normal connect', async() => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -39,7 +39,7 @@ describe('TDWebSocket.WsSchemaless()', () => { expect.assertions(1) let wsSchemaless = null; try { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -56,7 +56,7 @@ describe('TDWebSocket.WsSchemaless()', () => { }) test('normal insert', async() => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -70,7 +70,7 @@ describe('TDWebSocket.WsSchemaless()', () => { }); test('normal wsSql insert', async() => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -86,7 +86,7 @@ describe('TDWebSocket.WsSchemaless()', () => { }); test('SchemalessProto error', async() => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') diff --git a/nodejs/test/bulkPulling/sql.test.ts b/nodejs/test/bulkPulling/sql.test.ts index d0a4dab..136ccbe 100644 --- a/nodejs/test/bulkPulling/sql.test.ts +++ b/nodejs/test/bulkPulling/sql.test.ts @@ -2,7 +2,7 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; beforeAll(async () => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -16,7 +16,7 @@ beforeAll(async () => { describe('TDWebSocket.WsSql()', () => { jest.setTimeout(20 * 1000) test('normal connect', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsSql = null; let conf :WSConfig = new WSConfig(dsn) conf.SetDb('power') @@ -29,7 +29,7 @@ describe('TDWebSocket.WsSql()', () => { expect.assertions(1) let wsSql = null; try { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) conf.SetDb('jest') wsSql = await WsSql.Open(conf) @@ -43,7 +43,7 @@ describe('TDWebSocket.WsSql()', () => { } }) test('get taosc version', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let version = await wsSql.Version() @@ -53,7 +53,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('show databases', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('show databases') @@ -63,7 +63,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('create databases', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;') @@ -73,7 +73,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('create stable', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('use power') @@ -87,7 +87,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('insert recoder', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('use power') @@ -104,7 +104,7 @@ describe('TDWebSocket.WsSql()', () => { }) test('query sql', async()=>{ - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('use power') diff --git a/nodejs/test/bulkPulling/stmt.func.test.ts b/nodejs/test/bulkPulling/stmt.func.test.ts index da79c21..76a86ab 100644 --- a/nodejs/test/bulkPulling/stmt.func.test.ts +++ b/nodejs/test/bulkPulling/stmt.func.test.ts @@ -2,7 +2,7 @@ import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; beforeAll(async () => { - let dns = 'ws://192.168.1.95:6041' + let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -25,7 +25,7 @@ describe('TDWebSocket.Stmt()', () => { [0.32, 0.33, 0.34], ]; test('normal connect', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -40,7 +40,7 @@ describe('TDWebSocket.Stmt()', () => { expect.assertions(1) let connector = null; try { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf :WSConfig = new WSConfig(dsn) wsConf.SetDb('jest') connector = await WsSql.Open(wsConf) @@ -56,7 +56,7 @@ describe('TDWebSocket.Stmt()', () => { }) test('normal Prepare', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -74,7 +74,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('set tag error', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -95,7 +95,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('error Prepare table', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -114,7 +114,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('error Prepare tag', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -133,7 +133,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') // let connector = WsStmtConnect.NewConnector(wsConf) @@ -176,7 +176,7 @@ describe('TDWebSocket.Stmt()', () => { test('error BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -213,7 +213,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('no Batch', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -249,7 +249,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('Batch after BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -297,7 +297,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('no set tag', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -325,7 +325,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal binary BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) @@ -356,7 +356,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal json BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') let connector = await WsSql.Open(wsConf) diff --git a/nodejs/test/bulkPulling/stmt.type.test.ts b/nodejs/test/bulkPulling/stmt.type.test.ts index afeee4c..415a390 100644 --- a/nodejs/test/bulkPulling/stmt.type.test.ts +++ b/nodejs/test/bulkPulling/stmt.type.test.ts @@ -83,7 +83,7 @@ const selectJsonTableCN = `select * from ${jsonTableCN}` beforeAll(async () => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let ws = await WsSql.Open(conf); await ws.Exec(dropDB); @@ -97,7 +97,7 @@ beforeAll(async () => { describe('TDWebSocket.Stmt()', () => { jest.setTimeout(20 * 1000) test('normal BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) @@ -154,7 +154,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal CN BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) @@ -211,7 +211,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal json tag BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) @@ -255,7 +255,7 @@ describe('TDWebSocket.Stmt()', () => { }); test('normal json cn tag BindParam', async() => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) let connector = await WsSql.Open(wsConf) diff --git a/nodejs/test/bulkPulling/tmq.test.ts b/nodejs/test/bulkPulling/tmq.test.ts index a8f89b5..78ed874 100644 --- a/nodejs/test/bulkPulling/tmq.test.ts +++ b/nodejs/test/bulkPulling/tmq.test.ts @@ -14,7 +14,7 @@ let createTopic = `create topic if not exists ${topics[0]} as select * from ${db let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};` // let dropTopic2 = `DROP TOPIC IF EXISTS ${topic2};` beforeAll(async () => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) const createDB = `create database if not exists ${db} keep 3650` const dropDB = `drop database if exists ${db}` @@ -63,15 +63,13 @@ describe('TDWebSocket.Tmq()', () => { [TMQConstants.CONNECT_PASS, "taosdata"], [TMQConstants.AUTO_OFFSET_RESET, "earliest"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://192.168.1.95:6041'], + [TMQConstants.WS_URL, 'ws://localhost:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); test('normal connect', async() => { - // let dsn = 'ws://root:taosdata@192.168.1.95:6041'; - // configMap.set(TMQConstants.WS_URL, dsn) let consumer = await WsConsumer.NewConsumer(configMap); consumer.Close(); }); @@ -85,7 +83,7 @@ describe('TDWebSocket.Tmq()', () => { [TMQConstants.CONNECT_PASS, "test"], [TMQConstants.AUTO_OFFSET_RESET, "earliest1"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://192.168.1.95:6041'], + [TMQConstants.WS_URL, 'ws://localhost:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); @@ -102,9 +100,6 @@ describe('TDWebSocket.Tmq()', () => { }) test('normal Subscribe', async() => { - - // let dsn = 'ws://root:taosdata@192.168.1.95:6041'; - // configMap.set(TMQConstants.WS_URL, dsn) let consumer = await WsConsumer.NewConsumer(configMap); await consumer.Subscribe(topics); diff --git a/nodejs/test/bulkPulling/wsConnectPool.test.ts b/nodejs/test/bulkPulling/wsConnectPool.test.ts index c850706..91b3e44 100644 --- a/nodejs/test/bulkPulling/wsConnectPool.test.ts +++ b/nodejs/test/bulkPulling/wsConnectPool.test.ts @@ -20,7 +20,7 @@ let configMap = new Map([ [TMQConstants.CONNECT_PASS, "taosdata"], [TMQConstants.AUTO_OFFSET_RESET, "earliest"], [TMQConstants.CLIENT_ID, 'test_tmq_client'], - [TMQConstants.WS_URL, 'ws://192.168.1.95:6041/rest/tmq'], + [TMQConstants.WS_URL, 'ws://localhost:6041'], [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); @@ -31,7 +31,7 @@ let createTopic = `create topic if not exists ${topics[0]} as select * from ${db let stmtIds:number[] = [] async function connect() { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsSql = null; let conf :WSConfig = new WSConfig(dsn) conf.SetDb('power') @@ -42,7 +42,7 @@ async function connect() { } async function stmtConnect() { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb('power') // let connector = WsStmtConnect.NewConnector(wsConf) @@ -106,7 +106,7 @@ async function tmqConnect() { } beforeAll(async () => { - let dsn = 'ws://root:taosdata@192.168.1.95:6041/ws'; + let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) let ws = await WsSql.Open(conf); await ws.Exec(createTopic, ReqId.getReqID()); From 3d5785671433026526016e265d81ee699832c0ad Mon Sep 17 00:00:00 2001 From: menshibin Date: Thu, 18 Apr 2024 09:24:59 +0800 Subject: [PATCH 15/17] modify async function call --- nodejs/example/basicSchemaless.ts | 34 +- nodejs/example/basicSql.ts | 9 +- nodejs/example/basicStmt.ts | 14 +- nodejs/example/basicTmq.ts | 10 +- nodejs/index.ts | 14 +- nodejs/package.json | 6 +- nodejs/src/client/wsClient.ts | 129 ++--- nodejs/src/client/wsConnector.ts | 15 +- nodejs/src/client/wsConnectorPool.ts | 21 +- nodejs/src/common/log.ts | 10 +- nodejs/src/sql/wsRows.ts | 4 +- nodejs/src/sql/wsSql.ts | 89 ++-- nodejs/src/stmt/wsStmt.ts | 106 ++-- nodejs/src/tmq/wsTmq.ts | 471 +++++++----------- nodejs/test/bulkPulling/queryTables.test.ts | 18 +- nodejs/test/bulkPulling/schemaless.test.ts | 27 +- nodejs/test/bulkPulling/sql.test.ts | 24 +- nodejs/test/bulkPulling/stmt.func.test.ts | 60 ++- nodejs/test/bulkPulling/stmt.type.test.ts | 15 +- nodejs/test/bulkPulling/tmq.test.ts | 15 +- nodejs/test/bulkPulling/wsConnectPool.test.ts | 6 +- 21 files changed, 497 insertions(+), 600 deletions(-) diff --git a/nodejs/example/basicSchemaless.ts b/nodejs/example/basicSchemaless.ts index 7a7223f..276bc7c 100644 --- a/nodejs/example/basicSchemaless.ts +++ b/nodejs/example/basicSchemaless.ts @@ -1,35 +1,47 @@ import { WSConfig } from '../src/common/config'; import { Precision, SchemalessProto } from '../src/sql/wsProto'; -import { sqlConnect } from '../index'; +import { sqlConnect, connectorDestroy, setLogLevel } from '../index'; let dsn = 'ws://root:taosdata@localhost:6041'; let db = 'power' -let influxdbData = "meters,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000"; -let telnetData = "stb0_0 1626006833 4 host=host0 interface=eth0"; -let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}"; -// const dropDB = `drop database if exists ${db}` +let influxdbData = "st,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000" +let telnetData = "stb0_0 1626006833 4 host=host0 interface=eth0" +let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}" +const dropDB = `drop database if exists ${db}` +setLogLevel("debug") async function Prepare() { let conf :WSConfig = new WSConfig(dsn) + conf.SetUser('root') + conf.SetPwd('taosdata') let wsSql = await sqlConnect(conf) - await wsSql.Exec(`create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;`) - wsSql.Close() + const topics:string[] = ['pwer_meters_topic'] + let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};` + await wsSql.Exec(dropTopic); + await wsSql.Exec(dropDB); + + await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); + await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); + wsSql.Close(); } (async () => { let wsSchemaless = null try { - await Prepare() - let conf = new WSConfig(dsn); - conf.SetDb(db) + let conf :WSConfig = new WSConfig(dsn) + conf.SetUser('root') + conf.SetPwd('taosdata') + conf.SetDb('power') wsSchemaless = await sqlConnect(conf) await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NANO_SECONDS, 0); await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); + wsSchemaless.Close(); } catch (e) { console.error(e); }finally { if (wsSchemaless) { - wsSchemaless.Close(); + await wsSchemaless.Close(); } + connectorDestroy() } })(); diff --git a/nodejs/example/basicSql.ts b/nodejs/example/basicSql.ts index 70412b2..685af75 100644 --- a/nodejs/example/basicSql.ts +++ b/nodejs/example/basicSql.ts @@ -1,5 +1,5 @@ import { WSConfig } from '../src/common/config'; -import { sqlConnect } from '../index' +import { sqlConnect, connectorDestroy } from '../index' let dsn = 'ws://root:taosdata@localhost:6041'; (async () => { @@ -36,7 +36,7 @@ let dsn = 'ws://root:taosdata@localhost:6041'; console.log("wsRow:meta:=>", meta); while (await wsRows.Next()) { - let result = await wsRows.GetData(); + let result = wsRows.GetData(); console.log('queryRes.Scan().then=>', result); } wsRows.Close() @@ -47,11 +47,12 @@ let dsn = 'ws://root:taosdata@localhost:6041'; } finally { if (wsRows) { - wsRows.Close(); + await wsRows.Close(); } if (wsSql) { - wsSql.Close(); + await wsSql.Close(); } + connectorDestroy() console.log("finish!") } })(); diff --git a/nodejs/example/basicStmt.ts b/nodejs/example/basicStmt.ts index bf46a34..54e9019 100644 --- a/nodejs/example/basicStmt.ts +++ b/nodejs/example/basicStmt.ts @@ -1,6 +1,6 @@ require('qingwa')(); import { WSConfig } from '../src/common/config'; -import { sqlConnect } from '../index'; +import { connectorDestroy, sqlConnect } from '../index'; let db = 'power' let stable = 'meters' @@ -11,9 +11,9 @@ let multi = [ [292, 293, 294], [0.32, 0.33, 0.34], ]; - +let dsn = 'ws://root:taosdata@localhost:6041'; async function Prepare() { - let dsn = 'ws://root:taosdata@localhost:6041'; + let conf :WSConfig = new WSConfig(dsn) let wsSql = await sqlConnect(conf) await wsSql.Exec(`create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;`) @@ -26,12 +26,11 @@ async function Prepare() { let connector = null; try { await Prepare(); - let dsn = 'ws://root:taosdata@localhost:6041'; let wsConf = new WSConfig(dsn); wsConf.SetDb(db) connector = await sqlConnect(wsConf); stmt = await connector.StmtInit() - await stmt.Prepare(`INSERT INTO ? USING ${db}.${stable} TAGS (?, ?) VALUES (?, ?, ?, ?)`); + await stmt.Prepare(`INSERT INTO ? USING ${db}.${stable} (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)`); await stmt.SetTableName('d1001'); let tagParams = stmt.NewStmtParam() @@ -51,10 +50,11 @@ async function Prepare() { console.error(e); }finally { if (stmt) { - stmt.Close(); + await stmt.Close(); } if (connector) { - connector.Close(); + await connector.Close(); } + connectorDestroy() } })(); diff --git a/nodejs/example/basicTmq.ts b/nodejs/example/basicTmq.ts index 1567c59..ffad9de 100644 --- a/nodejs/example/basicTmq.ts +++ b/nodejs/example/basicTmq.ts @@ -1,6 +1,6 @@ import { WSConfig } from "../src/common/config"; import { TMQConstants } from "../src/tmq/constant"; -import { sqlConnect, tmqConnect } from "../index"; +import { connectorDestroy, sqlConnect, tmqConnect } from "../index"; const stable = 'meters'; @@ -17,9 +17,8 @@ let configMap = new Map([ [TMQConstants.ENABLE_AUTO_COMMIT, 'true'], [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); - +let dsn = 'ws://root:taosdata@localhost:6041'; async function Prepare() { - let dsn = 'ws://root:taosdata@localhost:6041'; let conf :WSConfig = new WSConfig(dsn) const createDB = `create database if not exists ${db} KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;` const createStable = `CREATE STABLE if not exists ${db}.${stable} (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);` @@ -32,7 +31,7 @@ async function Prepare() { await ws.Exec(createStable); await ws.Exec(createTopic); for (let i = 0; i < 10; i++) { - await ws.Exec(`INSERT INTO d1001 USING ${stable} TAGS ("California.SanFrancisco", 3) VALUES (NOW, ${10+i}, ${200+i}, ${0.32 + i})`) + await ws.Exec(`INSERT INTO d1001 USING ${stable} (location, groupId) TAGS ("California.SanFrancisco", 3) VALUES (NOW, ${10+i}, ${200+i}, ${0.32 + i})`) } ws.Close() } @@ -63,8 +62,9 @@ async function Prepare() { console.error(e); } finally { if (consumer) { - consumer.Close(); + await consumer.Close(); } + connectorDestroy() } })(); diff --git a/nodejs/index.ts b/nodejs/index.ts index ff989b1..01f0905 100644 --- a/nodejs/index.ts +++ b/nodejs/index.ts @@ -3,14 +3,10 @@ import { WSConfig } from './src/common/config'; import { WsConsumer } from './src/tmq/wsTmq'; import logger from "./src/common/log" import winston from 'winston'; +import { WebSocketConnectionPool } from './src/client/wsConnectorPool'; let sqlConnect = async (conf: WSConfig) => { - try { - return await WsSql.Open(conf) - } catch (err: any) { - console.error(err); - throw err; - } + return await WsSql.Open(conf); }; let tmqConnect = async (configMap: Map) => { @@ -28,4 +24,8 @@ let setLogLevel = (level: string) => { logger.transports.push(new winston.transports.Console()) } }; -export { sqlConnect, tmqConnect, setLogLevel }; \ No newline at end of file + +let connectorDestroy = () => { + WebSocketConnectionPool.Instance().Destroyed() +}; +export { sqlConnect, tmqConnect, setLogLevel, connectorDestroy }; \ No newline at end of file diff --git a/nodejs/package.json b/nodejs/package.json index 6457db1..101a211 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -41,7 +41,8 @@ "websocket": "^1.0.34", "winston": "^3.13.0", "async-mutex": "^0.5.0", - "winston-daily-rotate-file": "^5.0.0" + "winston-daily-rotate-file": "^5.0.0", + "moment-timezone": "^0.5.45" }, "devDependencies": { "@parcel/packager-ts": "^2.7.0", @@ -58,6 +59,7 @@ "async-mutex": "^0.5.0", "uuid": "^9.0.1", "winston": "^3.13.0", - "winston-daily-rotate-file": "^5.0.0" + "winston-daily-rotate-file": "^5.0.0", + "moment-timezone": "^0.5.45" } } diff --git a/nodejs/src/client/wsClient.ts b/nodejs/src/client/wsClient.ts index 22ecdcb..e5d30ea 100644 --- a/nodejs/src/client/wsClient.ts +++ b/nodejs/src/client/wsClient.ts @@ -25,7 +25,7 @@ export class WsClient { } - connect(database?: string | undefined | null): Promise { + async connect(database?: string | undefined | null): Promise { let _db = this._url.pathname.split('/')[3]; if (database) { _db = database; @@ -40,45 +40,32 @@ export class WsClient { db: _db, }, }; - - return new Promise(async (resolve, reject) => { - try { - this._wsConnector = await WebSocketConnectionPool.Instance().getConnection(this._url, this._timeout); - if (this._wsConnector.readyState() > 0) { - resolve() - } else { - await this._wsConnector.Ready(); - let result:any = await this._wsConnector.sendMsg(JSON.stringify(connMsg)) - if (result.msg.code == 0) { - resolve(); - }else { - reject(new WebSocketQueryError(result.msg.code, result.msg.message)); - } - } + + this._wsConnector = await WebSocketConnectionPool.Instance().getConnection(this._url, this._timeout); + if (this._wsConnector.readyState() > 0) { + return; + } + await this._wsConnector.Ready(); + let result:any = await this._wsConnector.sendMsg(JSON.stringify(connMsg)) + if (result.msg.code == 0) { + return; + } - } catch(e:any) { - reject(e) - } - - }); + throw(new WebSocketQueryError(result.msg.code, result.msg.message)); + } - execNoResp(queryMsg: string): Promise { - return new Promise((resolve, reject) => { - logger.debug('[wsQueryInterface.query.queryMsg]===>' + queryMsg); - if (this._wsConnector && this._wsConnector.readyState() > 0) { - this._wsConnector.sendMsgNoResp(queryMsg) - .then(() => {resolve();}) - .catch((e) => reject(e)); - }else{ - reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")) - } - - }); + async execNoResp(queryMsg: string): Promise { + logger.debug('[wsQueryInterface.query.queryMsg]===>' + queryMsg); + if (this._wsConnector && this._wsConnector.readyState() > 0) { + await this._wsConnector.sendMsgNoResp(queryMsg) + return; + } + throw(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")) } // need to construct Response. - exec(queryMsg: string, bSqlQuery:boolean = true): Promise { + async exec(queryMsg: string, bSqlQuery:boolean = true): Promise { return new Promise((resolve, reject) => { // console.log('[wsQueryInterface.query.queryMsg]===>' + queryMsg); if (this._wsConnector && this._wsConnector.readyState() > 0) { @@ -96,13 +83,12 @@ export class WsClient { } else { reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")) } - }); } // need to construct Response. - sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, bSqlQuery:boolean = true): Promise { + async sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, bSqlQuery:boolean = true): Promise { return new Promise((resolve, reject) => { if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendBinaryMsg(reqId, action, message).then((e: any) => { @@ -132,22 +118,16 @@ export class WsClient { } - Ready(): Promise { - return new Promise(async (resolve, reject) => { - try { - this._wsConnector = await WebSocketConnectionPool.Instance().getConnection(this._url, this._timeout); - if (this._wsConnector.readyState() <= 0) { - await this._wsConnector.Ready() - } - logger.debug("ready status ", this._url, this._wsConnector.readyState()) - resolve() - }catch(e: any) { - reject(e) - } - }); + async Ready(): Promise { + this._wsConnector = await WebSocketConnectionPool.Instance().getConnection(this._url, this._timeout); + if (this._wsConnector.readyState() <= 0) { + await this._wsConnector.Ready() + } + logger.debug("ready status ", this._url, this._wsConnector.readyState()) + return; } - fetch(res: WSQueryResponse): Promise { + async fetch(res: WSQueryResponse): Promise { let fetchMsg = { action: 'fetch', args: { @@ -155,11 +135,9 @@ export class WsClient { id: res.id, }, }; - // console.log("[wsQueryInterface.fetch()]===>wsQueryResponse\n") - // console.log(res) return new Promise((resolve, reject) => { - let jsonStr = JSONBig.stringify(fetchMsg); - logger.debug('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + let jsonStr = JSONBig.stringify(fetchMsg); + logger.debug('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); if (this._wsConnector && this._wsConnector.readyState() > 0) { this._wsConnector.sendMsg(jsonStr).then((e: any) => { if (e.msg.code == 0) { @@ -175,7 +153,7 @@ export class WsClient { }); } - fetchBlock(fetchResponse: WSFetchResponse, taosResult: TaosResult): Promise { + async fetchBlock(fetchResponse: WSFetchResponse, taosResult: TaosResult): Promise { let fetchBlockMsg = { action: 'fetch_block', args: { @@ -191,9 +169,10 @@ export class WsClient { this._wsConnector.sendMsg(jsonStr).then((e: any) => { let resp:MessageResp = e taosResult.AddTotalTime(resp.totalTime) - resolve(parseBlock(fetchResponse.rows, new WSFetchBlockResponse(resp.msg), taosResult)); // if retrieve JSON then reject with message // else is binary , so parse raw block to TaosResult + parseBlock(fetchResponse.rows, new WSFetchBlockResponse(resp.msg), taosResult) + resolve(taosResult); }).catch((e) => reject(e)); } else { reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect")); @@ -201,7 +180,7 @@ export class WsClient { }); } - sendMsg(msg:string): Promise { + async sendMsg(msg:string): Promise { return new Promise((resolve, reject) => { // console.log("[wsQueryInterface.sendMsg]===>" + msg) if (this._wsConnector && this._wsConnector.readyState() > 0) { @@ -214,7 +193,7 @@ export class WsClient { }); } - freeResult(res: WSQueryResponse) { + async freeResult(res: WSQueryResponse) { let freeResultMsg = { action: 'free_result', args: { @@ -235,35 +214,31 @@ export class WsClient { }); } - version(): Promise { + async version(): Promise { let versionMsg = { action: 'version', args: { req_id: ReqId.getReqID() }, }; - return new Promise(async (resolve, reject) => { - if (this._wsConnector) { - try { - if (this._wsConnector.readyState() <= 0) { - await this._wsConnector.Ready() - } - let result:any = await this._wsConnector.sendMsg(JSONBig.stringify(versionMsg)); - if (result.msg.code == 0) { - resolve(new WSVersionResponse(result).version); - } else { - reject(new WebSocketInterfaceError(result.msg.code, result.msg.message)); - } - } catch (e:any) { - reject(e); - } + + if (this._wsConnector) { + if (this._wsConnector.readyState() <= 0) { + await this._wsConnector.Ready(); } - }); + let result:any = await this._wsConnector.sendMsg(JSONBig.stringify(versionMsg)); + if (result.msg.code == 0) { + return new WSVersionResponse(result).version; + } + throw(new WebSocketInterfaceError(result.msg.code, result.msg.message)); + + } + throw(ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"); } - close() { + async close():Promise { if (this._wsConnector) { - WebSocketConnectionPool.Instance().releaseConnection(this._wsConnector) + await WebSocketConnectionPool.Instance().releaseConnection(this._wsConnector) this._wsConnector = undefined // this._wsConnector.close(); } diff --git a/nodejs/src/client/wsConnector.ts b/nodejs/src/client/wsConnector.ts index 8e00a1a..d70c80c 100644 --- a/nodejs/src/client/wsConnector.ts +++ b/nodejs/src/client/wsConnector.ts @@ -31,7 +31,7 @@ export class WebSocketConnector { } } - Ready(): Promise { + async Ready(): Promise { return new Promise((resolve, reject) => { this._wsConn.onopen = () => { logger.debug("websocket connection opened") @@ -40,10 +40,8 @@ export class WebSocketConnector { }) } - private _onclose(e: ICloseEvent) { - return new Promise((resolve, reject) => { - resolve("websocket connection closed") - }) + private async _onclose(e: ICloseEvent) { + logger.info("websocket connection closed") } @@ -76,6 +74,7 @@ export class WebSocketConnector { close() { if (this._wsConn) { this._wsConn.close(); + } else { throw new TDWebSocketClientError(ErrorCode.ERR_WEBSOCKET_CONNECTION, "WebSocket connection is undefined.") } @@ -85,7 +84,7 @@ export class WebSocketConnector { return this._wsConn.readyState; } - sendMsgNoResp(message: string):Promise { + async sendMsgNoResp(message: string):Promise { logger.debug("[wsClient.sendMsgNoResp()]===>" + message) let msg = JSON.parse(message); if (msg.args.id !== undefined) { @@ -104,7 +103,7 @@ export class WebSocketConnector { } - sendMsg(message: string, register: Boolean = true) { + async sendMsg(message: string, register: Boolean = true) { logger.debug("[wsClient.sendMessage()]===>" + message) let msg = JSON.parse(message); if (msg.args.id !== undefined) { @@ -127,7 +126,7 @@ export class WebSocketConnector { }) } - sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, register: Boolean = true) { + async sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer, register: Boolean = true) { return new Promise((resolve, reject) => { if (this._wsConn && this._wsConn.readyState > 0) { if (register) { diff --git a/nodejs/src/client/wsConnectorPool.ts b/nodejs/src/client/wsConnectorPool.ts index e6c4386..4a236ff 100644 --- a/nodejs/src/client/wsConnectorPool.ts +++ b/nodejs/src/client/wsConnectorPool.ts @@ -50,7 +50,7 @@ export class WebSocketConnectionPool { } } - async releaseConnection(connector: WebSocketConnector) { + async releaseConnection(connector: WebSocketConnector):Promise { if (connector) { const unlock = await mutex.acquire(); try { @@ -84,20 +84,21 @@ export class WebSocketConnectionPool { } } } - logger.debug("destroyed connect:" + this._connectionCount) + logger.info("destroyed connect:" + this._connectionCount) this._connectionCount = 0 this.pool = new Map() } } -process.on('beforeExit', (code) => { - logger.info("begin destroy connect") - WebSocketConnectionPool.Instance().Destroyed() -}); +// process.on('beforeExit', (code) => { +// console.log("begin destroy connect") +// WebSocketConnectionPool.Instance().Destroyed() +// process.exit() +// }); process.on('SIGINT', () => { - logger.info('Received SIGINT. Press Control-D to exit, begin destroy connect...'); + console.log('Received SIGINT. Press Control-D to exit, begin destroy connect...'); WebSocketConnectionPool.Instance().Destroyed() process.exit() }); @@ -108,4 +109,10 @@ process.on('SIGTERM', () => { process.exit() }); + +process.on('unhandledRejection', (reason, promise) => { + console.error('未处理的 Promise 拒绝:', promise, '原因:', reason); + // 这里你可以记录日志、抛出错误或执行其他操作 + // 注意:通常不建议在这里简单地抛出错误,因为这可能会中断你的应用程序 +}); // process.kill(process.pid, 'SIGINT'); \ No newline at end of file diff --git a/nodejs/src/common/log.ts b/nodejs/src/common/log.ts index 26498ea..d96d7b3 100644 --- a/nodejs/src/common/log.ts +++ b/nodejs/src/common/log.ts @@ -1,5 +1,11 @@ import winston from 'winston'; import DailyRotateFile from 'winston-daily-rotate-file'; +import moment from 'moment-timezone'; + +const customFormat = winston.format.printf(({ timestamp, level, message, label, ...meta }) => { + const formattedTime = moment(timestamp).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss.SSS'); // 使用上海时区 + return `${formattedTime} [${label}] ${level}: ${message} ${Object.keys(meta).length ? JSON.stringify(meta, null, 2) : ''}`; + }); const transport = new DailyRotateFile({ filename: './logs/app-%DATE%.log', // Here is the file name template @@ -11,9 +17,7 @@ const transport = new DailyRotateFile({ json: false, // Whether to output logs in JSON format format: winston.format.combine( winston.format.timestamp(), - winston.format.printf(({ timestamp, level, message }) => { - return `${timestamp} [${level.toUpperCase()}]: ${message}`; - }), + customFormat ), level: 'info', // set log level }); diff --git a/nodejs/src/sql/wsRows.ts b/nodejs/src/sql/wsRows.ts index a79e883..3f89abe 100644 --- a/nodejs/src/sql/wsRows.ts +++ b/nodejs/src/sql/wsRows.ts @@ -72,12 +72,12 @@ export class WSRows { return undefined; } - Close() { + async Close():Promise { if (this._isClose) { return } this._isClose = true - this._wsClient.freeResult(this._wsQueryResponse) + await this._wsClient.freeResult(this._wsQueryResponse) } } diff --git a/nodejs/src/sql/wsSql.ts b/nodejs/src/sql/wsSql.ts index 23179bc..e7b20e0 100644 --- a/nodejs/src/sql/wsSql.ts +++ b/nodejs/src/sql/wsSql.ts @@ -20,12 +20,20 @@ export class WsSql{ this.wsConfig = wsConfig; } - static Open(wsConfig:WSConfig):Promise { + static async Open(wsConfig:WSConfig):Promise { if (!wsConfig.GetUrl()) { throw new WebSocketInterfaceError(ErrorCode.ERR_INVALID_URL, 'invalid url, password or username needed.'); } let wsSql = new WsSql(wsConfig); - return wsSql.open(wsConfig.GetDb()) + return await wsSql.open(wsConfig.GetDb()) + } + + private async open(database:string | null | undefined):Promise { + await this._wsClient.connect(database); + if(database && database.length > 0) { + await this.Exec(`use ${database}`); + } + return this; } State(){ @@ -35,22 +43,15 @@ export class WsSql{ /** * return client version. */ - Version(): Promise { - return this._wsClient.version() - } - - Query(sql:string, req_id?:number):Promise{ - return this.query(sql, req_id) + async Version(): Promise { + return await this._wsClient.version() } - - Exec(sql:string, req_id?: number):Promise{ - return this.execute(sql, req_id) - } - Close() { - this._wsClient.close(); + + async Close():Promise { + await this._wsClient.close(); } - SchemalessInsert(lines: Array, protocol: SchemalessProto, precision: Precision, ttl: number, reqId?: number): Promise { + async SchemalessInsert(lines: Array, protocol: SchemalessProto, precision: Precision, ttl: number, reqId?: number): Promise { let data = ''; if (!lines || lines.length == 0 || !protocol) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsSchemaless Insert params is error!'); @@ -73,50 +74,27 @@ export class WsSql{ ttl: ttl, }, }; - return this.executeSchemalessInsert(queryMsg); + return await this.executeSchemalessInsert(queryMsg); } - StmtInit(reqId?:number): Promise { - return new Promise(async (resolve, reject) => { - if (this._wsClient) { - try{ - let precision = PrecisionLength["ms"]; - if (this.wsConfig.GetDb()) { - let sql = "select `precision` from information_schema.ins_databases where name = '" + this.wsConfig.GetDb() + "'"; - let result = await this.Exec(sql); - let data =result.GetData() - - if (data && data[0] && data[0][0]) { - precision = PrecisionLength[data[0][0]] - } - } - let wsStmt = await WsStmt.NewStmt(this._wsClient, precision, reqId); - resolve(wsStmt); - } catch(e) { - logger.error(e) - reject(e); + async StmtInit(reqId?:number): Promise { + if (this._wsClient) { + let precision = PrecisionLength["ms"]; + if (this.wsConfig.GetDb()) { + let sql = "select `precision` from information_schema.ins_databases where name = '" + this.wsConfig.GetDb() + "'"; + let result = await this.Exec(sql); + let data =result.GetData() + + if (data && data[0] && data[0][0]) { + precision = PrecisionLength[data[0][0]] } - }else{ - reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed")); } - }); - } - - private open(database:string | null | undefined):Promise { - return new Promise(async (resolve, reject) => { - try { - await this._wsClient.connect(database); - if(database && database.length > 0) { - await this.execute(`use ${database}`) - } - resolve(this) - } catch(e) { - reject(e) - } - }) + return await WsStmt.NewStmt(this._wsClient, precision, reqId); + } + throw(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed")); } - async execute(sql: string, reqId?: number, action:string = 'query'): Promise { + async Exec(sql: string, reqId?: number, action:string = 'query'): Promise { try { let wsQueryResponse:WSQueryResponse = await this._wsClient.exec(this.getSql(sql, reqId, action)); let taosResult = new TaosResult(wsQueryResponse); @@ -149,7 +127,8 @@ export class WsSql{ return new Promise(async (resolve, reject) => { try { let reqMsg = JSON.stringify(queryMsg); - await this._wsClient.exec(reqMsg); + let result = await this._wsClient.exec(reqMsg); + logger.debug("executeSchemalessInsert:", reqMsg, result) resolve(); } catch (e:any) { reject(new TaosResultError(e.code, e.message)); @@ -157,7 +136,7 @@ export class WsSql{ }); } - async query(sql: string, reqId?:number): Promise { + async Query(sql: string, reqId?:number): Promise { try { let wsQueryResponse:WSQueryResponse = await this._wsClient.exec(this.getSql(sql, reqId)); return new WSRows(this._wsClient, wsQueryResponse); diff --git a/nodejs/src/stmt/wsStmt.ts b/nodejs/src/stmt/wsStmt.ts index b7a79b3..7f2839d 100644 --- a/nodejs/src/stmt/wsStmt.ts +++ b/nodejs/src/stmt/wsStmt.ts @@ -18,12 +18,12 @@ export class WsStmt { } } - static NewStmt(wsClient: WsClient, precision?:number, reqId?:number): Promise { + static async NewStmt(wsClient: WsClient, precision?:number, reqId?:number): Promise { let wsStmt = new WsStmt(wsClient, precision) - return wsStmt.init(reqId); + return await wsStmt.init(reqId); } - Prepare(sql: string): Promise { + async Prepare(sql: string): Promise { let queryMsg = { action: 'prepare', args: { @@ -32,10 +32,10 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg); + return await this.execute(queryMsg); } - SetTableName(tableName: string): Promise { + async SetTableName(tableName: string): Promise { let queryMsg = { action: 'set_table_name', args: { @@ -44,10 +44,10 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg); + return await this.execute(queryMsg); } - SetTags(tags: Array): Promise { + async SetTags(tags: Array): Promise { let queryMsg = { action: 'set_tags', args: { @@ -56,14 +56,14 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg); + return await this.execute(queryMsg); } NewStmtParam():StmtBindParams { return new StmtBindParams(this._precision); } - SetBinaryTags(paramsArray:StmtBindParams): Promise { + async SetBinaryTags(paramsArray:StmtBindParams): Promise { if (!paramsArray || !this._stmt_id) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "SetBinaryTags paramArray is invalid!") } @@ -74,10 +74,10 @@ export class WsStmt { } let reqId = BigInt(ReqId.getReqID()) let dataBlock = binaryBlockEncode(paramsArray, StmtBindType.STMT_TYPE_TAG, this._stmt_id, reqId, paramsArray.GetDataRows()) - return this.sendBinaryMsg(reqId, 'set_tags', dataBlock); + return await this.sendBinaryMsg(reqId, 'set_tags', dataBlock); } - BinaryBind(paramsArray:StmtBindParams): Promise { + async BinaryBind(paramsArray:StmtBindParams): Promise { if (!paramsArray || !this._stmt_id) { throw new TaosError(ErrorCode.ERR_INVALID_PARAMS, "BinaryBind paramArray is invalid!") } @@ -88,10 +88,10 @@ export class WsStmt { } let reqId = BigInt(ReqId.getReqID()) let dataBlock = binaryBlockEncode(paramsArray, StmtBindType.STMT_TYPE_BIND, this._stmt_id, reqId, paramsArray.GetDataRows()); - return this.sendBinaryMsg(reqId, 'bind', dataBlock); + return await this.sendBinaryMsg(reqId, 'bind', dataBlock); } - Bind(paramArray: Array>): Promise { + async Bind(paramArray: Array>): Promise { let queryMsg = { action: 'bind', args: { @@ -100,10 +100,10 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg); + return await this.execute(queryMsg); } - Batch(): Promise { + async Batch(): Promise { let queryMsg = { action: 'add_batch', args: { @@ -111,17 +111,17 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg); + return await this.execute(queryMsg); } /** * return client version. */ - Version(): Promise { - return this._wsClient.version(); + async Version(): Promise { + return await this._wsClient.version(); } - Exec(): Promise { + async Exec(): Promise { let queryMsg = { action: 'exec', args: { @@ -129,14 +129,14 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg); + return await this.execute(queryMsg); } GetLastAffected() { return this.lastAffected; } - Close(): Promise { + async Close(): Promise { let queryMsg = { action: 'close', args: { @@ -144,7 +144,7 @@ export class WsStmt { stmt_id: this._stmt_id, }, }; - return this.execute(queryMsg, false); + return await this.execute(queryMsg, false); } public getStmtId(): number | undefined | null { @@ -179,47 +179,35 @@ export class WsStmt { } private async sendBinaryMsg(reqId: bigint, action:string, message: ArrayBuffer): Promise { - try { - if (this._wsClient.getState() <= 0) { - throw new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "websocket connect has closed!"); - } - let result = await this._wsClient.sendBinaryMsg(reqId, action, message, false); - let resp = new WsStmtQueryResponse(result) - if (resp.stmt_id) { - this._stmt_id = resp.stmt_id; - } - - if (resp.affected) { - this.lastAffected = resp.affected - } - return - } catch (e: any) { - throw new TaosResultError(e.code, e.message); + if (this._wsClient.getState() <= 0) { + throw new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "websocket connect has closed!"); + } + let result = await this._wsClient.sendBinaryMsg(reqId, action, message, false); + let resp = new WsStmtQueryResponse(result) + if (resp.stmt_id) { + this._stmt_id = resp.stmt_id; } + + if (resp.affected) { + this.lastAffected = resp.affected + } } - private init(reqId?: number):Promise { - return new Promise(async (resolve, reject) => { - if (this._wsClient) { - try{ - if (this._wsClient.getState() <= 0) { - await this._wsClient.connect(); - } - let queryMsg = { - action: 'init', - args: { - req_id: ReqId.getReqID(reqId), - }, - }; - await this.execute(queryMsg); - resolve(this) - } catch(e) { - reject(e); - } - }else{ - reject(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed")); + private async init(reqId?: number):Promise { + if (this._wsClient) { + if (this._wsClient.getState() <= 0) { + await this._wsClient.connect(); } - }); + let queryMsg = { + action: 'init', + args: { + req_id: ReqId.getReqID(reqId), + }, + }; + await this.execute(queryMsg); + return this; + } + throw(new TDWebSocketClientError(ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed")); } } diff --git a/nodejs/src/tmq/wsTmq.ts b/nodejs/src/tmq/wsTmq.ts index a01f95f..a0b034b 100644 --- a/nodejs/src/tmq/wsTmq.ts +++ b/nodejs/src/tmq/wsTmq.ts @@ -18,28 +18,23 @@ export class WsConsumer { this._wsClient = new WsClient(this._wsConfig.url, this._wsConfig.timeout); } - private init():Promise { - return new Promise(async (resolve, reject) => { - try { - await this._wsClient.Ready(); - resolve(this); - } catch (e: any) { - reject(e) - } - }); + private async init():Promise { + await this._wsClient.Ready(); + return this; + } - static NewConsumer(wsConfig:Map):Promise { + static async NewConsumer(wsConfig:Map):Promise { if (wsConfig.size == 0 || !wsConfig.get(TMQConstants.WS_URL)) { throw new WebSocketInterfaceError(ErrorCode.ERR_INVALID_URL, 'invalid url, password or username needed.'); } let wsConsumer = new WsConsumer(wsConfig); - return wsConsumer.init() + return await wsConsumer.init() } - Subscribe(topics: Array, reqId?:number): Promise { + async Subscribe(topics: Array, reqId?:number): Promise { if (!topics || topics.length == 0 ) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq Subscribe params is error!'); @@ -60,165 +55,125 @@ export class WsConsumer { }, }; this._topics = topics - return this.execute(JSON.stringify(queryMsg)); + return await this._wsClient.exec(JSON.stringify(queryMsg)); } - Unsubscribe(reqId?:number): Promise { + async Unsubscribe(reqId?:number): Promise { let queryMsg = { action: TMQMessageType.Unsubscribe, args: { req_id: ReqId.getReqID(reqId), }, }; - return this.execute(JSON.stringify(queryMsg)); + return await this._wsClient.exec(JSON.stringify(queryMsg)); } - Poll(timeoutMs: number, reqId?:number):Promise>{ - return new Promise(async (resolve, reject) => { - try { - if (this._wsConfig.auto_commit) { - if (this._commitTime) { - let currTime = new Date().getTime(); - let diff = Math.abs(currTime - this._commitTime); - if (diff >= this._wsConfig.auto_commit_interval_ms) { - await this.doCommit() - this._commitTime = new Date().getTime(); - } - } else { - this._commitTime = new Date().getTime(); - } + async Poll(timeoutMs: number, reqId?:number):Promise>{ + if (this._wsConfig.auto_commit) { + if (this._commitTime) { + let currTime = new Date().getTime(); + let diff = Math.abs(currTime - this._commitTime); + if (diff >= this._wsConfig.auto_commit_interval_ms) { + await this.doCommit() + this._commitTime = new Date().getTime(); } - resolve(await this.poll(timeoutMs,reqId)) - } catch(e: any) { - reject(new TaosResultError(e.code, e.message)); + } else { + this._commitTime = new Date().getTime(); } - }) + } + return await this.poll(timeoutMs,reqId) } - Assignment(topics?:string[]):Promise> { - return new Promise(async (resolve, reject) => { - if (!topics || topics.length == 0) { - topics = this._topics - } + async Assignment(topics?:string[]):Promise> { + if (!topics || topics.length == 0) { + topics = this._topics + } - let topicPartitions:TopicPartition[] = []; - try { - if (topics && topics.length > 0) { - const allp:any[] = []; - for (let i in topics) { - allp.push(this.assignment(topics[i])); - } - let result = await Promise.all(allp) - result.forEach(e => { - topicPartitions.push(...e); - }) - } - resolve(topicPartitions) - } catch (e: any){ - reject(new TaosResultError(e.code, e.message)); + let topicPartitions:TopicPartition[] = []; + + if (topics && topics.length > 0) { + const allp:any[] = []; + for (let i in topics) { + allp.push(this.assignment(topics[i])); } - }); + let result = await Promise.all(allp) + result.forEach(e => { + topicPartitions.push(...e); + }) + } + return topicPartitions; } - Subscription(reqId?:number):Promise> { - return new Promise(async (resolve, reject) => { - let queryMsg = { - action: TMQMessageType.ListTopics, - args: { - req_id: ReqId.getReqID(reqId), - }, - }; - try { - let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); - resolve(new SubscriptionResp(resp).topics) - } catch (e:any) { - reject(new TaosResultError(e.code, e.message)); - } - }); + async Subscription(reqId?:number):Promise> { + let queryMsg = { + action: TMQMessageType.ListTopics, + args: { + req_id: ReqId.getReqID(reqId), + }, + }; + + let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); + return new SubscriptionResp(resp).topics; } - Commit(reqId?:number):Promise> { - return new Promise(async (resolve, reject) => { - try { - await this.doCommit(reqId) - resolve(await this.Assignment()) - } catch (e: any) { - reject(new TaosResultError(e.code, e.message)); - } - }) + async Commit(reqId?:number):Promise> { + await this.doCommit(reqId) + return await this.Assignment() } - private doCommit(reqId?:number):Promise { - return new Promise(async (resolve, reject) => { - let queryMsg = { - action: TMQMessageType.Commit, - args: { - req_id : ReqId.getReqID(reqId), - message_id: 0 - }, - }; - try { - await this.execute(JSON.stringify(queryMsg)); - resolve() - } catch(e: any) { - reject(new TaosResultError(e.code, e.message)) - } - }) + private async doCommit(reqId?:number):Promise { + let queryMsg = { + action: TMQMessageType.Commit, + args: { + req_id : ReqId.getReqID(reqId), + message_id: 0 + }, + }; + + await this._wsClient.exec(JSON.stringify(queryMsg)); } - Committed(partitions:Array, reqId?:number):Promise>{ + async Committed(partitions:Array, reqId?:number):Promise>{ if (!partitions || partitions.length == 0 ) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq Positions params is error!'); } - return new Promise(async (resolve, reject) => { - let offsets: TopicPartition[] = new Array(partitions.length); - for (let i = 0; i < partitions.length; i++) { - offsets[i] = { - topic: partitions[i].topic, - vgroup_id: partitions[i].vgroup_id - }; - offsets[i].vgroup_id = partitions[i].vgroup_id - } - - let queryMsg = { - action: TMQMessageType.Committed, - args: { - req_id : ReqId.getReqID(reqId), - topic_vgroup_ids:offsets - }, + let offsets: TopicPartition[] = new Array(partitions.length); + for (let i = 0; i < partitions.length; i++) { + offsets[i] = { + topic: partitions[i].topic, + vgroup_id: partitions[i].vgroup_id }; - try { - let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); - resolve(new CommittedResp(resp).SetTopicPartitions(offsets)) - } catch (e:any) { - reject(new TaosResultError(e.code, e.message)); - } - }); + offsets[i].vgroup_id = partitions[i].vgroup_id; + } + + let queryMsg = { + action: TMQMessageType.Committed, + args: { + req_id : ReqId.getReqID(reqId), + topic_vgroup_ids:offsets + }, + }; + + let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); + return new CommittedResp(resp).SetTopicPartitions(offsets); } - CommitOffsets(partitions:Array):Promise> { + async CommitOffsets(partitions:Array):Promise> { if (!partitions || partitions.length == 0) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq CommitOffsets params is error!'); - } - - return new Promise(async (resolve, reject) => { - try{ - const allp:any[] = [] - partitions.forEach(e => { - allp.push(this.CommitOffset(e)) - }) - await Promise.all(allp) - resolve(await this.Committed(partitions)) - }catch(e:any) { - reject(new TaosResultError(e.code, e.message)); - } + } + const allp:any[] = []; + partitions.forEach(e => { + allp.push(this.CommitOffset(e)); }) + await Promise.all(allp); + return await this.Committed(partitions); } - CommitOffset(partition:TopicPartition, reqId?:number):Promise { + async CommitOffset(partition:TopicPartition, reqId?:number):Promise { if (!partition) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq CommitOffsets params is error!'); @@ -233,43 +188,36 @@ export class WsConsumer { offset :partition.offset, }, }; - return this.execute(JSON.stringify(queryMsg)); - - + return await this._wsClient.exec(JSON.stringify(queryMsg)); } - Positions(partitions:Array, reqId?:number):Promise> { + async Positions(partitions:Array, reqId?:number):Promise> { if (!partitions || partitions.length == 0 ) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq Positions params is error!'); } - return new Promise(async (resolve, reject) => { - let offsets: TopicPartition[] = new Array(partitions.length); - for (let i = 0; i < partitions.length; i++) { - offsets[i] = { - topic: partitions[i].topic, - vgroup_id: partitions[i].vgroup_id - }; - offsets[i].vgroup_id = partitions[i].vgroup_id - } - let queryMsg = { - action: TMQMessageType.Position, - args: { - req_id : ReqId.getReqID(reqId), - topic_vgroup_ids:offsets - }, + let offsets: TopicPartition[] = new Array(partitions.length); + for (let i = 0; i < partitions.length; i++) { + offsets[i] = { + topic: partitions[i].topic, + vgroup_id: partitions[i].vgroup_id }; - try { - let resp = await this.executeReturnAny(JSON.stringify(queryMsg)); - resolve(new PartitionsResp(resp).SetTopicPartitions(offsets)) - } catch (e:any) { - reject(new TaosResultError(e.code, e.message)); - } - }); + offsets[i].vgroup_id = partitions[i].vgroup_id + } + let queryMsg = { + action: TMQMessageType.Position, + args: { + req_id : ReqId.getReqID(reqId), + topic_vgroup_ids:offsets + }, + }; + + let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); + return new PartitionsResp(resp).SetTopicPartitions(offsets); } - Seek(partition:TopicPartition, reqId?:number):Promise { + async Seek(partition:TopicPartition, reqId?:number):Promise { if (!partition) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq Seek params is error!'); @@ -284,48 +232,31 @@ export class WsConsumer { offset :partition.offset, }, }; - return this.execute(JSON.stringify(queryMsg)); + return await this._wsClient.exec(JSON.stringify(queryMsg)); } - SeekToBeginning(partitions:Array):Promise { + async SeekToBeginning(partitions:Array):Promise { if (!partitions || partitions.length == 0) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq SeekToBeginning params is error!'); } - return this.seekToBeginOrEnd(partitions) + return await this.seekToBeginOrEnd(partitions) } - SeekToEnd(partitions:Array):Promise { + async SeekToEnd(partitions:Array):Promise { if (!partitions || partitions.length == 0) { throw new TaosResultError(ErrorCode.ERR_INVALID_PARAMS, 'WsTmq SeekToEnd params is error!'); } - return this.seekToBeginOrEnd(partitions, false) + return await this.seekToBeginOrEnd(partitions, false) } - Close() { - this._wsClient.close(); + async Close():Promise { + await this._wsClient.close(); } - private async execute(queryMsg: string): Promise { - try { - await this._wsClient.exec(queryMsg); - } catch (e:any) { - throw new TaosResultError(e.code, e.message); - } - } - - private async executeReturnAny(queryMsg: string): Promise { - try { - return await this._wsClient.exec(queryMsg, false); - } catch (e:any) { - logger.error(e); - throw new TaosResultError(e.code, e.message); - } - } - - private fetch(pollResp: WsPollResponse):Promise { + private async fetch(pollResp: WsPollResponse):Promise { let fetchMsg = { action: 'fetch', args: { @@ -333,38 +264,25 @@ export class WsConsumer { message_id:pollResp.message_id, }, }; - - return new Promise(async (resolve, reject) => { - let jsonStr = JSON.stringify(fetchMsg); - // console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); - try { - let result = await this._wsClient.exec(jsonStr, false); - resolve(new WsTmqQueryResponse(result)); - } catch (e:any) { - reject(new WebSocketInterfaceError(e.code, e.message)) - } - }); + let jsonStr = JSON.stringify(fetchMsg); + // console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + let result = await this._wsClient.exec(jsonStr, false); + return new WsTmqQueryResponse(result); } - private fetchBlockData(fetchResponse: WsTmqQueryResponse, taosResult: TaosResult):Promise { + private async fetchBlockData(fetchResponse: WsTmqQueryResponse, taosResult: TaosResult):Promise { let fetchMsg = { action: 'fetch_block', args: { req_id: fetchResponse.req_id, message_id: fetchResponse.message_id, }, - }; - - return new Promise(async (resolve, reject) => { - try { - let jsonStr = JSON.stringify(fetchMsg); - // console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); - let result = await this._wsClient.sendMsg(jsonStr) - resolve(parseTmqBlock(fetchResponse.rows, new WSTmqFetchBlockResponse(result), taosResult)) - } catch (e: any){ - reject(new WebSocketInterfaceError(e.code, e.message)) - } - }); + }; + let jsonStr = JSON.stringify(fetchMsg); + // console.log('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr); + let result = await this._wsClient.sendMsg(jsonStr) + parseTmqBlock(fetchResponse.rows, new WSTmqFetchBlockResponse(result), taosResult) + return taosResult; } private async poll(timeoutMs: number, reqId?:number): Promise> { @@ -375,92 +293,73 @@ export class WsConsumer { blocking_time :timeoutMs }, }; - return new Promise(async (resolve, reject) => { - try { - var taosResults: Map = new Map(); - let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); - let pollResp = new WsPollResponse(resp) - if (!pollResp.have_message || pollResp.message_type != TMQMessageType.ResDataType) { - resolve(taosResults); - } else { - while (true) { - let fetchResp = await this.fetch(pollResp) - if (fetchResp.completed || fetchResp.rows == 0) { - break; - } - let taosResult = taosResults.get(pollResp.topic + pollResp.vgroup_id) - if (taosResult == null) { - taosResult = new TaosTmqResult(fetchResp, pollResp) - taosResults.set(pollResp.topic + pollResp.vgroup_id, taosResult) - } else { - taosResult.SetRowsAndTime(fetchResp.rows); - } - await this.fetchBlockData(fetchResp, taosResult) - - } - - resolve(taosResults); - } - } catch (e :any) { - logger.error(e); - reject(new TaosResultError(e.code, e.message)); + + var taosResults: Map = new Map(); + let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); + let pollResp = new WsPollResponse(resp) + if (!pollResp.have_message || pollResp.message_type != TMQMessageType.ResDataType) { + return taosResults; + } + while (true) { + let fetchResp = await this.fetch(pollResp) + if (fetchResp.completed || fetchResp.rows == 0) { + break; } - }) + let taosResult = taosResults.get(pollResp.topic + pollResp.vgroup_id) + if (taosResult == null) { + taosResult = new TaosTmqResult(fetchResp, pollResp) + taosResults.set(pollResp.topic + pollResp.vgroup_id, taosResult) + } else { + taosResult.SetRowsAndTime(fetchResp.rows); + } + await this.fetchBlockData(fetchResp, taosResult) + + } + + return taosResults; } - private assignment(topic:string):Promise> { - return new Promise(async (resolve, reject) => { - try { - let queryMsg = { - action: TMQMessageType.GetTopicAssignment, - args: { - req_id: ReqId.getReqID(), - topic: topic - } - } - - let resp = await this.executeReturnAny(JSON.stringify(queryMsg)) - let assignmentInfo = new AssignmentResp(resp, queryMsg.args.topic); - resolve(assignmentInfo.topicPartition) - } catch (e:any){ - reject(new TaosResultError(e.code, e.message)); + private async assignment(topic:string):Promise> { + let queryMsg = { + action: TMQMessageType.GetTopicAssignment, + args: { + req_id: ReqId.getReqID(), + topic: topic } - }); + }; + + let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false); + let assignmentInfo = new AssignmentResp(resp, queryMsg.args.topic); + return assignmentInfo.topicPartition; } - private seekToBeginOrEnd(partitions:Array, bBegin:boolean = true):Promise { - return new Promise(async (resolve, reject) => { - let topics: string[] = []; - partitions.forEach(e => { - topics.push(e.topic) - }) - try { - let topicPartitions = await this.Assignment(topics) - let itemMap = topicPartitions.reduce((map, obj)=> { - map.set(obj.topic+'_'+obj.vgroup_id, obj) - return map - }, new Map()); - - const allp:any[] = [] - for(let i in partitions) { - if(itemMap.has(partitions[i].topic + '_' +partitions[i].vgroup_id)) { - let topicPartition = itemMap.get(partitions[i].topic + '_' +partitions[i].vgroup_id) - if (topicPartition) { - if(bBegin) { - topicPartition.offset = topicPartition.begin - }else{ - topicPartition.offset = topicPartition.end - } - allp.push(this.Seek(topicPartition)) - } + private async seekToBeginOrEnd(partitions:Array, bBegin:boolean = true):Promise { + let topics: string[] = []; + partitions.forEach(e => { + topics.push(e.topic) + }) + + let topicPartitions = await this.Assignment(topics) + let itemMap = topicPartitions.reduce((map, obj)=> { + map.set(obj.topic+'_'+obj.vgroup_id, obj) + return map + }, new Map()); + + const allp:any[] = [] + for(let i in partitions) { + if(itemMap.has(partitions[i].topic + '_' +partitions[i].vgroup_id)) { + let topicPartition = itemMap.get(partitions[i].topic + '_' +partitions[i].vgroup_id) + if (topicPartition) { + if(bBegin) { + topicPartition.offset = topicPartition.begin + }else{ + topicPartition.offset = topicPartition.end } + allp.push(this.Seek(topicPartition)) } - await Promise.all(allp) - resolve() - } catch (e:any){ - reject(new TaosResultError(e.code, e.message)); } - }) + } + await Promise.all(allp) } } diff --git a/nodejs/test/bulkPulling/queryTables.test.ts b/nodejs/test/bulkPulling/queryTables.test.ts index 824a36d..4471a1c 100644 --- a/nodejs/test/bulkPulling/queryTables.test.ts +++ b/nodejs/test/bulkPulling/queryTables.test.ts @@ -1,4 +1,5 @@ +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; import { compareUint8Arrays, createSTable, createSTableJSON, createTable, expectStableData, hexToBytes, insertNTable, insertStable, jsonMeta, tableMeta, tagMeta } from "../utils"; @@ -69,7 +70,7 @@ beforeAll(async () => { await ws.Exec(createTable(tableCN)); await ws.Exec(createSTableJSON(jsonTable)); await ws.Exec(createSTableJSON(jsonTableCN)); - ws.Close() + await ws.Close() }) describe('ws.query(stable)', () => { @@ -86,7 +87,7 @@ describe('ws.query(stable)', () => { let expectData = expectStableData(tableValues, stableTags) let actualMeta = queryRes.GetMeta() let actualData = queryRes.GetData() - ws.Close() + await ws.Close() if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { expect(meta.name).toBe(expectMeta[index].name) @@ -132,7 +133,7 @@ describe('ws.query(stable)', () => { let expectData = expectStableData(tableCNValues, stableCNTags) let actualMeta = queryRes.GetMeta() let actualData = queryRes.GetData() - ws.Close() + await ws.Close() if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { expect(meta.name).toBe(expectMeta[index].name) @@ -176,7 +177,7 @@ describe('ws.query(table)', () => { let expectData = tableValues let actualMeta = queryRes.GetMeta() let actualData = queryRes.GetData() - ws.Close() + await ws.Close() if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { // console.log(meta,expectMeta[index]); @@ -214,7 +215,7 @@ describe('ws.query(table)', () => { let expectData = tableCNValues let actualMeta = queryRes.GetMeta() let actualData = queryRes.GetData() - ws.Close() + await ws.Close() if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { // console.log(meta, expectMeta[index]); @@ -255,7 +256,7 @@ describe('ws.query(jsonTable)', () => { let expectData = expectStableData(tableValues, jsonTags) let actualMeta = queryRes.GetMeta() let actualData = queryRes.GetData() - ws.Close() + await ws.Close() if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { // console.log(meta); @@ -294,7 +295,7 @@ describe('ws.query(jsonTable)', () => { let expectData = expectStableData(tableCNValues, jsonTagsCN) let actualMeta = queryRes.GetMeta() let actualData = queryRes.GetData() - ws.Close() + await ws.Close() if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { // console.log(meta); @@ -319,6 +320,9 @@ describe('ws.query(jsonTable)', () => { }) +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() +}) //--detectOpenHandles --maxConcurrency=1 --forceExit \ No newline at end of file diff --git a/nodejs/test/bulkPulling/schemaless.test.ts b/nodejs/test/bulkPulling/schemaless.test.ts index 50909e5..e69061e 100644 --- a/nodejs/test/bulkPulling/schemaless.test.ts +++ b/nodejs/test/bulkPulling/schemaless.test.ts @@ -1,12 +1,12 @@ +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; import { WSConfig } from "../../src/common/config"; import { Precision, SchemalessProto } from "../../src/sql/wsProto"; import { WsSql } from "../../src/sql/wsSql"; - +let dns = 'ws://localhost:6041' beforeAll(async () => { - let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -14,7 +14,7 @@ beforeAll(async () => { let wsSql = await WsSql.Open(conf) await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); - wsSql.Close() + await wsSql.Close() }) @@ -25,21 +25,19 @@ describe('TDWebSocket.WsSchemaless()', () => { let jsonData = "{\"metric\": \"meter_current\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}" test('normal connect', async() => { - let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') conf.SetDb('power') let wsSchemaless = await WsSql.Open(conf) expect(wsSchemaless.State()).toBeGreaterThan(0) - wsSchemaless.Close(); + await wsSchemaless.Close(); }); test('connect db with error', async() => { expect.assertions(1) let wsSchemaless = null; try { - let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -50,13 +48,12 @@ describe('TDWebSocket.WsSchemaless()', () => { expect(e.message).toMatch('Database not exist') }finally{ if(wsSchemaless) { - wsSchemaless.Close() + await wsSchemaless.Close() } } }) test('normal insert', async() => { - let dns = 'ws://localhost:6041' let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -66,11 +63,11 @@ describe('TDWebSocket.WsSchemaless()', () => { await wsSchemaless.SchemalessInsert([influxdbData], SchemalessProto.InfluxDBLineProtocol, Precision.NANO_SECONDS, 0); await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); - wsSchemaless.Close(); + await wsSchemaless.Close(); }); test('normal wsSql insert', async() => { - let dns = 'ws://localhost:6041' + let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -82,11 +79,11 @@ describe('TDWebSocket.WsSchemaless()', () => { await wsSchemaless.SchemalessInsert([telnetData], SchemalessProto.OpenTSDBTelnetLineProtocol, Precision.SECONDS, 0); await wsSchemaless.SchemalessInsert([jsonData], SchemalessProto.OpenTSDBJsonFormatProtocol, Precision.SECONDS, 0); - wsSchemaless.Close(); + await wsSchemaless.Close(); }); test('SchemalessProto error', async() => { - let dns = 'ws://localhost:6041' + let conf :WSConfig = new WSConfig(dns) conf.SetUser('root') conf.SetPwd('taosdata') @@ -99,6 +96,10 @@ describe('TDWebSocket.WsSchemaless()', () => { expect(e.message).toMatch('invalid timestamp') } - wsSchemaless.Close(); + await wsSchemaless.Close(); }); +}) + +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() }) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/sql.test.ts b/nodejs/test/bulkPulling/sql.test.ts index 136ccbe..ebba21d 100644 --- a/nodejs/test/bulkPulling/sql.test.ts +++ b/nodejs/test/bulkPulling/sql.test.ts @@ -1,3 +1,4 @@ +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; @@ -10,7 +11,7 @@ beforeAll(async () => { await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); await wsSql.Exec('use power') await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); - wsSql.Close() + await wsSql.Close() }) describe('TDWebSocket.WsSql()', () => { @@ -22,7 +23,7 @@ describe('TDWebSocket.WsSql()', () => { conf.SetDb('power') wsSql = await WsSql.Open(conf) expect(wsSql.State()).toBeGreaterThan(0) - wsSql.Close(); + await wsSql.Close(); }); test('connect db with error', async() => { @@ -38,7 +39,7 @@ describe('TDWebSocket.WsSql()', () => { expect(err.message).toMatch('Database not exist') }finally{ if(wsSql) { - wsSql.Close() + await wsSql.Close() } } }) @@ -47,7 +48,7 @@ describe('TDWebSocket.WsSql()', () => { let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let version = await wsSql.Version() - wsSql.Close() + await wsSql.Close() console.log(version); expect(version).toBeTruthy() }) @@ -57,7 +58,7 @@ describe('TDWebSocket.WsSql()', () => { let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('show databases') - wsSql.Close() + await wsSql.Close() console.log(taosResult); expect(taosResult).toBeTruthy() }) @@ -67,7 +68,7 @@ describe('TDWebSocket.WsSql()', () => { let conf :WSConfig = new WSConfig(dsn) let wsSql = await WsSql.Open(conf) let taosResult = await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;') - wsSql.Close() + await wsSql.Close() console.log(taosResult); expect(taosResult).toBeTruthy() }) @@ -81,7 +82,7 @@ describe('TDWebSocket.WsSql()', () => { expect(taosResult).toBeTruthy() taosResult = await wsSql.Exec('CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); - wsSql.Close() + await wsSql.Close() console.log(taosResult); expect(taosResult).toBeTruthy() }) @@ -100,6 +101,7 @@ describe('TDWebSocket.WsSql()', () => { taosResult = await wsSql.Exec('INSERT INTO d1001 USING meters (location, groupid) TAGS ("California.SanFrancisco", 3) VALUES (NOW, 10.2, 219, 0.32)') console.log(taosResult); expect(taosResult.GetAffectRows()).toBeGreaterThanOrEqual(1) + await wsSql.Close() }) @@ -120,9 +122,13 @@ describe('TDWebSocket.WsSql()', () => { let result = await wsRows.GetData(); expect(result).toBeTruthy() } - wsRows.Close() + await wsRows.Close() } - wsSql.Close() + await wsSql.Close() }) +}) + +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() }) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/stmt.func.test.ts b/nodejs/test/bulkPulling/stmt.func.test.ts index 76a86ab..7083f2d 100644 --- a/nodejs/test/bulkPulling/stmt.func.test.ts +++ b/nodejs/test/bulkPulling/stmt.func.test.ts @@ -1,3 +1,4 @@ +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; @@ -9,7 +10,7 @@ beforeAll(async () => { let wsSql = await WsSql.Open(conf) await wsSql.Exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); await wsSql.Exec('CREATE STABLE if not exists power.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); - wsSql.Close() + await wsSql.Close() }) describe('TDWebSocket.Stmt()', () => { jest.setTimeout(20 * 1000) @@ -32,8 +33,8 @@ describe('TDWebSocket.Stmt()', () => { let stmt = await connector.StmtInit() expect(stmt).toBeTruthy() expect(connector.State()).toBeGreaterThan(0) - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('connect db with error', async() => { @@ -44,13 +45,14 @@ describe('TDWebSocket.Stmt()', () => { let wsConf :WSConfig = new WSConfig(dsn) wsConf.SetDb('jest') connector = await WsSql.Open(wsConf) - await connector.StmtInit() + let stmt = await connector.StmtInit() + await stmt.Close() }catch(e){ let err:any = e expect(err.message).toMatch('Database not exist') }finally{ if(connector) { - connector.Close() + await connector.Close() } } }) @@ -69,8 +71,8 @@ describe('TDWebSocket.Stmt()', () => { params.SetVarcharColumn([tags[0]]); params.SetIntColumn([tags[1]]); await stmt.SetBinaryTags(params) - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('set tag error', async() => { @@ -90,8 +92,8 @@ describe('TDWebSocket.Stmt()', () => { } catch(err:any) { expect(err.message).toMatch('stmt tags count not match') } - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('error Prepare table', async() => { @@ -109,8 +111,8 @@ describe('TDWebSocket.Stmt()', () => { let err:any = e expect(err.message).toMatch("syntax error near '? into ? using powr.meters tags (?, ?) values (?, ?, ?, ?)' (keyword INTO is expected)") } - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('error Prepare tag', async() => { @@ -128,8 +130,8 @@ describe('TDWebSocket.Stmt()', () => { let err:any = e expect(err.message).toMatch("Database not exist") } - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('normal BindParam', async() => { @@ -170,8 +172,8 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Batch() await stmt.Exec() expect(stmt.GetLastAffected()).toEqual(30) - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); @@ -208,8 +210,8 @@ describe('TDWebSocket.Stmt()', () => { let err:any = e expect(err.message).toMatch("wrong row length") } - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('no Batch', async() => { @@ -244,8 +246,8 @@ describe('TDWebSocket.Stmt()', () => { let err:any = e expect(err.message).toMatch("Stmt API usage error") } - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('Batch after BindParam', async() => { @@ -292,8 +294,8 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Batch() await stmt.Exec() expect(stmt.GetLastAffected()).toEqual(4) - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('no set tag', async() => { @@ -320,8 +322,8 @@ describe('TDWebSocket.Stmt()', () => { let err:any = e expect(err.message).toMatch("Retry needed") } - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); test('normal binary BindParam', async() => { @@ -347,11 +349,11 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Batch() await stmt.Exec() - stmt.Close() let result = await connector.Exec("select * from power.meters") console.log(result) - connector.Close(); + await stmt.Close() + await connector.Close(); }); @@ -383,7 +385,11 @@ describe('TDWebSocket.Stmt()', () => { await stmt.BinaryBind(dataParams) await stmt.Batch() await stmt.Exec() - stmt.Close() - connector.Close(); + await stmt.Close() + await connector.Close(); }); +}) + +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() }) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/stmt.type.test.ts b/nodejs/test/bulkPulling/stmt.type.test.ts index 415a390..d08ad77 100644 --- a/nodejs/test/bulkPulling/stmt.type.test.ts +++ b/nodejs/test/bulkPulling/stmt.type.test.ts @@ -1,3 +1,4 @@ +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; import { createBaseSTable, createBaseSTableJSON, createSTableJSON, getInsertBind } from "../utils"; @@ -91,7 +92,7 @@ beforeAll(async () => { await ws.Exec(useDB); await ws.Exec(createBaseSTable(stable)); await ws.Exec(createSTableJSON(jsonTable)); - ws.Close() + await ws.Close() }) describe('TDWebSocket.Stmt()', () => { @@ -150,7 +151,7 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Close() let result = await connector.Exec(`select * from ${db}.${stable}`) console.log(result) - connector.Close(); + await connector.Close(); }); test('normal CN BindParam', async() => { @@ -207,7 +208,7 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Close() let result = await connector.Exec(`select count(*) from ${db}.${stable}`) console.log(result) - connector.Close(); + await connector.Close(); }); test('normal json tag BindParam', async() => { @@ -251,7 +252,7 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Close() let result = await connector.Exec(`select * from ${db}.${jsonTable}`) console.log(result) - connector.Close(); + await connector.Close(); }); test('normal json cn tag BindParam', async() => { @@ -295,7 +296,11 @@ describe('TDWebSocket.Stmt()', () => { await stmt.Close() let result = await connector.Exec(`select * from ${db}.${jsonTable}`) console.log(result) - connector.Close(); + await connector.Close(); }); +}) + +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() }) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/tmq.test.ts b/nodejs/test/bulkPulling/tmq.test.ts index 78ed874..5660712 100644 --- a/nodejs/test/bulkPulling/tmq.test.ts +++ b/nodejs/test/bulkPulling/tmq.test.ts @@ -4,6 +4,7 @@ import { WsConsumer } from "../../src/tmq/wsTmq"; import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; import { createSTable, insertStable } from "../utils"; +import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; const stable = 'st'; const db = 'ws_tmq_test' const topics:string[] = ['topic_ws_bean'] @@ -51,7 +52,7 @@ beforeAll(async () => { let insertRes = await ws.Exec(insert) insert = insertStable(tableCNValues, stableTags, stable) insertRes = await ws.Exec(insert) - ws.Close() + await ws.Close() }) @@ -94,7 +95,7 @@ describe('TDWebSocket.Tmq()', () => { expect(e.message).toMatch('fail') }finally{ if(consumer) { - consumer.Close() + await consumer.Close() } } }) @@ -148,7 +149,7 @@ describe('TDWebSocket.Tmq()', () => { assignment = await consumer.Committed(assignment) console.log(assignment) await consumer.Unsubscribe() - consumer.Close(); + await consumer.Close(); console.log("------------->", useTime) console.log("------------->", counts) expect(counts).toEqual([10, 10]) @@ -161,7 +162,7 @@ describe('TDWebSocket.Tmq()', () => { }catch(e:any) { expect(e.message).toMatch("Topic not exist"); } - consumer.Close(); + await consumer.Close(); }); test('normal seek', async() => { @@ -180,7 +181,11 @@ describe('TDWebSocket.Tmq()', () => { } await consumer.Unsubscribe() - consumer.Close(); + await consumer.Close(); }); +}) + +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() }) \ No newline at end of file diff --git a/nodejs/test/bulkPulling/wsConnectPool.test.ts b/nodejs/test/bulkPulling/wsConnectPool.test.ts index 91b3e44..39f4a5a 100644 --- a/nodejs/test/bulkPulling/wsConnectPool.test.ts +++ b/nodejs/test/bulkPulling/wsConnectPool.test.ts @@ -110,7 +110,7 @@ beforeAll(async () => { let conf :WSConfig = new WSConfig(dsn) let ws = await WsSql.Open(conf); await ws.Exec(createTopic, ReqId.getReqID()); - ws.Close() + await ws.Close() }) describe('TDWebSocket.WsSql()', () => { @@ -134,4 +134,8 @@ describe('TDWebSocket.WsSql()', () => { WebSocketConnectionPool.Instance().Destroyed() console.log(stmtIds) }); +}) + +afterAll(async () => { + WebSocketConnectionPool.Instance().Destroyed() }) \ No newline at end of file From 802e70535b6a14b6a6f330fea8aa7b1a2ef4b3f3 Mon Sep 17 00:00:00 2001 From: menshibin Date: Thu, 18 Apr 2024 11:45:09 +0800 Subject: [PATCH 16/17] modify tmq expect --- nodejs/test/bulkPulling/tmq.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nodejs/test/bulkPulling/tmq.test.ts b/nodejs/test/bulkPulling/tmq.test.ts index 5660712..cc6db30 100644 --- a/nodejs/test/bulkPulling/tmq.test.ts +++ b/nodejs/test/bulkPulling/tmq.test.ts @@ -69,7 +69,8 @@ describe('TDWebSocket.Tmq()', () => { [TMQConstants.AUTO_COMMIT_INTERVAL_MS, '1000'] ]); - + console.log(configMap); + test('normal connect', async() => { let consumer = await WsConsumer.NewConsumer(configMap); consumer.Close(); @@ -92,7 +93,7 @@ describe('TDWebSocket.Tmq()', () => { consumer = await WsConsumer.NewConsumer(errConfigMap); await consumer.Subscribe(topics); }catch(e :any){ - expect(e.message).toMatch('fail') + expect(e.message).toMatch('new consumer return nil') }finally{ if(consumer) { await consumer.Close() From 325d52dc803092c201fce1b8a33cb0bb3562f094 Mon Sep 17 00:00:00 2001 From: menshibin Date: Thu, 18 Apr 2024 12:05:20 +0800 Subject: [PATCH 17/17] modify tmq expect --- .github/workflows/push.yaml | 2 +- nodejs/test/bulkPulling/tmq.test.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 5913284..f612357 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -30,7 +30,7 @@ jobs: fetch-depth: 1 repository: 'taosdata/TDengine' path: 'TDengine' - ref: '3.0' + ref: 'main' submodules: 'recursive' - name: install TDengine diff --git a/nodejs/test/bulkPulling/tmq.test.ts b/nodejs/test/bulkPulling/tmq.test.ts index cc6db30..1cfa8a9 100644 --- a/nodejs/test/bulkPulling/tmq.test.ts +++ b/nodejs/test/bulkPulling/tmq.test.ts @@ -93,7 +93,8 @@ describe('TDWebSocket.Tmq()', () => { consumer = await WsConsumer.NewConsumer(errConfigMap); await consumer.Subscribe(topics); }catch(e :any){ - expect(e.message).toMatch('new consumer return nil') + console.log(e) + expect(e.code).toBe(65535) }finally{ if(consumer) { await consumer.Close()