From 96a443f8d3d4d4bc345edf29dcc12386ea0495f8 Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Thu, 9 Nov 2023 00:20:43 +0300 Subject: [PATCH] test: moved to vitest from mocha/chai damn vitest is so good --- .eslintrc.js | 2 +- .github/workflows/test.yaml | 2 +- .mocharc.json | 3 - package.json | 17 +- packages/client/package.json | 2 - .../utils/file-utils.test.ts} | 15 +- .../utils/memoize.test.ts} | 5 +- .../utils/stream-utils.test.ts} | 5 +- packages/client/tests/tsconfig.json | 9 - packages/core/package.json | 1 - .../network/auth-key.test.ts} | 12 +- .../network/transports/intermediate.test.ts | 79 + .../utils/bigint-utils.test.ts} | 5 +- .../utils/buffer-utils.test.ts} | 7 +- .../utils/crypto/crypto.test-utils.ts} | 30 +- .../src/utils/crypto/factorization.test.ts | 24 + .../utils/crypto/keys.test.ts} | 7 +- .../src/utils/crypto/miller-rabin.test.ts | 139 ++ .../utils/crypto/mtproto.test.ts} | 33 +- packages/core/src/utils/crypto/node.test.ts | 14 + packages/core/src/utils/crypto/web.test.ts | 20 + .../utils/links/bots.test.ts} | 5 +- .../utils/links/chat.test.ts} | 5 +- .../utils/links/misc.test.ts} | 5 +- .../utils/links/proxy.test.ts} | 5 +- .../utils/links/user.test.ts} | 5 +- .../utils/lru-map.test.ts} | 5 +- .../utils/lru-set.test.ts} | 5 +- packages/core/tests/fuzz/fuzz-packet.spec.ts | 71 - packages/core/tests/fuzz/fuzz-session.spec.ts | 77 - .../core/tests/fuzz/fuzz-transport.spec.ts | 127 -- packages/core/tests/fuzz/utils.ts | 17 - packages/core/tests/miller-rabin.spec.ts | 138 -- .../core/tests/prime-factorization.spec.ts | 23 - .../intermediate-codec.spec.ts | 75 - packages/core/tests/tsconfig.json | 9 - packages/crypto-node/package.json | 4 +- .../src/node-native-crypto.test.ts | 9 + .../tests/node-native-crypto.spec.ts | 9 - packages/crypto-node/tests/tsconfig.json | 9 - packages/dispatcher/package.json | 2 - ...{dispatcher.spec.ts => dispatcher.test.ts} | 3 +- packages/file-id/package.json | 2 - .../parse.spec.ts => src/parse.test.ts} | 7 +- .../serialize-unique.test.ts} | 6 +- .../utils.spec.ts => src/utils.test.ts} | 5 +- packages/file-id/tests/tsconfig.json | 9 - packages/html-parser/package.json | 5 +- .../html-parser.test.ts} | 5 +- packages/i18n/package.json | 5 +- .../i18n/tests/{i18n.spec.ts => i18n.test.ts} | 18 +- packages/markdown-parser/package.json | 5 +- .../markdown-parser.test.ts} | 5 +- packages/markdown-parser/tests/tsconfig.json | 9 - packages/mtproxy/index.ts | 2 +- packages/test/package.json | 2 - .../client.spec.ts => src/client.test.ts} | 11 +- .../storage.spec.ts => src/storage.test.ts} | 11 +- .../{tests/stub.spec.ts => src/stub.test.ts} | 15 +- .../transport.test.ts} | 16 +- packages/tl-runtime/package.json | 1 - .../encodings/base64.test.ts} | 31 +- .../hex.spec.ts => src/encodings/hex.test.ts} | 23 +- .../encodings/utf8.test.ts} | 31 +- .../reader.test.ts} | 126 +- .../writer.test.ts} | 79 +- packages/tl-runtime/tests/tsconfig.json | 9 - packages/tl-runtime/tsconfig.json | 2 +- packages/tl-utils/package.json | 1 - .../calculator.test.ts} | 9 +- .../codegen/reader.test.ts} | 10 +- .../codegen/types.test.ts} | 20 +- .../codegen/writer.test.ts} | 12 +- .../ctor-id.spec.ts => src/ctor-id.test.ts} | 8 +- .../{tests/diff.spec.ts => src/diff.test.ts} | 15 +- .../merge.spec.ts => src/merge.test.ts} | 21 +- .../parse.spec.ts => src/parse.test.ts} | 18 +- .../schema.spec.ts => src/schema.test.ts} | 9 +- .../stringify.test.ts} | 9 +- packages/tl-utils/tests/tsconfig.json | 9 - packages/wasm/package.json | 1 - .../{allocator.spec.ts => allocator.test.ts} | 6 +- .../wasm/tests/{ctr.spec.ts => ctr.test.ts} | 47 +- .../tests/{gunzip.spec.ts => gunzip.test.ts} | 17 +- .../wasm/tests/{hash.spec.ts => hash.test.ts} | 13 +- .../wasm/tests/{ige.spec.ts => ige.test.ts} | 11 +- .../wasm/tests/{zlib.spec.ts => zlib.test.ts} | 21 +- pnpm-lock.yaml | 1432 ++++++++--------- scripts/build-package.js | 20 +- vite.config.mts | 15 + 90 files changed, 1344 insertions(+), 1859 deletions(-) delete mode 100644 .mocharc.json rename packages/client/{tests/buffer-utils.spec.ts => src/utils/file-utils.test.ts} (73%) rename packages/client/{tests/memoize.spec.ts => src/utils/memoize.test.ts} (92%) rename packages/client/{tests/stream-utils.spec.ts => src/utils/stream-utils.test.ts} (96%) delete mode 100644 packages/client/tests/tsconfig.json rename packages/core/{tests/auth-key.spec.ts => src/network/auth-key.test.ts} (83%) create mode 100644 packages/core/src/network/transports/intermediate.test.ts rename packages/core/{tests/bigint-utils.spec.ts => src/utils/bigint-utils.test.ts} (95%) rename packages/core/{tests/buffer-utils.spec.ts => src/utils/buffer-utils.test.ts} (95%) rename packages/core/{tests/crypto-providers.spec.ts => src/utils/crypto/crypto.test-utils.ts} (85%) create mode 100644 packages/core/src/utils/crypto/factorization.test.ts rename packages/core/{tests/keys.spec.ts => src/utils/crypto/keys.test.ts} (87%) create mode 100644 packages/core/src/utils/crypto/miller-rabin.test.ts rename packages/core/{tests/mtproto-crypto.spec.ts => src/utils/crypto/mtproto.test.ts} (73%) create mode 100644 packages/core/src/utils/crypto/node.test.ts create mode 100644 packages/core/src/utils/crypto/web.test.ts rename packages/core/{tests/links/bots-links.spec.ts => src/utils/links/bots.test.ts} (98%) rename packages/core/{tests/links/chat-links.spec.ts => src/utils/links/chat.test.ts} (97%) rename packages/core/{tests/links/misc-links.spec.ts => src/utils/links/misc.test.ts} (98%) rename packages/core/{tests/links/proxy-links.spec.ts => src/utils/links/proxy.test.ts} (95%) rename packages/core/{tests/links/user-links.spec.ts => src/utils/links/user.test.ts} (96%) rename packages/core/{tests/lru-map.spec.ts => src/utils/lru-map.test.ts} (92%) rename packages/core/{tests/lru-set.spec.ts => src/utils/lru-set.test.ts} (96%) delete mode 100644 packages/core/tests/fuzz/fuzz-packet.spec.ts delete mode 100644 packages/core/tests/fuzz/fuzz-session.spec.ts delete mode 100644 packages/core/tests/fuzz/fuzz-transport.spec.ts delete mode 100644 packages/core/tests/fuzz/utils.ts delete mode 100644 packages/core/tests/miller-rabin.spec.ts delete mode 100644 packages/core/tests/prime-factorization.spec.ts delete mode 100644 packages/core/tests/transport-codecs/intermediate-codec.spec.ts delete mode 100644 packages/core/tests/tsconfig.json create mode 100644 packages/crypto-node/src/node-native-crypto.test.ts delete mode 100644 packages/crypto-node/tests/node-native-crypto.spec.ts delete mode 100644 packages/crypto-node/tests/tsconfig.json rename packages/dispatcher/tests/{dispatcher.spec.ts => dispatcher.test.ts} (99%) rename packages/file-id/{tests/parse.spec.ts => src/parse.test.ts} (97%) rename packages/file-id/{tests/serialize-unique.spec.ts => src/serialize-unique.test.ts} (89%) rename packages/file-id/{tests/utils.spec.ts => src/utils.test.ts} (91%) delete mode 100644 packages/file-id/tests/tsconfig.json rename packages/html-parser/{tests/html-parser.spec.ts => src/html-parser.test.ts} (99%) rename packages/i18n/tests/{i18n.spec.ts => i18n.test.ts} (91%) rename packages/markdown-parser/{tests/markdown-parser.spec.ts => src/markdown-parser.test.ts} (99%) delete mode 100644 packages/markdown-parser/tests/tsconfig.json rename packages/test/{tests/client.spec.ts => src/client.test.ts} (80%) rename packages/test/{tests/storage.spec.ts => src/storage.test.ts} (83%) rename packages/test/{tests/stub.spec.ts => src/stub.test.ts} (72%) rename packages/test/{tests/transport.spec.ts => src/transport.test.ts} (70%) rename packages/tl-runtime/{tests/encodings/base64.spec.ts => src/encodings/base64.test.ts} (67%) rename packages/tl-runtime/{tests/encodings/hex.spec.ts => src/encodings/hex.test.ts} (56%) rename packages/tl-runtime/{tests/encodings/utf8.spec.ts => src/encodings/utf8.test.ts} (65%) rename packages/tl-runtime/{tests/binary-reader.spec.ts => src/reader.test.ts} (72%) rename packages/tl-runtime/{tests/binary-writer.spec.ts => src/writer.test.ts} (70%) delete mode 100644 packages/tl-runtime/tests/tsconfig.json rename packages/tl-utils/{tests/calculator.spec.ts => src/calculator.test.ts} (89%) rename packages/tl-utils/{tests/codegen/reader.spec.ts => src/codegen/reader.test.ts} (95%) rename packages/tl-utils/{tests/codegen/types.spec.ts => src/codegen/types.test.ts} (95%) rename packages/tl-utils/{tests/codegen/writer.spec.ts => src/codegen/writer.test.ts} (96%) rename packages/tl-utils/{tests/ctor-id.spec.ts => src/ctor-id.test.ts} (92%) rename packages/tl-utils/{tests/diff.spec.ts => src/diff.test.ts} (97%) rename packages/tl-utils/{tests/merge.spec.ts => src/merge.test.ts} (92%) rename packages/tl-utils/{tests/parse.spec.ts => src/parse.test.ts} (96%) rename packages/tl-utils/{tests/schema.spec.ts => src/schema.test.ts} (94%) rename packages/tl-utils/{tests/stringify.spec.ts => src/stringify.test.ts} (93%) delete mode 100644 packages/tl-utils/tests/tsconfig.json rename packages/wasm/tests/{allocator.spec.ts => allocator.test.ts} (72%) rename packages/wasm/tests/{ctr.spec.ts => ctr.test.ts} (69%) rename packages/wasm/tests/{gunzip.spec.ts => gunzip.test.ts} (71%) rename packages/wasm/tests/{hash.spec.ts => hash.test.ts} (73%) rename packages/wasm/tests/{ige.spec.ts => ige.test.ts} (77%) rename packages/wasm/tests/{zlib.spec.ts => zlib.test.ts} (66%) create mode 100644 vite.config.mts diff --git a/.eslintrc.js b/.eslintrc.js index 47d33768..4869ff14 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -226,7 +226,7 @@ module.exports = { }, }, { - files: ['**/scripts/**', '*.spec.ts', 'packages/create-*/**', '**/build.config.cjs'], + files: ['**/scripts/**', '*.test.ts', 'packages/create-*/**', '**/build.config.cjs'], rules: { 'no-console': 'off', 'no-restricted-imports': 'off', diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index df9d456b..52b286b3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -34,7 +34,7 @@ jobs: run: pnpm run lint:ci - name: 'Circular dependencies' run: pnpm run lint:dpdm - - run: pnpm run test:all:ci + - run: pnpm run test e2e: runs-on: ubuntu-latest needs: test diff --git a/.mocharc.json b/.mocharc.json deleted file mode 100644 index 95448eb3..00000000 --- a/.mocharc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "node-option": ["experimental-specifier-resolution=node", "loader=ts-node/esm"] -} diff --git a/package.json b/package.json index fefca0b1..1eaf4238 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,9 @@ "scripts": { "prepare": "husky install", "postinstall": "node scripts/validate-deps-versions.mjs", - "test:all": "pnpm run -r --parallel test", - "test:all:ci": "pnpm run -r test", + "test": "vitest run && pnpm run -r test", + "test:dev": "vitest watch", + "test:coverage": "vitest run --coverage", "lint": "eslint .", "lint:ci": "NODE_OPTIONS=\"--max_old_space_size=8192\" eslint --config .eslintrc.ci.js .", "lint:tsc": "pnpm -r --parallel exec tsc --build", @@ -27,15 +28,11 @@ "devDependencies": { "@commitlint/cli": "^17.6.5", "@commitlint/config-conventional": "^17.6.5", - "@types/chai": "4.3.5", - "@types/chai-spies": "^1.0.4", - "@types/mocha": "10.0.1", "@types/node-forge": "1.3.2", "@types/ws": "8.5.4", "@typescript-eslint/eslint-plugin": "6.4.0", "@typescript-eslint/parser": "6.4.0", - "chai": "4.3.7", - "chai-spies": "^1.0.0", + "@vitest/coverage-v8": "^0.34.6", "dotenv-flow": "3.2.0", "dpdm": "^3.14.0", "eslint": "8.47.0", @@ -47,15 +44,15 @@ "glob": "10.2.6", "husky": "^8.0.3", "lint-staged": "^13.2.2", - "mocha": "10.2.0", "node-forge": "1.3.1", - "nyc": "15.1.0", "prettier": "3.0.3", "rimraf": "5.0.1", "semver": "7.5.1", "ts-node": "10.9.1", "tsconfig-paths": "^4.2.0", "typedoc": "0.25.3", - "typescript": "5.0.4" + "typescript": "5.0.4", + "vite": "^4.5.0", + "vitest": "^0.34.6" } } diff --git a/packages/client/package.json b/packages/client/package.json index 5da86d74..e28e74a5 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -8,8 +8,6 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", - "docs": "typedoc", "build": "pnpm run -w build-package client", "gen-client": "node ./scripts/generate-client.cjs", "gen-updates": "node ./scripts/generate-updates.cjs" diff --git a/packages/client/tests/buffer-utils.spec.ts b/packages/client/src/utils/file-utils.test.ts similarity index 73% rename from packages/client/tests/buffer-utils.spec.ts rename to packages/client/src/utils/file-utils.test.ts index 24e1bfd4..ba88bfb0 100644 --- a/packages/client/tests/buffer-utils.spec.ts +++ b/packages/client/src/utils/file-utils.test.ts @@ -1,19 +1,22 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { hexDecodeToBuffer, utf8EncodeToBuffer } from '@mtcute/core/utils.js' -import { isProbablyPlainText } from '../src/utils/file-utils.js' +import { isProbablyPlainText } from './file-utils.js' describe('isProbablyPlainText', () => { it('should return true for buffers only containing printable ascii', () => { expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text'))).to.be.true expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text\nwith unix new lines'))).to.be.true - expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text\r\nwith windows new lines'))).to.be.true - expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text\n\twith unix new lines and tabs'))).to.be + expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text\r\nwith windows new lines'))).to.be .true - expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text\r\n\twith windows new lines and tabs'))) + expect(isProbablyPlainText(utf8EncodeToBuffer('hello this is some ascii text\n\twith unix new lines and tabs'))) .to.be.true + expect( + isProbablyPlainText( + utf8EncodeToBuffer('hello this is some ascii text\r\n\twith windows new lines and tabs'), + ), + ).to.be.true }) it('should return false for buffers containing some binary data', () => { diff --git a/packages/client/tests/memoize.spec.ts b/packages/client/src/utils/memoize.test.ts similarity index 92% rename from packages/client/tests/memoize.spec.ts rename to packages/client/src/utils/memoize.test.ts index 5405bb82..6629edda 100644 --- a/packages/client/tests/memoize.spec.ts +++ b/packages/client/src/utils/memoize.test.ts @@ -1,7 +1,6 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { memoizeGetters } from '../src/utils/memoize.js' +import { memoizeGetters } from './memoize.js' describe('memoizeGetters', () => { it('should memoize getters', () => { diff --git a/packages/client/tests/stream-utils.spec.ts b/packages/client/src/utils/stream-utils.test.ts similarity index 96% rename from packages/client/tests/stream-utils.spec.ts rename to packages/client/src/utils/stream-utils.test.ts index e3eb55e6..2098d644 100644 --- a/packages/client/tests/stream-utils.spec.ts +++ b/packages/client/src/utils/stream-utils.test.ts @@ -1,8 +1,7 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' import { Readable } from 'node:stream' +import { describe, expect, it } from 'vitest' -import { createChunkedReader, nodeReadableToWeb } from '../src/utils/stream-utils.js' +import { createChunkedReader, nodeReadableToWeb } from './stream-utils.js' describe('createChunkedReader', () => { it('should correctly handle chunks smaller than chunkSize', async () => { diff --git a/packages/client/tests/tsconfig.json b/packages/client/tests/tsconfig.json deleted file mode 100644 index cfa0657b..00000000 --- a/packages/client/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - ".", - ], - "references": [ - { "path": "../" }, - ] -} diff --git a/packages/core/package.json b/packages/core/package.json index 88761f0d..8d3fe741 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -8,7 +8,6 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", "build": "pnpm run -w build-package core" }, "browser": { diff --git a/packages/core/tests/auth-key.spec.ts b/packages/core/src/network/auth-key.test.ts similarity index 83% rename from packages/core/tests/auth-key.spec.ts rename to packages/core/src/network/auth-key.test.ts index 3835552e..7916a392 100644 --- a/packages/core/tests/auth-key.spec.ts +++ b/packages/core/src/network/auth-key.test.ts @@ -1,15 +1,11 @@ /* eslint-disable no-restricted-globals */ -import chai, { expect } from 'chai' -import spies from 'chai-spies' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { TlReaderMap } from '@mtcute/tl-runtime' -import { AuthKey } from '../src/network/auth-key.js' -import { NodeCryptoProvider } from '../src/utils/crypto/node.js' -import { LogManager } from '../src/utils/index.js' - -chai.use(spies) +import { NodeCryptoProvider } from '../utils/crypto/node.js' +import { LogManager } from '../utils/index.js' +import { AuthKey } from './auth-key.js' const authKey = Buffer.alloc( 2048 / 8, diff --git a/packages/core/src/network/transports/intermediate.test.ts b/packages/core/src/network/transports/intermediate.test.ts new file mode 100644 index 00000000..fc017d36 --- /dev/null +++ b/packages/core/src/network/transports/intermediate.test.ts @@ -0,0 +1,79 @@ +import { describe, expect, it } from 'vitest' + +import { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime' + +import { IntermediatePacketCodec, TransportError } from '../../index.js' + +describe('IntermediatePacketCodec', () => { + it('should return correct tag', () => { + expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee') + }) + + it('should correctly parse immediate framing', () => + new Promise((done) => { + const codec = new IntermediatePacketCodec() + codec.on('packet', (data: Uint8Array) => { + expect([...data]).eql([5, 1, 2, 3, 4]) + done() + }) + codec.feed(hexDecodeToBuffer('050000000501020304')) + })) + + it('should correctly parse incomplete framing', () => + new Promise((done) => { + const codec = new IntermediatePacketCodec() + codec.on('packet', (data: Uint8Array) => { + expect([...data]).eql([5, 1, 2, 3, 4]) + done() + }) + codec.feed(hexDecodeToBuffer('050000000501')) + codec.feed(hexDecodeToBuffer('020304')) + })) + + it('should correctly parse multiple streamed packets', () => + new Promise((done) => { + const codec = new IntermediatePacketCodec() + + let number = 0 + + codec.on('packet', (data: Uint8Array) => { + if (number === 0) { + expect([...data]).eql([5, 1, 2, 3, 4]) + number = 1 + } else { + expect([...data]).eql([3, 1, 2, 3, 1]) + done() + } + }) + codec.feed(hexDecodeToBuffer('050000000501')) + codec.feed(hexDecodeToBuffer('020304050000')) + codec.feed(hexDecodeToBuffer('000301020301')) + })) + + it('should correctly parse transport errors', () => + new Promise((done) => { + const codec = new IntermediatePacketCodec() + + codec.on('error', (err: TransportError) => { + expect(err).to.have.instanceOf(TransportError) + expect(err.code).eq(404) + done() + }) + + codec.feed(hexDecodeToBuffer('040000006cfeffff')) + })) + + it('should reset when called reset()', () => + new Promise((done) => { + const codec = new IntermediatePacketCodec() + + codec.on('packet', (data: Uint8Array) => { + expect([...data]).eql([1, 2, 3, 4, 5]) + done() + }) + + codec.feed(hexDecodeToBuffer('ff0000001234567812345678')) + codec.reset() + codec.feed(hexDecodeToBuffer('050000000102030405')) + })) +}) diff --git a/packages/core/tests/bigint-utils.spec.ts b/packages/core/src/utils/bigint-utils.test.ts similarity index 95% rename from packages/core/tests/bigint-utils.spec.ts rename to packages/core/src/utils/bigint-utils.test.ts index ac9aa46e..54dd72af 100644 --- a/packages/core/tests/bigint-utils.spec.ts +++ b/packages/core/src/utils/bigint-utils.test.ts @@ -1,9 +1,8 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { hexDecodeToBuffer } from '@mtcute/tl-runtime' -import { bigIntToBuffer, bufferToBigInt } from '../src/utils/index.js' +import { bigIntToBuffer, bufferToBigInt } from './index.js' describe('bigIntToBuffer', () => { it('should handle writing to BE', () => { diff --git a/packages/core/tests/buffer-utils.spec.ts b/packages/core/src/utils/buffer-utils.test.ts similarity index 95% rename from packages/core/tests/buffer-utils.spec.ts rename to packages/core/src/utils/buffer-utils.test.ts index 45184782..da722589 100644 --- a/packages/core/tests/buffer-utils.spec.ts +++ b/packages/core/src/utils/buffer-utils.test.ts @@ -1,10 +1,9 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { hexEncode, utf8Decode, utf8EncodeToBuffer } from '@mtcute/tl-runtime' -import { buffersEqual, bufferToReversed, cloneBuffer, concatBuffers, randomBytes } from '../src/utils/buffer-utils.js' -import { xorBuffer, xorBufferInPlace } from '../src/utils/crypto/utils.js' +import { buffersEqual, bufferToReversed, cloneBuffer, concatBuffers, randomBytes } from './buffer-utils.js' +import { xorBuffer, xorBufferInPlace } from './crypto/utils.js' describe('buffersEqual', () => { it('should return true for equal buffers', () => { diff --git a/packages/core/tests/crypto-providers.spec.ts b/packages/core/src/utils/crypto/crypto.test-utils.ts similarity index 85% rename from packages/core/tests/crypto-providers.spec.ts rename to packages/core/src/utils/crypto/crypto.test-utils.ts index 12014793..6cd5b6ce 100644 --- a/packages/core/tests/crypto-providers.spec.ts +++ b/packages/core/src/utils/crypto/crypto.test-utils.ts @@ -1,15 +1,11 @@ -import { expect } from 'chai' -import * as crypto from 'crypto' -import { describe, it } from 'mocha' +import { beforeAll, expect, it } from 'vitest' import { hexDecodeToBuffer, hexEncode, utf8EncodeToBuffer } from '@mtcute/tl-runtime' -import { NodeCryptoProvider } from '../src/utils/crypto/node.js' -import { WebCryptoProvider } from '../src/utils/crypto/web.js' -import { ICryptoProvider } from '../src/utils/index.js' +import { ICryptoProvider } from './abstract.js' export function testCryptoProvider(c: ICryptoProvider): void { - before(() => c.initialize?.()) + beforeAll(() => c.initialize?.()) it('should calculate sha1', () => { expect(hexEncode(c.sha1(utf8EncodeToBuffer('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709') @@ -98,23 +94,3 @@ export function testCryptoProvider(c: ICryptoProvider): void { ).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b') }) } - -describe('NodeCryptoProvider', () => { - if (typeof process === 'undefined') { - console.warn('Skipping NodeCryptoProvider tests') - - return - } - - testCryptoProvider(new NodeCryptoProvider()) -}) - -describe('WebCryptoProvider', () => { - if (typeof crypto.subtle === 'undefined') { - console.warn('Skipping WebCryptoProvider tests') - - return - } - - testCryptoProvider(new WebCryptoProvider({ subtle: crypto.subtle })) -}) diff --git a/packages/core/src/utils/crypto/factorization.test.ts b/packages/core/src/utils/crypto/factorization.test.ts new file mode 100644 index 00000000..665891f3 --- /dev/null +++ b/packages/core/src/utils/crypto/factorization.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from 'vitest' + +import { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime' + +import { factorizePQSync } from './factorization.js' + +describe( + 'prime factorization', + function () { + it('should decompose PQ to prime factors P and Q', () => { + const testFactorization = (pq: string, p: string, q: string) => { + const [p1, q1] = factorizePQSync(hexDecodeToBuffer(pq)) + expect(hexEncode(p1)).eq(p.toLowerCase()) + expect(hexEncode(q1)).eq(q.toLowerCase()) + } + + // from samples at https://core.telegram.org/mtproto/samples-auth_key + testFactorization('17ED48941A08F981', '494C553B', '53911073') + // random example + testFactorization('14fcab4dfc861f45', '494c5c99', '494c778d') + }) + }, + { timeout: 10000 }, +) // since PQ factorization relies on RNG, it may take a while (or may not!) diff --git a/packages/core/tests/keys.spec.ts b/packages/core/src/utils/crypto/keys.test.ts similarity index 87% rename from packages/core/tests/keys.spec.ts rename to packages/core/src/utils/crypto/keys.test.ts index 46086342..a0c9a508 100644 --- a/packages/core/tests/keys.spec.ts +++ b/packages/core/src/utils/crypto/keys.test.ts @@ -1,8 +1,7 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { NodeCryptoProvider } from '../src/utils/crypto/node.js' -import { parsePublicKey } from '../src/utils/index.js' +import { parsePublicKey } from '../index.js' +import { NodeCryptoProvider } from './node.js' const crypto = new NodeCryptoProvider() diff --git a/packages/core/src/utils/crypto/miller-rabin.test.ts b/packages/core/src/utils/crypto/miller-rabin.test.ts new file mode 100644 index 00000000..8fe73af5 --- /dev/null +++ b/packages/core/src/utils/crypto/miller-rabin.test.ts @@ -0,0 +1,139 @@ +import { describe, expect, it } from 'vitest' + +import { millerRabin } from './miller-rabin.js' + +describe( + 'miller-rabin test', + function () { + const testMillerRabin = (n: number | string | bigint, isPrime: boolean) => { + expect(millerRabin(BigInt(n))).eq(isPrime) + } + + it('should correctly label small primes as probable primes', () => { + const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] + + for (const prime of smallOddPrimes) { + testMillerRabin(prime, true) + } + }) + + it('should correctly label small odd composite numbers as composite', () => { + const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35] + + for (const prime of smallOddPrimes) { + testMillerRabin(prime, false) + } + }) + + // primes are generated using `openssl prime -generate -bits ` + + it('should work for 512-bit numbers', () => { + testMillerRabin( + '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519', + true, + ) + testMillerRabin( + '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399', + true, + ) + testMillerRabin( + '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329', + true, + ) + testMillerRabin( + '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177', + true, + ) + + // above numbers but -2 (not prime) + testMillerRabin( + '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517', + false, + ) + testMillerRabin( + '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397', + false, + ) + testMillerRabin( + '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327', + false, + ) + testMillerRabin( + '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175', + false, + ) + }) + + it('should work for 1024-bit numbers', () => { + testMillerRabin( + '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409', + true, + ) + testMillerRabin( + '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003', + true, + ) + testMillerRabin( + '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567', + true, + ) + testMillerRabin( + '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253', + true, + ) + + // above numbers but -2 (not prime) + testMillerRabin( + '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407', + false, + ) + testMillerRabin( + '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001', + false, + ) + testMillerRabin( + '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565', + false, + ) + testMillerRabin( + '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251', + false, + ) + }) + + it('should work for 2048-bit numbers', () => { + testMillerRabin( + '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367', + true, + ) + testMillerRabin( + '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743', + true, + ) + testMillerRabin( + '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779', + true, + ) + + // above numbers but -2 (not prime) + testMillerRabin( + '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365', + false, + ) + testMillerRabin( + '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741', + false, + ) + testMillerRabin( + '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777', + false, + ) + + // dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines + const telegramDhPrime = + 'C7 1C AE B9 C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E 0A C9 25 13 95 43 AE D4 4C CE 7C 37 20 FD 51 F6 94 58 70 5A C6 8C D4 FE 6B 6B 13 AB DC 97 46 51 29 69 32 84 54 F1 8F AF 8C 59 5F 64 24 77 FE 96 BB 2A 94 1D 5B CD 1D 4A C8 CC 49 88 07 08 FA 9B 37 8E 3C 4F 3A 90 60 BE E6 7C F9 A4 A4 A6 95 81 10 51 90 7E 16 27 53 B5 6B 0F 6B 41 0D BA 74 D8 A8 4B 2A 14 B3 14 4E 0E F1 28 47 54 FD 17 ED 95 0D 59 65 B4 B9 DD 46 58 2D B1 17 8D 16 9C 6B C4 65 B0 D6 FF 9C A3 92 8F EF 5B 9A E4 E4 18 FC 15 E8 3E BE A0 F8 7F A9 FF 5E ED 70 05 0D ED 28 49 F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B' + testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true) + }) + }, + { timeout: 10000 }, +) // since miller-rabin factorization relies on RNG, it may take a while (or may not!) diff --git a/packages/core/tests/mtproto-crypto.spec.ts b/packages/core/src/utils/crypto/mtproto.test.ts similarity index 73% rename from packages/core/tests/mtproto-crypto.spec.ts rename to packages/core/src/utils/crypto/mtproto.test.ts index ac1c1422..667fcff3 100644 --- a/packages/core/tests/mtproto-crypto.spec.ts +++ b/packages/core/src/utils/crypto/mtproto.test.ts @@ -1,17 +1,8 @@ -/* eslint-disable no-restricted-globals,@typescript-eslint/no-unsafe-assignment */ -// for whatever reason eslint doesn't properly handle chai-spies typings -import chai, { expect } from 'chai' -import spies from 'chai-spies' -import { describe, it } from 'mocha' +/* eslint-disable no-restricted-globals */ +import { describe, expect, it, vi } from 'vitest' -import { - createAesIgeForMessage, - createAesIgeForMessageOld, - generateKeyAndIvFromNonce, -} from '../src/utils/crypto/mtproto.js' -import { NodeCryptoProvider } from '../src/utils/crypto/node.js' - -chai.use(spies) +import { createAesIgeForMessage, createAesIgeForMessageOld, generateKeyAndIvFromNonce } from './mtproto.js' +import { NodeCryptoProvider } from './node.js' const authKey = Buffer.alloc( 2048 / 8, @@ -22,11 +13,11 @@ const messageKey = Buffer.from('25d701f2a29205526757825a99eb2d32') describe('mtproto 2.0', () => { it('should correctly derive message key and iv for client', () => { const crypto = new NodeCryptoProvider() - const spy = chai.spy.on(crypto, 'createAesIge') + const spy = vi.spyOn(crypto, 'createAesIge') createAesIgeForMessage(crypto, authKey, messageKey, true) - expect(spy).to.have.been.called.with.exactly( + expect(spy).toHaveBeenCalledWith( Buffer.from('7acac59ab48cd370e478daf6c64545ab9f32d5c9197f25febe052110f61875ca', 'hex'), Buffer.from('2746ccc19fc260c08f3d2696389f415392103dbcc3a8bf69da9394c3c3d95bd3', 'hex'), ) @@ -34,11 +25,11 @@ describe('mtproto 2.0', () => { it('should correctly derive message key and iv for server', () => { const crypto = new NodeCryptoProvider() - const spy = chai.spy.on(crypto, 'createAesIge') + const spy = vi.spyOn(crypto, 'createAesIge') createAesIgeForMessage(crypto, authKey, messageKey, false) - expect(spy).to.have.been.called.with.exactly( + expect(spy).toHaveBeenCalledWith( Buffer.from('c7cf179e7ebab144ba87de05415db4157d2fc66df4790b2fd405a6c8cbe4c0b3', 'hex'), Buffer.from('0916a7bd9880eacd4eeb868577a4c6a50e76fca4ac5c1bcfbafe3b9f76ccd806', 'hex'), ) @@ -48,11 +39,11 @@ describe('mtproto 2.0', () => { describe('mtproto 1.0', () => { it('should correctly derive message key and iv for client', () => { const crypto = new NodeCryptoProvider() - const spy = chai.spy.on(crypto, 'createAesIge') + const spy = vi.spyOn(crypto, 'createAesIge') createAesIgeForMessageOld(crypto, authKey, messageKey, true) - expect(spy).to.have.been.called.with.exactly( + expect(spy).toHaveBeenCalledWith( Buffer.from('aad61cb5b7be5e8435174d74665f8a978e85806d0970ad4958642ca49e3c8834', 'hex'), Buffer.from('4065736fe6586e94aad9f024062f1b9988e8a44e2aff4e11aad61cb5b7be5e84', 'hex'), ) @@ -60,11 +51,11 @@ describe('mtproto 1.0', () => { it('should correctly derive message key and iv for server', () => { const crypto = new NodeCryptoProvider() - const spy = chai.spy.on(crypto, 'createAesIge') + const spy = vi.spyOn(crypto, 'createAesIge') createAesIgeForMessageOld(crypto, authKey, messageKey, false) - expect(spy).to.have.been.called.with.exactly( + expect(spy).toHaveBeenCalledWith( Buffer.from('d57682a17105e43b92bc5025ea80e88ef708240fc19450dfe072a8760f9534da', 'hex'), Buffer.from('07addff7beeb7705ef3a9d5090bd73c992d57291bb8a7079d57682a17105e43b', 'hex'), ) diff --git a/packages/core/src/utils/crypto/node.test.ts b/packages/core/src/utils/crypto/node.test.ts new file mode 100644 index 00000000..00fff13f --- /dev/null +++ b/packages/core/src/utils/crypto/node.test.ts @@ -0,0 +1,14 @@ +import { describe } from 'vitest' + +import { testCryptoProvider } from './crypto.test-utils.js' +import { NodeCryptoProvider } from './node.js' + +describe('NodeCryptoProvider', () => { + if (typeof process === 'undefined') { + console.warn('Skipping NodeCryptoProvider tests') + + return + } + + testCryptoProvider(new NodeCryptoProvider()) +}) diff --git a/packages/core/src/utils/crypto/web.test.ts b/packages/core/src/utils/crypto/web.test.ts new file mode 100644 index 00000000..438a51b2 --- /dev/null +++ b/packages/core/src/utils/crypto/web.test.ts @@ -0,0 +1,20 @@ +import { describe } from 'vitest' + +import { testCryptoProvider } from './crypto.test-utils.js' +import { WebCryptoProvider } from './web.js' + +describe('WebCryptoProvider', async () => { + let subtle = globalThis.crypto?.subtle + + if (!subtle && typeof process !== 'undefined') { + subtle = await import('crypto').then((m) => m.subtle) + } + + if (!subtle) { + console.warn('Skipping WebCryptoProvider tests (no crypto.subtle)') + + return + } + + testCryptoProvider(new WebCryptoProvider({ subtle })) +}) diff --git a/packages/core/tests/links/bots-links.spec.ts b/packages/core/src/utils/links/bots.test.ts similarity index 98% rename from packages/core/tests/links/bots-links.spec.ts rename to packages/core/src/utils/links/bots.test.ts index 334d5d04..9115eeb5 100644 --- a/packages/core/tests/links/bots-links.spec.ts +++ b/packages/core/src/utils/links/bots.test.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { links } from '../../src/utils/links/index.js' +import { links } from './index.js' describe('Deep links', function () { describe('Bot start links', () => { diff --git a/packages/core/tests/links/chat-links.spec.ts b/packages/core/src/utils/links/chat.test.ts similarity index 97% rename from packages/core/tests/links/chat-links.spec.ts rename to packages/core/src/utils/links/chat.test.ts index 91303ed5..1dea1a09 100644 --- a/packages/core/tests/links/chat-links.spec.ts +++ b/packages/core/src/utils/links/chat.test.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { links } from '../../src/utils/links/index.js' +import { links } from './index.js' describe('Deep links', function () { describe('Chat invite links', () => { diff --git a/packages/core/tests/links/misc-links.spec.ts b/packages/core/src/utils/links/misc.test.ts similarity index 98% rename from packages/core/tests/links/misc-links.spec.ts rename to packages/core/src/utils/links/misc.test.ts index e762021d..7788c3b8 100644 --- a/packages/core/tests/links/misc-links.spec.ts +++ b/packages/core/src/utils/links/misc.test.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { links } from '../../src/utils/links/index.js' +import { links } from './index.js' describe('Deep links', function () { describe('Video chat links', () => { diff --git a/packages/core/tests/links/proxy-links.spec.ts b/packages/core/src/utils/links/proxy.test.ts similarity index 95% rename from packages/core/tests/links/proxy-links.spec.ts rename to packages/core/src/utils/links/proxy.test.ts index 73fb2db2..8e1de46b 100644 --- a/packages/core/tests/links/proxy-links.spec.ts +++ b/packages/core/src/utils/links/proxy.test.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { links } from '../../src/utils/links/index.js' +import { links } from './index.js' describe('Deep links', function () { describe('MTProxy links', () => { diff --git a/packages/core/tests/links/user-links.spec.ts b/packages/core/src/utils/links/user.test.ts similarity index 96% rename from packages/core/tests/links/user-links.spec.ts rename to packages/core/src/utils/links/user.test.ts index 12f72cd1..14014416 100644 --- a/packages/core/tests/links/user-links.spec.ts +++ b/packages/core/src/utils/links/user.test.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { links } from '../../src/utils/links/index.js' +import { links } from './index.js' describe('Deep links', function () { describe('Public username links', () => { diff --git a/packages/core/tests/lru-map.spec.ts b/packages/core/src/utils/lru-map.test.ts similarity index 92% rename from packages/core/tests/lru-map.spec.ts rename to packages/core/src/utils/lru-map.test.ts index d32f0cb5..778cfddd 100644 --- a/packages/core/tests/lru-map.spec.ts +++ b/packages/core/src/utils/lru-map.test.ts @@ -1,7 +1,6 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { LruMap } from '../utils.js' +import { LruMap } from './lru-map.js' describe('LruMap', () => { it('Map backend', () => { diff --git a/packages/core/tests/lru-set.spec.ts b/packages/core/src/utils/lru-set.test.ts similarity index 96% rename from packages/core/tests/lru-set.spec.ts rename to packages/core/src/utils/lru-set.test.ts index 36919b2a..23d05490 100644 --- a/packages/core/tests/lru-set.spec.ts +++ b/packages/core/src/utils/lru-set.test.ts @@ -1,8 +1,7 @@ -import { expect } from 'chai' import Long from 'long' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { LruSet } from '../utils.js' +import { LruSet } from './lru-set.js' describe('LruSet', () => { describe('for strings', () => { diff --git a/packages/core/tests/fuzz/fuzz-packet.spec.ts b/packages/core/tests/fuzz/fuzz-packet.spec.ts deleted file mode 100644 index 16f19994..00000000 --- a/packages/core/tests/fuzz/fuzz-packet.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -// import { expect } from 'chai' -// import { randomBytes } from 'crypto' -// import { describe, it } from 'mocha' -// -// import __tlReaderMap from '@mtcute/tl/binary/reader' -// import { TlBinaryReader } from '@mtcute/tl-runtime' -// -// import { createTestTelegramClient } from './utils.js' -// -// // eslint-disable-next-line @typescript-eslint/no-var-requires -// require('dotenv-flow').config() -// -// describe('fuzz : packet', async function () { -// this.timeout(45000) -// -// it('random packet', async () => { -// const client = createTestTelegramClient() -// -// await client.connect() -// await client.waitUntilUsable() -// -// let errors = 0 -// -// const conn = client.primaryConnection -// // eslint-disable-next-line dot-notation -// const mtproto = conn['_session'] -// -// for (let i = 0; i < 100; i++) { -// const payload = randomBytes(Math.round(Math.random() * 16) * 16) -// -// try { -// // eslint-disable-next-line dot-notation -// conn['_handleRawMessage']( -// mtproto.getMessageId().sub(1), -// 0, -// new TlBinaryReader(__tlReaderMap, payload), -// ) -// } catch (e) { -// errors += 1 -// } -// } -// -// // similar test, but this time only using object ids that do exist -// const objectIds = Object.keys(__tlReaderMap) -// -// for (let i = 0; i < 100; i++) { -// const payload = randomBytes( -// (Math.round(Math.random() * 16) + 1) * 16, -// ) -// const objectId = parseInt( -// objectIds[Math.round(Math.random() * objectIds.length)], -// ) -// payload.writeUInt32LE(objectId, 0) -// -// try { -// // eslint-disable-next-line dot-notation -// conn['_handleRawMessage']( -// mtproto.getMessageId().sub(1), -// 0, -// new TlBinaryReader(__tlReaderMap, payload), -// ) -// } catch (e) { -// errors += 1 -// } -// } -// -// await client.close() -// -// expect(errors).gt(0) -// }) -// }) diff --git a/packages/core/tests/fuzz/fuzz-session.spec.ts b/packages/core/tests/fuzz/fuzz-session.spec.ts deleted file mode 100644 index 7ed48f98..00000000 --- a/packages/core/tests/fuzz/fuzz-session.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -// import { expect } from 'chai' -// import { randomBytes } from 'crypto' -// import { describe, it } from 'mocha' -// -// import { sleep } from '../../src.js' -// import { createTestTelegramClient } from './utils.js' -// -// // eslint-disable-next-line @typescript-eslint/no-var-requires -// require('dotenv-flow').config() -// -// describe('fuzz : session', async function () { -// this.timeout(45000) -// -// it('random auth_key', async () => { -// const client = createTestTelegramClient() -// -// // random key -// const initKey = randomBytes(256) -// await client.storage.setAuthKeyFor(2, initKey) -// -// // client is supposed to handle this and generate a new key -// -// const errors: Error[] = [] -// -// const errorHandler = (err: Error) => { -// errors.push(err) -// } -// -// client.onError(errorHandler) -// -// await client.connect() -// -// await sleep(10000) -// -// await client.close() -// -// expect(errors.length).eq(0) -// -// expect((await client.storage.getAuthKeyFor(2))?.toString('hex')).not.eq( -// initKey.toString('hex'), -// ) -// }) -// -// it('random auth_key for other dc', async () => { -// const client = createTestTelegramClient() -// -// // random key for dc1 -// const initKey = randomBytes(256) -// await client.storage.setAuthKeyFor(1, initKey) -// -// // client is supposed to handle this and generate a new key -// -// const errors: Error[] = [] -// -// const errorHandler = (err: Error) => { -// errors.push(err) -// } -// -// client.onError(errorHandler) -// -// await client.connect() -// await client.waitUntilUsable() -// -// const conn = await client.createAdditionalConnection(1) -// await conn.sendRpc({ _: 'help.getConfig' }) -// -// await sleep(10000) -// -// await client.close() -// -// expect(errors.length).eq(0) -// -// expect((await client.storage.getAuthKeyFor(1))?.toString('hex')).not.eq( -// initKey.toString('hex'), -// ) -// }) -// }) diff --git a/packages/core/tests/fuzz/fuzz-transport.spec.ts b/packages/core/tests/fuzz/fuzz-transport.spec.ts deleted file mode 100644 index b12e7362..00000000 --- a/packages/core/tests/fuzz/fuzz-transport.spec.ts +++ /dev/null @@ -1,127 +0,0 @@ -// import { expect } from 'chai' -// import { randomBytes } from 'crypto' -// import { EventEmitter } from 'events' -// import { describe, it } from 'mocha' -// -// import { -// BaseTelegramClient, -// defaultDcs, -// ITelegramTransport, -// NodeCryptoProvider, -// sleep, -// tl, -// TransportState, -// } from '../../src.js' -// -// // eslint-disable-next-line @typescript-eslint/no-var-requires -// require('dotenv-flow').config() -// -// class RandomBytesTransport extends EventEmitter implements ITelegramTransport { -// dc: tl.RawDcOption -// interval?: NodeJS.Timeout -// -// close(): void { -// clearInterval(this.interval) -// this.emit('close') -// this.interval = undefined -// } -// -// connect(dc: tl.RawDcOption): void { -// this.dc = dc -// -// setTimeout(() => this.emit('ready'), 0) -// -// this.interval = setInterval(() => { -// this.emit('message', randomBytes(64)) -// }, 100) -// } -// -// currentDc(): tl.RawDcOption | null { -// return this.dc -// } -// -// send(_data: Buffer): Promise { -// return Promise.resolve() -// } -// -// state(): TransportState { -// return this.interval ? TransportState.Ready : TransportState.Idle -// } -// } -// -// describe('fuzz : transport', function () { -// this.timeout(30000) -// -// it('RandomBytesTransport (no auth)', async () => { -// const client = new BaseTelegramClient({ -// crypto: () => new NodeCryptoProvider(), -// transport: () => new RandomBytesTransport(), -// apiId: 0, -// apiHash: '', -// defaultDc: defaultDcs.defaultTestDc, -// }) -// client.log.level = 0 -// -// const errors: Error[] = [] -// -// client.onError((err) => { -// errors.push(err) -// }) -// -// await client.connect() -// await sleep(15000) -// await client.close() -// -// expect(errors.length).gt(0) -// errors.forEach((err) => { -// expect(err.message).match(/unknown object id/i) -// }) -// }) -// -// it('RandomBytesTransport (with auth)', async () => { -// const client = new BaseTelegramClient({ -// crypto: () => new NodeCryptoProvider(), -// transport: () => new RandomBytesTransport(), -// apiId: 0, -// apiHash: '', -// defaultDc: defaultDcs.defaultTestDc, -// }) -// client.log.level = 0 -// -// // random key just to make it think it already has one -// await client.storage.setAuthKeyFor(2, randomBytes(256)) -// -// // in this case, there will be no actual errors, only -// // warnings like 'received message with unknown authKey' -// // -// // to test for that, we hook into `decryptMessage` and make -// // sure that it returns `null` -// -// await client.connect() -// -// let hadNonNull = false -// -// const decryptMessage = -// // eslint-disable-next-line dot-notation -// client.primaryConnection['_session'].decryptMessage -// -// // ехал any через any -// // видит any - any, any -// // сунул any any в any -// // any any any any -// // eslint-disable-next-line dot-notation -// ;(client.primaryConnection['_session'] as any).decryptMessage = ( -// buf: any, -// cb: any, -// ) => -// decryptMessage.call(this, buf, (...args: any[]) => { -// cb(...(args as any)) -// hadNonNull = true -// }) -// -// await sleep(15000) -// await client.close() -// -// expect(hadNonNull).false -// }) -// }) diff --git a/packages/core/tests/fuzz/utils.ts b/packages/core/tests/fuzz/utils.ts deleted file mode 100644 index f2621ff8..00000000 --- a/packages/core/tests/fuzz/utils.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import { BaseTelegramClient, TcpTransport } from '../../src.js' -// import { NodeCryptoProvider } from '../../utils.js' - -// export function createTestTelegramClient() { -// const tg = new BaseTelegramClient({ -// // provided explicitly because mocha -// crypto: () => new NodeCryptoProvider(), -// transport: () => new TcpTransport(), -// // example values from tdlib -// apiId: 94575, -// apiHash: 'a3406de8d171bb422bb6ddf3bbd800e2', -// testMode: true, -// }) -// tg.log.level = 0 - -// return tg -// } diff --git a/packages/core/tests/miller-rabin.spec.ts b/packages/core/tests/miller-rabin.spec.ts deleted file mode 100644 index 1fc63e8a..00000000 --- a/packages/core/tests/miller-rabin.spec.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' - -import { millerRabin } from '../src/utils/crypto/miller-rabin.js' - -describe('miller-rabin test', function () { - this.timeout(10000) // since miller-rabin factorization relies on RNG, it may take a while (or may not!) - - const testMillerRabin = (n: number | string | bigint, isPrime: boolean) => { - expect(millerRabin(BigInt(n))).eq(isPrime) - } - - it('should correctly label small primes as probable primes', () => { - const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] - - for (const prime of smallOddPrimes) { - testMillerRabin(prime, true) - } - }) - - it('should correctly label small odd composite numbers as composite', () => { - const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35] - - for (const prime of smallOddPrimes) { - testMillerRabin(prime, false) - } - }) - - // primes are generated using `openssl prime -generate -bits ` - - it('should work for 512-bit numbers', () => { - testMillerRabin( - '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519', - true, - ) - testMillerRabin( - '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399', - true, - ) - testMillerRabin( - '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329', - true, - ) - testMillerRabin( - '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177', - true, - ) - - // above numbers but -2 (not prime) - testMillerRabin( - '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517', - false, - ) - testMillerRabin( - '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397', - false, - ) - testMillerRabin( - '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327', - false, - ) - testMillerRabin( - '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175', - false, - ) - }) - - it('should work for 1024-bit numbers', () => { - testMillerRabin( - '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409', - true, - ) - testMillerRabin( - '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003', - true, - ) - testMillerRabin( - '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567', - true, - ) - testMillerRabin( - '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253', - true, - ) - - // above numbers but -2 (not prime) - testMillerRabin( - '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407', - false, - ) - testMillerRabin( - '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001', - false, - ) - testMillerRabin( - '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565', - false, - ) - testMillerRabin( - '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251', - false, - ) - }) - - it('should work for 2048-bit numbers', () => { - testMillerRabin( - '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367', - true, - ) - testMillerRabin( - '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743', - true, - ) - testMillerRabin( - '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779', - true, - ) - - // above numbers but -2 (not prime) - testMillerRabin( - '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365', - false, - ) - testMillerRabin( - '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741', - false, - ) - testMillerRabin( - '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777', - false, - ) - - // dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines - const telegramDhPrime = - 'C7 1C AE B9 C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E 0A C9 25 13 95 43 AE D4 4C CE 7C 37 20 FD 51 F6 94 58 70 5A C6 8C D4 FE 6B 6B 13 AB DC 97 46 51 29 69 32 84 54 F1 8F AF 8C 59 5F 64 24 77 FE 96 BB 2A 94 1D 5B CD 1D 4A C8 CC 49 88 07 08 FA 9B 37 8E 3C 4F 3A 90 60 BE E6 7C F9 A4 A4 A6 95 81 10 51 90 7E 16 27 53 B5 6B 0F 6B 41 0D BA 74 D8 A8 4B 2A 14 B3 14 4E 0E F1 28 47 54 FD 17 ED 95 0D 59 65 B4 B9 DD 46 58 2D B1 17 8D 16 9C 6B C4 65 B0 D6 FF 9C A3 92 8F EF 5B 9A E4 E4 18 FC 15 E8 3E BE A0 F8 7F A9 FF 5E ED 70 05 0D ED 28 49 F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B' - testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true) - }) -}) diff --git a/packages/core/tests/prime-factorization.spec.ts b/packages/core/tests/prime-factorization.spec.ts deleted file mode 100644 index b5212c2f..00000000 --- a/packages/core/tests/prime-factorization.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' - -import { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime' - -import { factorizePQSync } from '../src/utils/crypto/factorization.js' - -describe('prime factorization', function () { - this.timeout(10000) // since PQ factorization relies on RNG, it may take a while (or may not!) - - it('should decompose PQ to prime factors P and Q', () => { - const testFactorization = (pq: string, p: string, q: string) => { - const [p1, q1] = factorizePQSync(hexDecodeToBuffer(pq)) - expect(hexEncode(p1)).eq(p.toLowerCase()) - expect(hexEncode(q1)).eq(q.toLowerCase()) - } - - // from samples at https://core.telegram.org/mtproto/samples-auth_key - testFactorization('17ED48941A08F981', '494C553B', '53911073') - // random example - testFactorization('14fcab4dfc861f45', '494c5c99', '494c778d') - }) -}) diff --git a/packages/core/tests/transport-codecs/intermediate-codec.spec.ts b/packages/core/tests/transport-codecs/intermediate-codec.spec.ts deleted file mode 100644 index d9807294..00000000 --- a/packages/core/tests/transport-codecs/intermediate-codec.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' - -import { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime' - -import { IntermediatePacketCodec, TransportError } from '../../src/index.js' - -describe('IntermediatePacketCodec', () => { - it('should return correct tag', () => { - expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee') - }) - - it('should correctly parse immediate framing', (done) => { - const codec = new IntermediatePacketCodec() - codec.on('packet', (data: Uint8Array) => { - expect([...data]).eql([5, 1, 2, 3, 4]) - done() - }) - codec.feed(hexDecodeToBuffer('050000000501020304')) - }) - - it('should correctly parse incomplete framing', (done) => { - const codec = new IntermediatePacketCodec() - codec.on('packet', (data: Uint8Array) => { - expect([...data]).eql([5, 1, 2, 3, 4]) - done() - }) - codec.feed(hexDecodeToBuffer('050000000501')) - codec.feed(hexDecodeToBuffer('020304')) - }) - - it('should correctly parse multiple streamed packets', (done) => { - const codec = new IntermediatePacketCodec() - - let number = 0 - - codec.on('packet', (data: Uint8Array) => { - if (number === 0) { - expect([...data]).eql([5, 1, 2, 3, 4]) - number = 1 - } else { - expect([...data]).eql([3, 1, 2, 3, 1]) - done() - } - }) - codec.feed(hexDecodeToBuffer('050000000501')) - codec.feed(hexDecodeToBuffer('020304050000')) - codec.feed(hexDecodeToBuffer('000301020301')) - }) - - it('should correctly parse transport errors', (done) => { - const codec = new IntermediatePacketCodec() - - codec.on('error', (err: TransportError) => { - expect(err).to.have.instanceOf(TransportError) - expect(err.code).eq(404) - done() - }) - - codec.feed(hexDecodeToBuffer('040000006cfeffff')) - }) - - it('should reset when called reset()', (done) => { - const codec = new IntermediatePacketCodec() - - codec.on('packet', (data: Uint8Array) => { - expect([...data]).eql([1, 2, 3, 4, 5]) - done() - }) - - codec.feed(hexDecodeToBuffer('ff0000001234567812345678')) - codec.reset() - codec.feed(hexDecodeToBuffer('050000000102030405')) - }) -}) diff --git a/packages/core/tests/tsconfig.json b/packages/core/tests/tsconfig.json deleted file mode 100644 index cfa0657b..00000000 --- a/packages/core/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - ".", - ], - "references": [ - { "path": "../" }, - ] -} diff --git a/packages/crypto-node/package.json b/packages/crypto-node/package.json index 9e90b091..0eba6010 100644 --- a/packages/crypto-node/package.json +++ b/packages/crypto-node/package.json @@ -14,9 +14,7 @@ "install": "node-gyp configure && node-gyp -j 16 build", "rebuild:dev": "node-gyp configure --debug && node-gyp -j 16 rebuild --debug", "rebuild": "node-gyp configure && node-gyp -j 16 rebuild", - "clean": "node-gyp clean", - "test": "mocha \"tests/**/*.spec.ts\"", - "docs": "typedoc" + "clean": "node-gyp clean" }, "keepScripts": [ "install" diff --git a/packages/crypto-node/src/node-native-crypto.test.ts b/packages/crypto-node/src/node-native-crypto.test.ts new file mode 100644 index 00000000..58d4923a --- /dev/null +++ b/packages/crypto-node/src/node-native-crypto.test.ts @@ -0,0 +1,9 @@ +import { describe } from 'vitest' + +// eslint-disable-next-line import/no-relative-packages +import { testCryptoProvider } from '../../core/src/utils/crypto/crypto.test-utils.js' +import { NodeNativeCryptoProvider } from './index.js' + +describe('NodeNativeCryptoProvider', () => { + testCryptoProvider(new NodeNativeCryptoProvider()) +}) diff --git a/packages/crypto-node/tests/node-native-crypto.spec.ts b/packages/crypto-node/tests/node-native-crypto.spec.ts deleted file mode 100644 index a38e9061..00000000 --- a/packages/crypto-node/tests/node-native-crypto.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { describe } from 'mocha' - -// eslint-disable-next-line import/no-relative-packages -import { testCryptoProvider } from '../../core/tests/crypto-providers.spec.js' -import { NodeNativeCryptoProvider } from '../src/index.js' - -describe('NodeNativeCryptoProvider', () => { - testCryptoProvider(new NodeNativeCryptoProvider()) -}) diff --git a/packages/crypto-node/tests/tsconfig.json b/packages/crypto-node/tests/tsconfig.json deleted file mode 100644 index cfa0657b..00000000 --- a/packages/crypto-node/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - ".", - ], - "references": [ - { "path": "../" }, - ] -} diff --git a/packages/dispatcher/package.json b/packages/dispatcher/package.json index 8e65dc83..841d4658 100644 --- a/packages/dispatcher/package.json +++ b/packages/dispatcher/package.json @@ -16,8 +16,6 @@ } }, "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", - "docs": "typedoc", "build": "pnpm run -w build-package dispatcher", "gen-updates": "node ./scripts/generate.cjs" }, diff --git a/packages/dispatcher/tests/dispatcher.spec.ts b/packages/dispatcher/tests/dispatcher.test.ts similarity index 99% rename from packages/dispatcher/tests/dispatcher.spec.ts rename to packages/dispatcher/tests/dispatcher.test.ts index 30c314f0..269cf6b0 100644 --- a/packages/dispatcher/tests/dispatcher.spec.ts +++ b/packages/dispatcher/tests/dispatcher.test.ts @@ -1,5 +1,4 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { PeersIndex, TelegramClient } from '@mtcute/client' diff --git a/packages/file-id/package.json b/packages/file-id/package.json index 39831180..0b9a1216 100644 --- a/packages/file-id/package.json +++ b/packages/file-id/package.json @@ -8,8 +8,6 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", - "docs": "typedoc", "build": "pnpm run -w build-package file-id" }, "distOnlyFields": { diff --git a/packages/file-id/tests/parse.spec.ts b/packages/file-id/src/parse.test.ts similarity index 97% rename from packages/file-id/tests/parse.spec.ts rename to packages/file-id/src/parse.test.ts index 1f2a5bd7..a1ea0433 100644 --- a/packages/file-id/tests/parse.spec.ts +++ b/packages/file-id/src/parse.test.ts @@ -1,11 +1,10 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { Long } from '@mtcute/core' import { hexDecodeToBuffer } from '@mtcute/core/utils.js' -import { parseFileId } from '../src/index.js' -import { tdFileId as td } from '../src/types.js' +import { parseFileId } from './parse.js' +import { tdFileId as td } from './types.js' // test file IDs are partially taken from https://github.com/luckydonald/telegram_file_id diff --git a/packages/file-id/tests/serialize-unique.spec.ts b/packages/file-id/src/serialize-unique.test.ts similarity index 89% rename from packages/file-id/tests/serialize-unique.spec.ts rename to packages/file-id/src/serialize-unique.test.ts index 000ff72a..dfec815f 100644 --- a/packages/file-id/tests/serialize-unique.spec.ts +++ b/packages/file-id/src/serialize-unique.test.ts @@ -1,7 +1,7 @@ -import { expect } from 'chai' -import { describe } from 'mocha' +import { describe, expect, it } from 'vitest' -import { parseFileId, toUniqueFileId } from '../src/index.js' +import { parseFileId } from './parse.js' +import { toUniqueFileId } from './serialize-unique.js' // test file IDs are partially taken from https://github.com/luckydonald/telegram_file_id diff --git a/packages/file-id/tests/utils.spec.ts b/packages/file-id/src/utils.test.ts similarity index 91% rename from packages/file-id/tests/utils.spec.ts rename to packages/file-id/src/utils.test.ts index aa0ac1c3..a7602aa7 100644 --- a/packages/file-id/tests/utils.spec.ts +++ b/packages/file-id/src/utils.test.ts @@ -1,9 +1,8 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { hexDecodeToBuffer, hexEncode } from '@mtcute/core/utils.js' -import { telegramRleDecode, telegramRleEncode } from '../src/utils.js' +import { telegramRleDecode, telegramRleEncode } from './utils.js' describe('telegramRleEncode', () => { it('should not modify input if there are no \\x00', () => { diff --git a/packages/file-id/tests/tsconfig.json b/packages/file-id/tests/tsconfig.json deleted file mode 100644 index cfa0657b..00000000 --- a/packages/file-id/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - ".", - ], - "references": [ - { "path": "../" }, - ] -} diff --git a/packages/html-parser/package.json b/packages/html-parser/package.json index 8ead590d..67fe9b4e 100644 --- a/packages/html-parser/package.json +++ b/packages/html-parser/package.json @@ -8,10 +8,7 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", - "coverage": "nyc npm run test", - "build": "pnpm run -w build-package html-parser", - "docs": "typedoc" + "build": "pnpm run -w build-package html-parser" }, "distOnlyFields": { "exports": { diff --git a/packages/html-parser/tests/html-parser.spec.ts b/packages/html-parser/src/html-parser.test.ts similarity index 99% rename from packages/html-parser/tests/html-parser.spec.ts rename to packages/html-parser/src/html-parser.test.ts index 2061927f..6d8e82d8 100644 --- a/packages/html-parser/tests/html-parser.spec.ts +++ b/packages/html-parser/src/html-parser.test.ts @@ -1,13 +1,12 @@ -import { expect } from 'chai' import Long from 'long' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { MessageEntity, TextWithEntities, tl } from '@mtcute/client' // prettier has "html" special-cased which breaks the formatting // this is not an issue when using normally, since we properly handle newlines/spaces, // but here we want to test everything as it is -import { html as htm, HtmlUnparseOptions } from '../src/index.js' +import { html as htm, HtmlUnparseOptions } from './index.js' const createEntity = ( type: T, diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 15a72269..c171100f 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -8,10 +8,7 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", - "coverage": "nyc npm run test", - "build": "pnpm run -w build-package i18n", - "docs": "typedoc" + "build": "pnpm run -w build-package i18n" }, "distOnlyFields": { "exports": { diff --git a/packages/i18n/tests/i18n.spec.ts b/packages/i18n/tests/i18n.test.ts similarity index 91% rename from packages/i18n/tests/i18n.spec.ts rename to packages/i18n/tests/i18n.test.ts index 4d32feed..97d99b01 100644 --- a/packages/i18n/tests/i18n.spec.ts +++ b/packages/i18n/tests/i18n.test.ts @@ -1,5 +1,4 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { Message, PeersIndex } from '@mtcute/client' import { MessageContext } from '@mtcute/dispatcher' @@ -84,12 +83,15 @@ describe('i18n', () => { }) it('should parse language from a message', () => { - const message = new MessageContext(null as never, new Message( - { _: 'message', peerId: { _: 'peerUser', userId: 1 } } as never, - PeersIndex.from({ - users: [{ _: 'user', id: 1, firstName: 'Пыня', langCode: 'ru' }], - }), - )) + const message = new MessageContext( + null as never, + new Message( + { _: 'message', peerId: { _: 'peerUser', userId: 1 } } as never, + PeersIndex.from({ + users: [{ _: 'user', id: 1, firstName: 'Пыня', langCode: 'ru' }], + }), + ), + ) expect(tr(message, 'direct')).to.equal('Привет') }) diff --git a/packages/markdown-parser/package.json b/packages/markdown-parser/package.json index 85f3855e..012cff39 100644 --- a/packages/markdown-parser/package.json +++ b/packages/markdown-parser/package.json @@ -8,10 +8,7 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", - "coverage": "nyc npm run test", - "build": "pnpm run -w build-package markdown-parser", - "docs": "typedoc" + "build": "pnpm run -w build-package markdown-parser" }, "distOnlyFields": { "exports": { diff --git a/packages/markdown-parser/tests/markdown-parser.spec.ts b/packages/markdown-parser/src/markdown-parser.test.ts similarity index 99% rename from packages/markdown-parser/tests/markdown-parser.spec.ts rename to packages/markdown-parser/src/markdown-parser.test.ts index b9cf8cba..b12f50b7 100644 --- a/packages/markdown-parser/tests/markdown-parser.spec.ts +++ b/packages/markdown-parser/src/markdown-parser.test.ts @@ -1,11 +1,10 @@ -import { expect } from 'chai' import Long from 'long' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { MessageEntity, TextWithEntities, tl } from '@mtcute/client' // md is special cased in prettier, we don't want that here -import { md as md_ } from '../src/index.js' +import { md as md_ } from './index.js' const createEntity = ( type: T, diff --git a/packages/markdown-parser/tests/tsconfig.json b/packages/markdown-parser/tests/tsconfig.json deleted file mode 100644 index cfa0657b..00000000 --- a/packages/markdown-parser/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - ".", - ], - "references": [ - { "path": "../" }, - ] -} diff --git a/packages/mtproxy/index.ts b/packages/mtproxy/index.ts index 203fbe17..f4475c0c 100644 --- a/packages/mtproxy/index.ts +++ b/packages/mtproxy/index.ts @@ -14,8 +14,8 @@ import { tl, TransportState, } from '@mtcute/core' -import { buffersEqual } from '@mtcute/core/dist/esm/utils/index.js' import { BaseTcpTransport } from '@mtcute/core/src/network/transports/tcp.js' +import { buffersEqual } from '@mtcute/core/utils.js' import { FakeTlsPacketCodec, generateFakeTlsHeader } from './fake-tls.js' diff --git a/packages/test/package.json b/packages/test/package.json index 65367333..b0075057 100644 --- a/packages/test/package.json +++ b/packages/test/package.json @@ -8,8 +8,6 @@ "main": "src/index.ts", "type": "module", "scripts": { - "docs": "typedoc", - "test": "mocha \"tests/**/*.spec.ts\"", "build": "pnpm run -w build-package test" }, "dependencies": { diff --git a/packages/test/tests/client.spec.ts b/packages/test/src/client.test.ts similarity index 80% rename from packages/test/tests/client.spec.ts rename to packages/test/src/client.test.ts index c7b523c0..730f7ac5 100644 --- a/packages/test/tests/client.spec.ts +++ b/packages/test/src/client.test.ts @@ -1,9 +1,8 @@ /* eslint-disable no-restricted-globals */ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { StubTelegramClient } from '../src/client.js' -import { createStub } from '../src/stub.js' +import { StubTelegramClient } from './client.js' +import { createStub } from './stub.js' describe('client stub', () => { it('should correctly intercept rpc calls', async () => { @@ -14,7 +13,7 @@ describe('client stub', () => { await client.with(async () => { const result = await client.call({ _: 'help.getConfig' }) - expect(result).to.eql(stubConfig) + expect(result).toEqual(stubConfig) }) }) @@ -31,7 +30,7 @@ describe('client stub', () => { await client.with(async () => { await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore "client closed" error - expect(log).to.eql([ + expect(log).toEqual([ 'message ctor=dcf8f173', // msg_container ]) }) diff --git a/packages/test/tests/storage.spec.ts b/packages/test/src/storage.test.ts similarity index 83% rename from packages/test/tests/storage.spec.ts rename to packages/test/src/storage.test.ts index 215a72b1..dda9f810 100644 --- a/packages/test/tests/storage.spec.ts +++ b/packages/test/src/storage.test.ts @@ -1,11 +1,10 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { BaseTelegramClient } from '@mtcute/core' -import { StubMemoryTelegramStorage } from '../src/storage.js' -import { createStub } from '../src/stub.js' -import { StubTelegramTransport } from '../src/transport.js' +import { StubMemoryTelegramStorage } from './storage.js' +import { createStub } from './stub.js' +import { StubTelegramTransport } from './transport.js' describe('storage stub', () => { it('should correctly intercept calls', async () => { @@ -43,6 +42,6 @@ describe('storage stub', () => { await client.connect() await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore "client closed" error - expect(log).to.eql(['load', 'save', 'destroy']) + expect(log).toEqual(['load', 'save', 'destroy']) }) }) diff --git a/packages/test/tests/stub.spec.ts b/packages/test/src/stub.test.ts similarity index 72% rename from packages/test/tests/stub.spec.ts rename to packages/test/src/stub.test.ts index 4f3a2b69..6d3f311a 100644 --- a/packages/test/tests/stub.spec.ts +++ b/packages/test/src/stub.test.ts @@ -1,12 +1,11 @@ -import { expect } from 'chai' import Long from 'long' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { createStub } from '../src/index.js' +import { createStub } from './index.js' describe('stub', () => { it('should correctly generate simple stubs', () => { - expect(createStub('inputUser', { userId: 123 })).to.eql({ + expect(createStub('inputUser', { userId: 123 })).toEqual({ _: 'inputUser', userId: 123, accessHash: Long.ZERO, @@ -14,7 +13,7 @@ describe('stub', () => { }) it('should correctly generate stubs for optional fields', () => { - expect(createStub('updateChannelTooLong')).to.eql({ + expect(createStub('updateChannelTooLong')).toEqual({ _: 'updateChannelTooLong', channelId: 0, pts: undefined, @@ -22,21 +21,21 @@ describe('stub', () => { }) it('should correctly generate stubs for boolean flags', () => { - expect(createStub('account.finishTakeoutSession')).to.eql({ + expect(createStub('account.finishTakeoutSession')).toEqual({ _: 'account.finishTakeoutSession', success: false, }) }) it('should correctly generate stubs for vectors', () => { - expect(createStub('messageActionChatAddUser')).to.eql({ + expect(createStub('messageActionChatAddUser')).toEqual({ _: 'messageActionChatAddUser', users: [], }) }) it('should correctly generate stubs for nested types', () => { - expect(createStub('messageActionGroupCallScheduled', { scheduleDate: 123 })).to.eql({ + expect(createStub('messageActionGroupCallScheduled', { scheduleDate: 123 })).toEqual({ _: 'messageActionGroupCallScheduled', call: { _: 'inputGroupCall', diff --git a/packages/test/tests/transport.spec.ts b/packages/test/src/transport.test.ts similarity index 70% rename from packages/test/tests/transport.spec.ts rename to packages/test/src/transport.test.ts index 455b672b..1e4a131a 100644 --- a/packages/test/tests/transport.spec.ts +++ b/packages/test/src/transport.test.ts @@ -1,10 +1,9 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { BaseTelegramClient } from '@mtcute/core' -import { createStub } from '../src/stub.js' -import { StubTelegramTransport } from '../src/transport.js' +import { createStub } from './stub.js' +import { StubTelegramTransport } from './transport.js' describe('transport stub', () => { it('should correctly intercept calls', async () => { @@ -22,9 +21,7 @@ describe('transport stub', () => { new StubTelegramTransport({ onConnect: (dc, testMode) => { log.push(`connect ${dc.ipAddress}:${dc.port} test=${testMode}`) - setTimeout(() => { - client.close().catch(() => {}) - }, 10) + client.close().catch(() => {}) }, onMessage(msg) { log.push(`message size=${msg.length}`) @@ -32,10 +29,9 @@ describe('transport stub', () => { }), }) - await client.connect() - await new Promise((resolve) => client.once('closed', resolve)) + await client.connect().catch(() => {}) // ignore "client closed" error - expect(log).to.eql([ + expect(log).toEqual([ 'message size=40', // req_pq_multi 'connect 1.2.3.4:1234 test=false', ]) diff --git a/packages/tl-runtime/package.json b/packages/tl-runtime/package.json index b1f09465..8a22885f 100644 --- a/packages/tl-runtime/package.json +++ b/packages/tl-runtime/package.json @@ -7,7 +7,6 @@ "license": "MIT", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", "docs": "typedoc", "build": "pnpm run -w build-package tl-runtime" }, diff --git a/packages/tl-runtime/tests/encodings/base64.spec.ts b/packages/tl-runtime/src/encodings/base64.test.ts similarity index 67% rename from packages/tl-runtime/tests/encodings/base64.spec.ts rename to packages/tl-runtime/src/encodings/base64.test.ts index 7a2e6d5e..83333ea4 100644 --- a/packages/tl-runtime/tests/encodings/base64.spec.ts +++ b/packages/tl-runtime/src/encodings/base64.test.ts @@ -1,40 +1,39 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { base64Decode, base64DecodeToBuffer, base64Encode } from '../../src/encodings/base64.js' -import { base64Decode as base64DecodeWeb, base64Encode as base64EncodeWeb } from '../../src/encodings/base64.web.js' +import { base64Decode, base64DecodeToBuffer, base64Encode } from './base64.js' +import { base64Decode as base64DecodeWeb, base64Encode as base64EncodeWeb } from './base64.web.js' describe('base64', () => { it('should decode base64 string to existing buffer', () => { const buf = new Uint8Array(4) base64Decode(buf, 'AQIDBA==') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should decode base64 string to new buffer', () => { const buf = base64DecodeToBuffer('AQIDBA==') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(new Uint8Array(buf)).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should encode buffer to base64 string', () => { const buf = new Uint8Array([1, 2, 3, 4]) - expect(base64Encode(buf)).eq('AQIDBA==') + expect(base64Encode(buf)).toEqual('AQIDBA==') }) it('should decode url-safe base64 string to existing buffer', () => { const buf = new Uint8Array(4) base64Decode(buf, 'AQIDBA', true) - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should decode url-safe base64 string to new buffer', () => { const buf = base64DecodeToBuffer('AQIDBA', true) - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(new Uint8Array(buf)).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should encode buffer to url-safe base64 string', () => { const buf = new Uint8Array([1, 2, 3, 4]) - expect(base64Encode(buf, true)).eq('AQIDBA') + expect(base64Encode(buf, true)).toEqual('AQIDBA') }) }) @@ -42,32 +41,32 @@ describe('base64.web', () => { it('should decode base64 string to existing buffer', () => { const buf = new Uint8Array(4) base64DecodeWeb(buf, 'AQIDBA==') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should decode base64 string to new buffer', () => { const buf = base64DecodeToBuffer('AQIDBA==') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(new Uint8Array(buf)).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should encode buffer to base64 string', () => { const buf = new Uint8Array([1, 2, 3, 4]) - expect(base64EncodeWeb(buf)).eq('AQIDBA==') + expect(base64EncodeWeb(buf)).toEqual('AQIDBA==') }) it('should decode url-safe base64 string to existing buffer', () => { const buf = new Uint8Array(4) base64DecodeWeb(buf, 'AQIDBA', true) - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should decode url-safe base64 string to new buffer', () => { const buf = base64DecodeToBuffer('AQIDBA', true) - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(new Uint8Array(buf)).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should encode buffer to url-safe base64 string', () => { const buf = new Uint8Array([1, 2, 3, 4]) - expect(base64EncodeWeb(buf, true)).eq('AQIDBA') + expect(base64EncodeWeb(buf, true)).toEqual('AQIDBA') }) }) diff --git a/packages/tl-runtime/tests/encodings/hex.spec.ts b/packages/tl-runtime/src/encodings/hex.test.ts similarity index 56% rename from packages/tl-runtime/tests/encodings/hex.spec.ts rename to packages/tl-runtime/src/encodings/hex.test.ts index a7245d37..7e106c8a 100644 --- a/packages/tl-runtime/tests/encodings/hex.spec.ts +++ b/packages/tl-runtime/src/encodings/hex.test.ts @@ -1,24 +1,27 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { hexDecode, hexDecodeToBuffer, hexEncode } from '../../src/encodings/hex.js' -import { hexDecode as hexDecodeWeb, hexDecodeToBuffer as hexDecodeToBufferWeb, hexEncode as hexEncodeWeb } from '../../src/encodings/hex.web.js' +import { hexDecode, hexDecodeToBuffer, hexEncode } from './hex.js' +import { + hexDecode as hexDecodeWeb, + hexDecodeToBuffer as hexDecodeToBufferWeb, + hexEncode as hexEncodeWeb, +} from './hex.web.js' describe('hex', () => { it('should decode hex string to existing buffer', () => { const buf = new Uint8Array(4) hexDecode(buf, '01020304') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should decode hex string to new buffer', () => { const buf = hexDecodeToBuffer('01020304') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(new Uint8Array(buf)).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should encode buffer to hex string', () => { const buf = new Uint8Array([1, 2, 3, 4]) - expect(hexEncode(buf)).eq('01020304') + expect(hexEncode(buf)).toEqual('01020304') }) }) @@ -26,16 +29,16 @@ describe('hex.web', () => { it('should decode hex string to existing buffer', () => { const buf = new Uint8Array(4) hexDecodeWeb(buf, '01020304') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should decode hex string to new buffer', () => { const buf = hexDecodeToBufferWeb('01020304') - expect(buf).eql(new Uint8Array([1, 2, 3, 4])) + expect(buf).toEqual(new Uint8Array([1, 2, 3, 4])) }) it('should encode buffer to hex string', () => { const buf = new Uint8Array([1, 2, 3, 4]) - expect(hexEncodeWeb(buf)).eq('01020304') + expect(hexEncodeWeb(buf)).toEqual('01020304') }) }) diff --git a/packages/tl-runtime/tests/encodings/utf8.spec.ts b/packages/tl-runtime/src/encodings/utf8.test.ts similarity index 65% rename from packages/tl-runtime/tests/encodings/utf8.spec.ts rename to packages/tl-runtime/src/encodings/utf8.test.ts index 42325a62..6d9c4526 100644 --- a/packages/tl-runtime/tests/encodings/utf8.spec.ts +++ b/packages/tl-runtime/src/encodings/utf8.test.ts @@ -1,13 +1,12 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { byteLengthUtf8, utf8Decode, utf8Encode, utf8EncodeToBuffer } from '../../src/encodings/utf8.js' +import { byteLengthUtf8, utf8Decode, utf8Encode, utf8EncodeToBuffer } from './utf8.js' import { byteLengthUtf8 as byteLengthUtf8Web, utf8Decode as utf8DecodeWeb, utf8Encode as utf8EncodeWeb, utf8EncodeToBuffer as utf8EncodeToBufferWeb, -} from '../../src/encodings/utf8.web.js' +} from './utf8.web.js' // since we use TextEncoder or native Buffer, we can skip testing the utf8 encoding itself // we only need to test that the functions work as expected with offsets and lengths @@ -16,17 +15,17 @@ describe('utf8', () => { it('should encode utf8 string into existing buffer', () => { const buf = new Uint8Array(4) utf8Encode(buf, 'abcd') - expect(buf).eql(new Uint8Array([97, 98, 99, 100])) + expect(buf).toEqual(new Uint8Array([97, 98, 99, 100])) }) it('should encode utf8 string into new buffer', () => { const buf = utf8EncodeToBuffer('abcd') - expect(buf).eql(new Uint8Array([97, 98, 99, 100])) + expect(new Uint8Array(buf)).toEqual(new Uint8Array([97, 98, 99, 100])) }) it('should decode utf8 string from existing buffer', () => { const buf = new Uint8Array([97, 98, 99, 100]) - expect(utf8Decode(buf)).eq('abcd') + expect(utf8Decode(buf)).toEqual('abcd') }) }) @@ -34,33 +33,33 @@ describe('utf8.web', () => { it('should encode utf8 string into existing buffer', () => { const buf = new Uint8Array(4) utf8EncodeWeb(buf, 'abcd') - expect(buf).eql(new Uint8Array([97, 98, 99, 100])) + expect(buf).toEqual(new Uint8Array([97, 98, 99, 100])) }) it('should encode utf8 string into new buffer', () => { const buf = utf8EncodeToBufferWeb('abcd') - expect(buf).eql(new Uint8Array([97, 98, 99, 100])) + expect(buf).toEqual(new Uint8Array([97, 98, 99, 100])) }) it('should decode utf8 string from existing buffer', () => { const buf = new Uint8Array([97, 98, 99, 100]) - expect(utf8DecodeWeb(buf)).eq('abcd') + expect(utf8DecodeWeb(buf)).toEqual('abcd') }) }) describe('byteLengthUtf8', () => { it('should return byte length of utf8 string', () => { - expect(byteLengthUtf8('abcd')).eq(4) + expect(byteLengthUtf8('abcd')).toEqual(4) }) it('should properly handle utf8 string with non-ascii characters', () => { - expect(byteLengthUtf8('абвг')).eq(8) - expect(byteLengthUtf8('🌸')).eq(4) + expect(byteLengthUtf8('абвг')).toEqual(8) + expect(byteLengthUtf8('🌸')).toEqual(4) }) it('should work in web', () => { - expect(byteLengthUtf8Web('abcd')).eq(4) - expect(byteLengthUtf8Web('абвг')).eq(8) - expect(byteLengthUtf8Web('🌸')).eq(4) + expect(byteLengthUtf8Web('abcd')).toEqual(4) + expect(byteLengthUtf8Web('абвг')).toEqual(8) + expect(byteLengthUtf8Web('🌸')).toEqual(4) }) }) diff --git a/packages/tl-runtime/tests/binary-reader.spec.ts b/packages/tl-runtime/src/reader.test.ts similarity index 72% rename from packages/tl-runtime/tests/binary-reader.spec.ts rename to packages/tl-runtime/src/reader.test.ts index 01378f6b..f919f78b 100644 --- a/packages/tl-runtime/tests/binary-reader.spec.ts +++ b/packages/tl-runtime/src/reader.test.ts @@ -1,90 +1,98 @@ // eslint-disable-next-line max-len /* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument */ -import { expect } from 'chai' + import { randomBytes } from 'crypto' import Long from 'long' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { hexDecodeToBuffer, hexEncode } from '../src/encodings/hex.js' -import { TlBinaryReader, TlReaderMap } from '../src/index.js' +import { hexDecodeToBuffer, hexEncode } from './encodings/hex.js' +import { TlBinaryReader, TlReaderMap } from './reader.js' describe('TlBinaryReader', () => { it('should read int32', () => { - expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0])).int()).eq(0) - expect(TlBinaryReader.manual(new Uint8Array([1, 0, 0, 0])).int()).eq(1) - expect(TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).int()).eq(67305985) - expect(TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff])).int()).eq(-1) + expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0])).int()).toEqual(0) + expect(TlBinaryReader.manual(new Uint8Array([1, 0, 0, 0])).int()).toEqual(1) + expect(TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).int()).toEqual(67305985) + expect(TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff])).int()).toEqual(-1) }) it('should read uint32', () => { - expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0])).uint()).eq(0) - expect(TlBinaryReader.manual(new Uint8Array([1, 0, 0, 0])).uint()).eq(1) - expect(TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).uint()).eq(67305985) - expect(TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff])).uint()).eq(4294967295) + expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0])).uint()).toEqual(0) + expect(TlBinaryReader.manual(new Uint8Array([1, 0, 0, 0])).uint()).toEqual(1) + expect(TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).uint()).toEqual(67305985) + expect(TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff])).uint()).toEqual(4294967295) }) it('should read int53', () => { - expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0])).int53()).eq(0) - expect(TlBinaryReader.manual(new Uint8Array([1, 0, 0, 0, 0, 0, 0, 0])).int53()).eq(1) - expect(TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4, 0, 0, 0, 0])).int53()).eq(67305985) - expect(TlBinaryReader.manual(new Uint8Array([1, 0, 1, 0, 1, 0, 1, 0])).int53()).eq(281479271743489) - expect(TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])).int53()).eq(-1) + expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0])).int53()).toEqual(0) + expect(TlBinaryReader.manual(new Uint8Array([1, 0, 0, 0, 0, 0, 0, 0])).int53()).toEqual(1) + expect(TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4, 0, 0, 0, 0])).int53()).toEqual(67305985) + expect(TlBinaryReader.manual(new Uint8Array([1, 0, 1, 0, 1, 0, 1, 0])).int53()).toEqual(281479271743489) + expect(TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])).int53()).toEqual( + -1, + ) }) it('should read long', () => { expect( - TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])).long().toString(), - ).eq('-1') + TlBinaryReader.manual(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])) + .long() + .toString(), + ).toEqual('-1') expect( - TlBinaryReader.manual(new Uint8Array([0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78])).long().toString(), - ).eq('8671175386481439762') + TlBinaryReader.manual(new Uint8Array([0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78])) + .long() + .toString(), + ).toEqual('8671175386481439762') expect( - TlBinaryReader.manual(new Uint8Array([0x15, 0xc4, 0x15, 0xb5, 0xc4, 0x1c, 0x03, 0xa3])).long().toString(), - ).eq('-6700480189419895787') + TlBinaryReader.manual(new Uint8Array([0x15, 0xc4, 0x15, 0xb5, 0xc4, 0x1c, 0x03, 0xa3])) + .long() + .toString(), + ).toEqual('-6700480189419895787') }) it('should read float', () => { - expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0x80, 0x3f])).float()).closeTo(1, 0.001) - expect(TlBinaryReader.manual(new Uint8Array([0xb6, 0xf3, 0x9d, 0x3f])).float()).closeTo(1.234, 0.001) - expect(TlBinaryReader.manual(new Uint8Array([0xfa, 0x7e, 0x2a, 0x3f])).float()).closeTo(0.666, 0.001) + expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0x80, 0x3f])).float()).toBeCloseTo(1, 0.001) + expect(TlBinaryReader.manual(new Uint8Array([0xb6, 0xf3, 0x9d, 0x3f])).float()).toBeCloseTo(1.234, 0.001) + expect(TlBinaryReader.manual(new Uint8Array([0xfa, 0x7e, 0x2a, 0x3f])).float()).toBeCloseTo(0.666, 0.001) }) it('should read double', () => { - expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0, 0, 0, 0xf0, 0x3f])).double()).closeTo(1, 0.001) - expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0, 0, 0, 0x25, 0x40])).double()).closeTo(10.5, 0.001) + expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0, 0, 0, 0xf0, 0x3f])).double()).toBeCloseTo(1, 0.001) + expect(TlBinaryReader.manual(new Uint8Array([0, 0, 0, 0, 0, 0, 0x25, 0x40])).double()).toBeCloseTo(10.5, 0.001) expect( TlBinaryReader.manual(new Uint8Array([0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x21, 0x40])).double(), - ).closeTo(8.8, 0.001) + ).toBeCloseTo(8.8, 0.001) }) it('should read raw bytes', () => { - expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).raw(2)]).eql([1, 2]) - expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).raw()]).eql([1, 2, 3, 4]) - expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).raw(0)]).eql([]) + expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).raw(2)]).toEqual([1, 2]) + expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).raw()]).toEqual([1, 2, 3, 4]) + expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).raw(0)]).toEqual([]) }) it('should move cursor', () => { const reader = TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8])) reader.int() - expect(reader.pos).eq(4) + expect(reader.pos).toEqual(4) reader.seek(-4) - expect(reader.pos).eq(0) + expect(reader.pos).toEqual(0) - expect(() => reader.seek(-1)).to.throw(RangeError) - expect(() => reader.seek(1000)).to.throw(RangeError) + expect(() => reader.seek(-1)).toThrow(RangeError) + expect(() => reader.seek(1000)).toThrow(RangeError) reader.uint() - expect(reader.pos).eq(4) + expect(reader.pos).toEqual(4) reader.seekTo(0) - expect(reader.pos).eq(0) + expect(reader.pos).toEqual(0) - expect(() => reader.seekTo(-1)).to.throw(RangeError) - expect(() => reader.seekTo(1000)).to.throw(RangeError) + expect(() => reader.seekTo(-1)).toThrow(RangeError) + expect(() => reader.seekTo(1000)).toThrow(RangeError) const checkFunction = (fn: () => void, sz: number) => { fn() - expect(reader.pos).eq(sz) + expect(reader.pos).toEqual(sz) reader.seekTo(0) } @@ -95,12 +103,12 @@ describe('TlBinaryReader', () => { }) it('should read tg-encoded bytes', () => { - expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).bytes()]).eql([2]) + expect([...TlBinaryReader.manual(new Uint8Array([1, 2, 3, 4])).bytes()]).toEqual([2]) const random250bytes = randomBytes(250) let reader = TlBinaryReader.manual(new Uint8Array([250, ...random250bytes, 0, 0, 0, 0, 0])) - expect([...reader.bytes()]).eql([...random250bytes]) - expect(reader.pos).eq(252) + expect([...reader.bytes()]).toEqual([...random250bytes]) + expect(reader.pos).toEqual(252) const random1000bytes = randomBytes(1000) // eslint-disable-next-line no-restricted-globals @@ -109,8 +117,8 @@ describe('TlBinaryReader', () => { buffer.writeIntLE(1000, 1, 3) buffer.set(random1000bytes, 4) reader = TlBinaryReader.manual(buffer) - expect([...reader.bytes()]).eql([...random1000bytes]) - expect(reader.pos).eq(1004) + expect([...reader.bytes()]).toEqual([...random1000bytes]) + expect(reader.pos).toEqual(1004) }) const stubObjectsMap: TlReaderMap = { @@ -153,9 +161,9 @@ describe('TlBinaryReader', () => { const reader = new TlBinaryReader(stubObjectsMap, buffer) const deadBeef = reader.object() - expect(deadBeef).eql({ a: 1, b: 42 }) + expect(deadBeef).toEqual({ a: 1, b: 42 }) const baadCode = reader.object() - expect(baadCode).eq(2) + expect(baadCode).toEqual(2) }) it('should read tg-encoded vectors', () => { @@ -215,11 +223,11 @@ describe('TlBinaryReader', () => { const reader = new TlBinaryReader(stubObjectsMap, buffer) const vector = reader.vector() - expect(vector).eql([{ a: 1, b: 42 }, 2, { vec: [1, 2] }]) + expect(vector).toEqual([{ a: 1, b: 42 }, 2, { vec: [1, 2] }]) reader.seekTo(0) const vectorObj = reader.object() - expect(vector).eql(vectorObj) + expect(vector).toEqual(vectorObj) }) describe('examples from documentation', () => { @@ -249,18 +257,18 @@ describe('TlBinaryReader', () => { } const r = new TlBinaryReader(map, hexDecodeToBuffer(input)) - expect(r.long().toString()).eq('0') // authKeyId - expect(r.long().toString(16)).eq('51E57AC91E83C801'.toLowerCase()) // messageId - expect(r.uint()).eq(64) // messageLength + expect(r.long().toString()).toEqual('0') // authKeyId + expect(r.long().toString(16)).toEqual('51E57AC91E83C801'.toLowerCase()) // messageId + expect(r.uint()).toEqual(64) // messageLength // eslint-disable-next-line @typescript-eslint/no-explicit-any const obj = r.object() as any - expect(obj._).eq('mt_resPQ') - expect(hexEncode(obj.nonce)).eq(hexEncode(expected.nonce)) - expect(hexEncode(obj.serverNonce)).eq(hexEncode(expected.serverNonce)) - expect(hexEncode(obj.pq)).eq(hexEncode(expected.pq)) - expect(obj.serverPublicKeyFingerprints.length).eq(1) - expect(obj.serverPublicKeyFingerprints[0].toString(16)).eq( + expect(obj._).toEqual('mt_resPQ') + expect(hexEncode(obj.nonce)).toEqual(hexEncode(expected.nonce)) + expect(hexEncode(obj.serverNonce)).toEqual(hexEncode(expected.serverNonce)) + expect(hexEncode(obj.pq)).toEqual(hexEncode(expected.pq)) + expect(obj.serverPublicKeyFingerprints.length).toEqual(1) + expect(obj.serverPublicKeyFingerprints[0].toString(16)).toEqual( expected.serverPublicKeyFingerprints[0].toString(16), ) }) diff --git a/packages/tl-runtime/tests/binary-writer.spec.ts b/packages/tl-runtime/src/writer.test.ts similarity index 70% rename from packages/tl-runtime/tests/binary-writer.spec.ts rename to packages/tl-runtime/src/writer.test.ts index cc3fd07e..9dac7788 100644 --- a/packages/tl-runtime/tests/binary-writer.spec.ts +++ b/packages/tl-runtime/src/writer.test.ts @@ -1,76 +1,77 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import { expect } from 'chai' import { randomBytes } from 'crypto' import Long from 'long' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' import { hexDecodeToBuffer, hexEncode } from '../src/encodings/hex.js' -import { TlBinaryWriter, TlSerializationCounter, TlWriterMap } from '../src/index.js' +import { TlBinaryWriter, TlSerializationCounter, TlWriterMap } from './writer.js' describe('TlBinaryWriter', () => { const testSingleMethod = (size: number, fn: (w: TlBinaryWriter) => void, map?: TlWriterMap): string => { const w = TlBinaryWriter.alloc(map, size) fn(w) - expect(w.pos).eq(size) + expect(w.pos).toEqual(size) return hexEncode(w.uint8View) } it('should write int32', () => { - expect(testSingleMethod(4, (w) => w.int(0))).eq('00000000') - expect(testSingleMethod(4, (w) => w.int(1))).eq('01000000') - expect(testSingleMethod(4, (w) => w.int(67305985))).eq('01020304') - expect(testSingleMethod(4, (w) => w.int(-1))).eq('ffffffff') + expect(testSingleMethod(4, (w) => w.int(0))).toEqual('00000000') + expect(testSingleMethod(4, (w) => w.int(1))).toEqual('01000000') + expect(testSingleMethod(4, (w) => w.int(67305985))).toEqual('01020304') + expect(testSingleMethod(4, (w) => w.int(-1))).toEqual('ffffffff') }) it('should write uint32', () => { - expect(testSingleMethod(4, (w) => w.uint(0))).eq('00000000') - expect(testSingleMethod(4, (w) => w.uint(1))).eq('01000000') - expect(testSingleMethod(4, (w) => w.uint(67305985))).eq('01020304') - expect(testSingleMethod(4, (w) => w.uint(4294967295))).eq('ffffffff') + expect(testSingleMethod(4, (w) => w.uint(0))).toEqual('00000000') + expect(testSingleMethod(4, (w) => w.uint(1))).toEqual('01000000') + expect(testSingleMethod(4, (w) => w.uint(67305985))).toEqual('01020304') + expect(testSingleMethod(4, (w) => w.uint(4294967295))).toEqual('ffffffff') }) it('should write int53', () => { - expect(testSingleMethod(8, (w) => w.int53(0))).eq('0000000000000000') - expect(testSingleMethod(8, (w) => w.int53(1))).eq('0100000000000000') - expect(testSingleMethod(8, (w) => w.int53(67305985))).eq('0102030400000000') - expect(testSingleMethod(8, (w) => w.int53(281479271743489))).eq('0100010001000100') - expect(testSingleMethod(8, (w) => w.int53(-1))).eq('ffffffffffffffff') + expect(testSingleMethod(8, (w) => w.int53(0))).toEqual('0000000000000000') + expect(testSingleMethod(8, (w) => w.int53(1))).toEqual('0100000000000000') + expect(testSingleMethod(8, (w) => w.int53(67305985))).toEqual('0102030400000000') + expect(testSingleMethod(8, (w) => w.int53(281479271743489))).toEqual('0100010001000100') + expect(testSingleMethod(8, (w) => w.int53(-1))).toEqual('ffffffffffffffff') }) it('should write long', () => { - expect(testSingleMethod(8, (w) => w.long(Long.NEG_ONE))).eq('ffffffffffffffff') - expect(testSingleMethod(8, (w) => w.long(Long.fromString('8671175386481439762')))).eq('1234567812345678') - expect(testSingleMethod(8, (w) => w.long(Long.fromString('-6700480189419895787')))).eq('15c415b5c41c03a3') + expect(testSingleMethod(8, (w) => w.long(Long.NEG_ONE))).toEqual('ffffffffffffffff') + expect(testSingleMethod(8, (w) => w.long(Long.fromString('8671175386481439762')))).toEqual('1234567812345678') + expect(testSingleMethod(8, (w) => w.long(Long.fromString('-6700480189419895787')))).toEqual('15c415b5c41c03a3') }) it('should write float', () => { - expect(testSingleMethod(4, (w) => w.float(1))).eq('0000803f') - expect(testSingleMethod(4, (w) => w.float(1.234))).eq('b6f39d3f') - expect(testSingleMethod(4, (w) => w.float(0.666))).eq('fa7e2a3f') + expect(testSingleMethod(4, (w) => w.float(1))).toEqual('0000803f') + expect(testSingleMethod(4, (w) => w.float(1.234))).toEqual('b6f39d3f') + expect(testSingleMethod(4, (w) => w.float(0.666))).toEqual('fa7e2a3f') }) it('should write double', () => { - expect(testSingleMethod(8, (w) => w.double(1))).eq('000000000000f03f') - expect(testSingleMethod(8, (w) => w.double(10.5))).eq('0000000000002540') - expect(testSingleMethod(8, (w) => w.double(8.8))).eq('9a99999999992140') + expect(testSingleMethod(8, (w) => w.double(1))).toEqual('000000000000f03f') + expect(testSingleMethod(8, (w) => w.double(10.5))).toEqual('0000000000002540') + expect(testSingleMethod(8, (w) => w.double(8.8))).toEqual('9a99999999992140') }) it('should write raw bytes', () => { - expect(testSingleMethod(5, (w) => w.raw(new Uint8Array([4, 3, 5, 1, 1])))).eq('0403050101') + expect(testSingleMethod(5, (w) => w.raw(new Uint8Array([4, 3, 5, 1, 1])))).toEqual('0403050101') }) it('should write tg-encoded boolean', () => { - expect(testSingleMethod(4, (w) => w.boolean(false))).eq('379779bc') - expect(testSingleMethod(4, (w) => w.boolean(true))).eq('b5757299') + expect(testSingleMethod(4, (w) => w.boolean(false))).toEqual('379779bc') + expect(testSingleMethod(4, (w) => w.boolean(true))).toEqual('b5757299') }) it('should write tg-encoded bytes', () => { - expect(testSingleMethod(4, (w) => w.bytes(new Uint8Array([1, 2, 3])))).eq('03010203') - expect(testSingleMethod(8, (w) => w.bytes(new Uint8Array([1, 2, 3, 4])))).eq('0401020304000000') + expect(testSingleMethod(4, (w) => w.bytes(new Uint8Array([1, 2, 3])))).toEqual('03010203') + expect(testSingleMethod(8, (w) => w.bytes(new Uint8Array([1, 2, 3, 4])))).toEqual('0401020304000000') const random250bytes = randomBytes(250) - expect(testSingleMethod(252, (w) => w.bytes(random250bytes))).eq('fa' + random250bytes.toString('hex') + '00') + expect(testSingleMethod(252, (w) => w.bytes(random250bytes))).toEqual( + 'fa' + random250bytes.toString('hex') + '00', + ) const random1000bytes = randomBytes(1000) // eslint-disable-next-line no-restricted-globals @@ -78,7 +79,7 @@ describe('TlBinaryWriter', () => { buffer[0] = 254 buffer.writeIntLE(1000, 1, 3) buffer.set(random1000bytes, 4) - expect(testSingleMethod(1004, (w) => w.bytes(random1000bytes))).eq(buffer.toString('hex')) + expect(testSingleMethod(1004, (w) => w.bytes(random1000bytes))).toEqual(buffer.toString('hex')) }) const stubObjectsMap: TlWriterMap = { @@ -116,7 +117,7 @@ describe('TlBinaryWriter', () => { const length = TlSerializationCounter.countNeededBytes(stubObjectsMap, object1) + TlSerializationCounter.countNeededBytes(stubObjectsMap, object2) - expect(length).eq(20) + expect(length).toEqual(20) expect( testSingleMethod( @@ -127,7 +128,7 @@ describe('TlBinaryWriter', () => { }, stubObjectsMap, ), - ).eq('efbeadde01000000addecefadec0adba02000000') + ).toEqual('efbeadde01000000addecefadec0adba02000000') }) it('should write tg-encoded vectors', () => { @@ -150,7 +151,7 @@ describe('TlBinaryWriter', () => { TlSerializationCounter.countNeededBytes(stubObjectsMap, object2) + TlSerializationCounter.countNeededBytes(stubObjectsMap, object3) + 8 // because technically in tl vector can't be top-level, but whatever :shrug: - expect(length).eq(48) + expect(length).toEqual(48) expect( testSingleMethod( @@ -160,7 +161,7 @@ describe('TlBinaryWriter', () => { }, stubObjectsMap, ), - ).eq('15c4b51c03000000efbeadde01000000addecefadec0adba020000003d0cbfbe15c4b51c020000000100000002000000') + ).toEqual('15c4b51c03000000efbeadde01000000addecefadec0adba020000003d0cbfbe15c4b51c020000000100000002000000') }) describe('examples from documentation', () => { @@ -193,7 +194,7 @@ describe('TlBinaryWriter', () => { 20 + // mtproto header TlSerializationCounter.countNeededBytes(map, resPq) - expect(length).eq(expected.length / 2) + expect(length).toEqual(expected.length / 2) expect( testSingleMethod( length, @@ -206,7 +207,7 @@ describe('TlBinaryWriter', () => { }, map, ), - ).eq(expected) + ).toEqual(expected) }) }) }) diff --git a/packages/tl-runtime/tests/tsconfig.json b/packages/tl-runtime/tests/tsconfig.json deleted file mode 100644 index 23b6b033..00000000 --- a/packages/tl-runtime/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - "." - ], - "references": [ - { "path": "../" } - ] -} diff --git a/packages/tl-runtime/tsconfig.json b/packages/tl-runtime/tsconfig.json index 7f5a1406..23d190e1 100644 --- a/packages/tl-runtime/tsconfig.json +++ b/packages/tl-runtime/tsconfig.json @@ -6,5 +6,5 @@ }, "include": [ "./src" - ] + ], } diff --git a/packages/tl-utils/package.json b/packages/tl-utils/package.json index 2289db36..107bc3c8 100644 --- a/packages/tl-utils/package.json +++ b/packages/tl-utils/package.json @@ -8,7 +8,6 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", "docs": "typedoc", "build": "pnpm run -w build-package tl-utils" }, diff --git a/packages/tl-utils/tests/calculator.spec.ts b/packages/tl-utils/src/calculator.test.ts similarity index 89% rename from packages/tl-utils/tests/calculator.spec.ts rename to packages/tl-utils/src/calculator.test.ts index eda76de3..249f2ec2 100644 --- a/packages/tl-utils/tests/calculator.spec.ts +++ b/packages/tl-utils/src/calculator.test.ts @@ -1,12 +1,11 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { calculateStaticSizes } from '../src/calculator.js' -import { parseTlToEntries } from '../src/parse.js' +import { calculateStaticSizes } from './calculator.js' +import { parseTlToEntries } from './parse.js' describe('calculateStaticSizes', () => { const test = (tl: string, expected: object) => { - expect(calculateStaticSizes(parseTlToEntries(tl))).eql(expected) + expect(calculateStaticSizes(parseTlToEntries(tl))).toEqual(expected) } it('computes for constructors without parameters', () => { diff --git a/packages/tl-utils/tests/codegen/reader.spec.ts b/packages/tl-utils/src/codegen/reader.test.ts similarity index 95% rename from packages/tl-utils/tests/codegen/reader.spec.ts rename to packages/tl-utils/src/codegen/reader.test.ts index 5ad28666..2d27061f 100644 --- a/packages/tl-utils/tests/codegen/reader.spec.ts +++ b/packages/tl-utils/src/codegen/reader.test.ts @@ -1,12 +1,12 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { generateReaderCodeForTlEntry, parseTlToEntries } from '../../src/index.js' +import { parseTlToEntries } from '../parse.js' +import { generateReaderCodeForTlEntry } from './reader.js' describe('generateReaderCodeForTlEntry', () => { const test = (tl: string, ...js: string[]) => { const entry = parseTlToEntries(tl).slice(-1)[0] - expect(generateReaderCodeForTlEntry(entry)).eq(`${entry.id}:function(r){${js.join('')}},`) + expect(generateReaderCodeForTlEntry(entry)).toEqual(`${entry.id}:function(r){${js.join('')}},`) } it('generates code for constructors without arguments', () => { @@ -163,7 +163,7 @@ describe('generateReaderCodeForTlEntry', () => { it('generates code with raw flags for constructors with flags', () => { const entry = parseTlToEntries('test flags:# flags2:# = Test;')[0] - expect(generateReaderCodeForTlEntry(entry, { includeFlags: true })).eq( + expect(generateReaderCodeForTlEntry(entry, { includeFlags: true })).toEqual( `${entry.id}:function(r){${[ 'var flags=r.uint(),', 'flags2=r.uint();', diff --git a/packages/tl-utils/tests/codegen/types.spec.ts b/packages/tl-utils/src/codegen/types.test.ts similarity index 95% rename from packages/tl-utils/tests/codegen/types.spec.ts rename to packages/tl-utils/src/codegen/types.test.ts index b320a216..be421d3e 100644 --- a/packages/tl-utils/tests/codegen/types.spec.ts +++ b/packages/tl-utils/src/codegen/types.test.ts @@ -1,17 +1,13 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { - generateTypescriptDefinitionsForTlEntry, - generateTypescriptDefinitionsForTlSchema, - parseFullTlSchema, - parseTlToEntries, -} from '../../src/index.js' +import { parseTlToEntries } from '../parse.js' +import { parseFullTlSchema } from '../schema.js' +import { generateTypescriptDefinitionsForTlEntry, generateTypescriptDefinitionsForTlSchema } from './types.js' describe('generateTypescriptDefinitionsForTlEntry', () => { const test = (tl: string, ...ts: string[]) => { const entry = parseTlToEntries(tl)[0] - expect(generateTypescriptDefinitionsForTlEntry(entry)).eq(ts.join('\n')) + expect(generateTypescriptDefinitionsForTlEntry(entry)).toEqual(ts.join('\n')) } it('replaces primitive types', () => { @@ -155,7 +151,7 @@ describe('generateTypescriptDefinitionsForTlEntry', () => { it('generates code with raw flags for constructors with flags', () => { const entry = parseTlToEntries('test flags:# flags2:# = Test;')[0] - expect(generateTypescriptDefinitionsForTlEntry(entry, undefined, undefined, true)).eq( + expect(generateTypescriptDefinitionsForTlEntry(entry, undefined, undefined, true)).toEqual( ['interface RawTest {', " _: 'test';", ' flags: number;', ' flags2: number;', '}'].join('\n'), ) }) @@ -176,8 +172,8 @@ describe('generateTypescriptDefinitionsForTlSchema', () => { // skip prelude codeJs = codeJs.substring(codeJs.indexOf('ns.LAYER = 0;') + 14, codeJs.length - 15) - expect(codeTs.trim()).eq(ts.join('\n')) - expect(codeJs.trim()).eq(js.join('\n')) + expect(codeTs.trim()).toEqual(ts.join('\n')) + expect(codeJs.trim()).toEqual(js.join('\n')) } it('writes simple schemas', () => { diff --git a/packages/tl-utils/tests/codegen/writer.spec.ts b/packages/tl-utils/src/codegen/writer.test.ts similarity index 96% rename from packages/tl-utils/tests/codegen/writer.spec.ts rename to packages/tl-utils/src/codegen/writer.test.ts index 54af0896..2d4957dc 100644 --- a/packages/tl-utils/tests/codegen/writer.spec.ts +++ b/packages/tl-utils/src/codegen/writer.test.ts @@ -1,12 +1,12 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { generateWriterCodeForTlEntries, generateWriterCodeForTlEntry, parseTlToEntries } from '../../src/index.js' +import { parseTlToEntries } from '../parse.js' +import { generateWriterCodeForTlEntries, generateWriterCodeForTlEntry } from './writer.js' describe('generateWriterCodeForTlEntry', () => { const test = (tl: string, ...js: string[]) => { const entry = parseTlToEntries(tl).slice(-1)[0] - expect(generateWriterCodeForTlEntry(entry)).eq( + expect(generateWriterCodeForTlEntry(entry)).toEqual( `'${entry.name}':function(w${entry.arguments.length ? ',v' : ''}){w.uint(${entry.id});${js.join('')}},`, ) } @@ -136,7 +136,7 @@ describe('generateWriterCodeForTlEntry', () => { 'future_salts#ae500895 salts:vector current:future_salt = FutureSalts;', ) - expect(generateWriterCodeForTlEntries(entries, { includePrelude: false })).eq( + expect(generateWriterCodeForTlEntries(entries, { includePrelude: false })).toEqual( ` var m={ 'future_salt':function(w,v){w.uint(155834844);w.bytes(h(v,'salt'));}, @@ -150,7 +150,7 @@ describe('generateWriterCodeForTlEntry', () => { it('generates code with raw flags for constructors with flags', () => { const entry = parseTlToEntries('test flags:# flags2:# = Test;')[0] - expect(generateWriterCodeForTlEntry(entry, { includeFlags: true })).eq( + expect(generateWriterCodeForTlEntry(entry, { includeFlags: true })).toEqual( `'${entry.name}':function(w,v){${[ `w.uint(${entry.id});`, 'var flags=v.flags;', diff --git a/packages/tl-utils/tests/ctor-id.spec.ts b/packages/tl-utils/src/ctor-id.test.ts similarity index 92% rename from packages/tl-utils/tests/ctor-id.spec.ts rename to packages/tl-utils/src/ctor-id.test.ts index bf3fde4a..23758924 100644 --- a/packages/tl-utils/tests/ctor-id.spec.ts +++ b/packages/tl-utils/src/ctor-id.test.ts @@ -1,7 +1,7 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { computeConstructorIdFromEntry, TlArgument, TlEntry } from '../src/index.js' +import { computeConstructorIdFromEntry } from './ctor-id.js' +import { TlArgument, TlEntry } from './index.js' describe('computeConstructorIdFromEntry', () => { const make = (name: string, type: string, ...args: string[]): TlEntry => ({ @@ -31,7 +31,7 @@ describe('computeConstructorIdFromEntry', () => { }) const test = (tl: TlEntry, expected: number) => { - expect(computeConstructorIdFromEntry(tl)).eq(expected) + expect(computeConstructorIdFromEntry(tl)).toEqual(expected) } it('computes for constructors without parameters', () => { diff --git a/packages/tl-utils/tests/diff.spec.ts b/packages/tl-utils/src/diff.test.ts similarity index 97% rename from packages/tl-utils/tests/diff.spec.ts rename to packages/tl-utils/src/diff.test.ts index 037e2f48..dbb95bf7 100644 --- a/packages/tl-utils/tests/diff.spec.ts +++ b/packages/tl-utils/src/diff.test.ts @@ -1,16 +1,15 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { generateTlEntriesDifference, generateTlSchemasDifference } from '../src/diff.js' -import { parseTlToEntries } from '../src/parse.js' -import { parseFullTlSchema } from '../src/schema.js' -import { TlEntryDiff, TlSchemaDiff } from '../src/types.js' +import { generateTlEntriesDifference, generateTlSchemasDifference } from './diff.js' +import { parseTlToEntries } from './parse.js' +import { parseFullTlSchema } from './schema.js' +import { TlEntryDiff, TlSchemaDiff } from './types.js' describe('generateTlEntriesDifference', () => { const test = (tl: string[], expected: TlEntryDiff) => { const e = parseTlToEntries(tl.join('\n')) const res = generateTlEntriesDifference(e[0], e[1]) - expect(res).eql(expected) + expect(res).toEqual(expected) } it('shows id diff', () => { @@ -112,7 +111,7 @@ describe('generateTlSchemasDifference', () => { if (!('classes' in expected)) delete res.classes if (!('unions' in expected)) delete res.unions - expect(res).eql(expected) + expect(res).toEqual(expected) } it('shows added constructors', () => { diff --git a/packages/tl-utils/tests/merge.spec.ts b/packages/tl-utils/src/merge.test.ts similarity index 92% rename from packages/tl-utils/tests/merge.spec.ts rename to packages/tl-utils/src/merge.test.ts index 69b4a067..329c5340 100644 --- a/packages/tl-utils/tests/merge.spec.ts +++ b/packages/tl-utils/src/merge.test.ts @@ -1,23 +1,18 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { - mergeTlEntries, - mergeTlSchemas, - parseFullTlSchema, - parseTlToEntries, - writeTlEntriesToString, - writeTlEntryToString, -} from '../src/index.js' +import { mergeTlEntries, mergeTlSchemas } from './merge.js' +import { parseTlToEntries } from './parse.js' +import { parseFullTlSchema, writeTlEntriesToString } from './schema.js' +import { writeTlEntryToString } from './stringify.js' describe('mergeTlEntries', () => { const test = (tl: string, expected: string) => { const res = mergeTlEntries(parseTlToEntries(tl)) if (typeof res === 'string') { - expect(res).eq(expected) + expect(res).toEqual(expected) } else { - expect(writeTlEntryToString(res)).eq(expected) + expect(writeTlEntryToString(res)).toEqual(expected) } } @@ -83,7 +78,7 @@ describe('mergeTlSchemas', () => { omitPrimitives: true, tdlibComments: true, }), - ).eq(expected.join('\n')) + ).toEqual(expected.join('\n')) } it('merges different constructors', async () => { diff --git a/packages/tl-utils/tests/parse.spec.ts b/packages/tl-utils/src/parse.test.ts similarity index 96% rename from packages/tl-utils/tests/parse.spec.ts rename to packages/tl-utils/src/parse.test.ts index a57925c4..454bf755 100644 --- a/packages/tl-utils/tests/parse.spec.ts +++ b/packages/tl-utils/src/parse.test.ts @@ -1,11 +1,11 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { parseTlToEntries, TlEntry } from '../src/index.js' +import { parseTlToEntries } from './parse.js' +import { TlEntry } from './types.js' describe('tl parser', () => { const test = (tl: string, expected: TlEntry[], params?: Parameters[1]) => { - expect(parseTlToEntries(tl, params)).eql(expected) + expect(parseTlToEntries(tl, params)).toEqual(expected) } it('skips empty lines and comments', () => { @@ -317,10 +317,10 @@ account.getAccountTTL = AccountDaysTTL; users.getUsers id:Vector = Vector; `, ) - expect(items[0].id).eq(0xda9b0d0d) - expect(items[1].id).eq(0x8c39793f) - expect(items[2].id).eq(0x8fc711d) - expect(items[3].id).eq(0xd91a548) + expect(items[0].id).toEqual(0xda9b0d0d) + expect(items[1].id).toEqual(0x8c39793f) + expect(items[2].id).toEqual(0x8fc711d) + expect(items[3].id).toEqual(0xd91a548) }) it('parses preceding comments', () => { @@ -401,7 +401,7 @@ users.getUsers id:Vector = Vector; }, ) - expect(orphaned).eql(['some comment idk', 'another comment but multiline', 'yet another at the end']) + expect(orphaned).toEqual(['some comment idk', 'another comment but multiline', 'yet another at the end']) }) it('applies prefix to constructors', () => { diff --git a/packages/tl-utils/tests/schema.spec.ts b/packages/tl-utils/src/schema.test.ts similarity index 94% rename from packages/tl-utils/tests/schema.spec.ts rename to packages/tl-utils/src/schema.test.ts index ace5b87e..1a645fee 100644 --- a/packages/tl-utils/tests/schema.spec.ts +++ b/packages/tl-utils/src/schema.test.ts @@ -1,8 +1,7 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { writeTlEntriesToString } from '../src/schema.js' -import { TlEntry } from '../src/types.js' +import { writeTlEntriesToString } from './schema.js' +import { TlEntry } from './types.js' describe('writeTlEntriesToString', () => { const test = (entries: TlEntry[], params: Parameters[1], ...expected: string[]) => { @@ -11,7 +10,7 @@ describe('writeTlEntriesToString', () => { omitPrimitives: true, ...params, }), - ).eq(expected.join('\n')) + ).toEqual(expected.join('\n')) } it('computes missing ids', () => { diff --git a/packages/tl-utils/tests/stringify.spec.ts b/packages/tl-utils/src/stringify.test.ts similarity index 93% rename from packages/tl-utils/tests/stringify.spec.ts rename to packages/tl-utils/src/stringify.test.ts index 09a5b61d..309c3d90 100644 --- a/packages/tl-utils/tests/stringify.spec.ts +++ b/packages/tl-utils/src/stringify.test.ts @@ -1,8 +1,7 @@ -import { expect } from 'chai' -import { describe, it } from 'mocha' +import { describe, expect, it } from 'vitest' -import { writeTlEntryToString } from '../src/stringify.js' -import { TlArgument, TlEntry } from '../src/types.js' +import { writeTlEntryToString } from './stringify.js' +import { TlArgument, TlEntry } from './types.js' describe('writeTlEntryToString', () => { const make = (name: string, type: string, ...args: string[]): TlEntry => ({ @@ -32,7 +31,7 @@ describe('writeTlEntryToString', () => { }) const test = (tl: TlEntry, expected: string) => { - expect(writeTlEntryToString(tl)).eq(expected) + expect(writeTlEntryToString(tl)).toEqual(expected) } it('writes constructors without parameters', () => { diff --git a/packages/tl-utils/tests/tsconfig.json b/packages/tl-utils/tests/tsconfig.json deleted file mode 100644 index 23b6b033..00000000 --- a/packages/tl-utils/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": [ - "." - ], - "references": [ - { "path": "../" } - ] -} diff --git a/packages/wasm/package.json b/packages/wasm/package.json index 94082a58..af565051 100644 --- a/packages/wasm/package.json +++ b/packages/wasm/package.json @@ -8,7 +8,6 @@ "main": "src/index.ts", "type": "module", "scripts": { - "test": "mocha \"tests/**/*.spec.ts\"", "docs": "typedoc", "build": "pnpm run -w build-package wasm", "build:wasm": "docker build --output=lib --target=binaries lib" diff --git a/packages/wasm/tests/allocator.spec.ts b/packages/wasm/tests/allocator.test.ts similarity index 72% rename from packages/wasm/tests/allocator.spec.ts rename to packages/wasm/tests/allocator.test.ts index 790113c7..c9afc617 100644 --- a/packages/wasm/tests/allocator.spec.ts +++ b/packages/wasm/tests/allocator.test.ts @@ -1,8 +1,8 @@ -import { expect } from 'chai' +import { beforeAll, describe, expect, it } from 'vitest' import { __getWasm, initAsync } from '../src/index.js' -before(async () => { +beforeAll(async () => { await initAsync() }) @@ -16,6 +16,6 @@ describe('allocator', () => { wasm.__free(ptr) } - expect(wasm.memory.buffer.byteLength).to.equal(memUsage) + expect(wasm.memory.buffer.byteLength).toEqual(memUsage) }) }) diff --git a/packages/wasm/tests/ctr.spec.ts b/packages/wasm/tests/ctr.test.ts similarity index 69% rename from packages/wasm/tests/ctr.spec.ts rename to packages/wasm/tests/ctr.test.ts index 95dd5915..c302617c 100644 --- a/packages/wasm/tests/ctr.spec.ts +++ b/packages/wasm/tests/ctr.test.ts @@ -1,10 +1,9 @@ /* eslint-disable no-restricted-globals */ -import { expect } from 'chai' -import { before, describe } from 'mocha' +import { beforeAll, describe, expect, it } from 'vitest' import { __getWasm, createCtr256, ctr256, freeCtr256, initAsync } from '../src/index.js' -before(async () => { +beforeAll(async () => { await initAsync() }) @@ -34,7 +33,7 @@ describe('aes-ctr', () => { const res = ctr256(ctr, data) freeCtr256(ctr) - expect(Buffer.from(res).toString('hex')).to.equal(dataEnc.toString('hex')) + expect(Buffer.from(res).toString('hex')).toEqual(dataEnc.toString('hex')) }) it('should correctly decrypt', () => { @@ -42,7 +41,7 @@ describe('aes-ctr', () => { const res = ctr256(ctr, dataEnc) freeCtr256(ctr) - expect(Buffer.from(res).toString('hex')).to.equal(data.toString('hex')) + expect(Buffer.from(res).toString('hex')).toEqual(data.toString('hex')) }) }) @@ -60,9 +59,9 @@ describe('aes-ctr', () => { freeCtr256(ctr) - expect(Buffer.from(res1).toString('hex')).to.equal(dataEnc1.toString('hex')) - expect(Buffer.from(res2).toString('hex')).to.equal(dataEnc2.toString('hex')) - expect(Buffer.from(res3).toString('hex')).to.equal(dataEnc3.toString('hex')) + expect(Buffer.from(res1).toString('hex')).toEqual(dataEnc1.toString('hex')) + expect(Buffer.from(res2).toString('hex')).toEqual(dataEnc2.toString('hex')) + expect(Buffer.from(res3).toString('hex')).toEqual(dataEnc3.toString('hex')) }) it('should correctly decrypt', () => { @@ -73,9 +72,9 @@ describe('aes-ctr', () => { freeCtr256(ctr) - expect(Buffer.from(res1).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res2).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res3).toString('hex')).to.equal(data.toString('hex')) + expect(Buffer.from(res1).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res2).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res3).toString('hex')).toEqual(data.toString('hex')) }) }) @@ -99,12 +98,12 @@ describe('aes-ctr', () => { freeCtr256(ctr) - expect(Buffer.from(res1).toString('hex')).to.equal(dataEnc1.toString('hex')) - expect(Buffer.from(res2).toString('hex')).to.equal(dataEnc2.toString('hex')) - expect(Buffer.from(res3).toString('hex')).to.equal(dataEnc3.toString('hex')) - expect(Buffer.from(res4).toString('hex')).to.equal(dataEnc4.toString('hex')) - expect(Buffer.from(res5).toString('hex')).to.equal(dataEnc5.toString('hex')) - expect(Buffer.from(res6).toString('hex')).to.equal(dataEnc6.toString('hex')) + expect(Buffer.from(res1).toString('hex')).toEqual(dataEnc1.toString('hex')) + expect(Buffer.from(res2).toString('hex')).toEqual(dataEnc2.toString('hex')) + expect(Buffer.from(res3).toString('hex')).toEqual(dataEnc3.toString('hex')) + expect(Buffer.from(res4).toString('hex')).toEqual(dataEnc4.toString('hex')) + expect(Buffer.from(res5).toString('hex')).toEqual(dataEnc5.toString('hex')) + expect(Buffer.from(res6).toString('hex')).toEqual(dataEnc6.toString('hex')) }) it('should correctly decrypt', () => { @@ -118,12 +117,12 @@ describe('aes-ctr', () => { freeCtr256(ctr) - expect(Buffer.from(res1).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res2).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res3).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res4).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res5).toString('hex')).to.equal(data.toString('hex')) - expect(Buffer.from(res6).toString('hex')).to.equal(data.toString('hex')) + expect(Buffer.from(res1).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res2).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res3).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res4).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res5).toString('hex')).toEqual(data.toString('hex')) + expect(Buffer.from(res6).toString('hex')).toEqual(data.toString('hex')) }) }) @@ -144,6 +143,6 @@ describe('aes-ctr', () => { freeCtr256(ctrDec) } - expect(mem.byteLength).to.equal(memSize) + expect(mem.byteLength).toEqual(memSize) }) }) diff --git a/packages/wasm/tests/gunzip.spec.ts b/packages/wasm/tests/gunzip.test.ts similarity index 71% rename from packages/wasm/tests/gunzip.spec.ts rename to packages/wasm/tests/gunzip.test.ts index 8111b829..ee3d3c0d 100644 --- a/packages/wasm/tests/gunzip.spec.ts +++ b/packages/wasm/tests/gunzip.test.ts @@ -1,11 +1,10 @@ /* eslint-disable no-restricted-globals */ -import { expect } from 'chai' -import { before, describe } from 'mocha' +import { beforeAll, describe, expect, it } from 'vitest' import { gzipSync } from 'zlib' import { __getWasm, gunzip, initAsync } from '../src/index.js' -before(async () => { +beforeAll(async () => { await initAsync() }) @@ -17,16 +16,16 @@ describe('gunzip', () => { const inputPtr = wasm.__malloc(data.length) new Uint8Array(wasm.memory.buffer).set(data, inputPtr) - expect(wasm.libdeflate_gzip_get_output_size(inputPtr, data.length)).to.equal(11) + expect(wasm.libdeflate_gzip_get_output_size(inputPtr, data.length)).toEqual(11) }) it('should correctly inflate', () => { const data = Array.from({ length: 1000 }, () => 'a').join('') const res = gzipSync(Buffer.from(data)) - expect(res).not.to.be.null - expect(res.length).to.be.lessThan(100) - expect(gunzip(res)).to.deep.equal(new Uint8Array(Buffer.from(data))) + expect(res).not.toBeNull() + expect(res.length).toBeLessThan(100) + expect(gunzip(res)).toEqual(new Uint8Array(Buffer.from(data))) }) it('should not leak memory', () => { @@ -38,9 +37,9 @@ describe('gunzip', () => { const res = gunzip(deflated) - expect(Buffer.from(res).toString()).to.equal(data) + expect(Buffer.from(res).toString()).toEqual(data) } - expect(__getWasm().memory.buffer.byteLength).to.equal(memSize) + expect(__getWasm().memory.buffer.byteLength).toEqual(memSize) }) }) diff --git a/packages/wasm/tests/hash.spec.ts b/packages/wasm/tests/hash.test.ts similarity index 73% rename from packages/wasm/tests/hash.spec.ts rename to packages/wasm/tests/hash.test.ts index 31d606a5..bb6d6779 100644 --- a/packages/wasm/tests/hash.spec.ts +++ b/packages/wasm/tests/hash.test.ts @@ -1,10 +1,9 @@ /* eslint-disable no-restricted-globals */ -import { expect } from 'chai' -import { before, describe } from 'mocha' +import { beforeAll, describe, expect, it } from 'vitest' import { __getWasm, initAsync, sha1, sha256 } from '../src/index.js' -before(async () => { +beforeAll(async () => { await initAsync() }) @@ -12,7 +11,7 @@ describe('sha256', () => { it('should correctly calculate sha-256 hash', () => { const hash = sha256(Buffer.from('abc')) - expect(Buffer.from(hash).toString('hex')).to.equal( + expect(Buffer.from(hash).toString('hex')).toEqual( 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', ) }) @@ -25,7 +24,7 @@ describe('sha256', () => { sha256(Buffer.from('abc')) } - expect(mem.byteLength).to.equal(memSize) + expect(mem.byteLength).toEqual(memSize) }) }) @@ -33,7 +32,7 @@ describe('sha1', () => { it('should correctly calculate sha-1 hash', () => { const hash = sha1(Buffer.from('abc')) - expect(Buffer.from(hash).toString('hex')).to.equal('a9993e364706816aba3e25717850c26c9cd0d89d') + expect(Buffer.from(hash).toString('hex')).toEqual('a9993e364706816aba3e25717850c26c9cd0d89d') }) it('should not leak memory', () => { @@ -44,6 +43,6 @@ describe('sha1', () => { sha1(Buffer.from('abc')) } - expect(mem.byteLength).to.equal(memSize) + expect(mem.byteLength).toEqual(memSize) }) }) diff --git a/packages/wasm/tests/ige.spec.ts b/packages/wasm/tests/ige.test.ts similarity index 77% rename from packages/wasm/tests/ige.spec.ts rename to packages/wasm/tests/ige.test.ts index 6bfcd2bd..121020c0 100644 --- a/packages/wasm/tests/ige.spec.ts +++ b/packages/wasm/tests/ige.test.ts @@ -1,10 +1,9 @@ /* eslint-disable no-restricted-globals */ -import { expect } from 'chai' -import { before, describe } from 'mocha' +import { beforeAll, describe, expect, it } from 'vitest' import { __getWasm, ige256Decrypt, ige256Encrypt, initAsync } from '../src/index.js' -before(async () => { +beforeAll(async () => { await initAsync() }) @@ -18,13 +17,13 @@ describe('aes-ige', () => { it('should correctly encrypt', () => { const aes = ige256Encrypt(data, key, iv) - expect(Buffer.from(aes).toString('hex')).to.equal(dataEnc.toString('hex')) + expect(Buffer.from(aes).toString('hex')).toEqual(dataEnc.toString('hex')) }) it('should correctly decrypt', () => { const aes = ige256Decrypt(dataEnc, key, iv) - expect(Buffer.from(aes).toString('hex')).to.equal(data.toString('hex')) + expect(Buffer.from(aes).toString('hex')).toEqual(data.toString('hex')) }) it('should not leak memory', () => { @@ -35,6 +34,6 @@ describe('aes-ige', () => { ige256Decrypt(ige256Encrypt(data, key, iv), key, iv) } - expect(mem.byteLength).to.equal(memSize) + expect(mem.byteLength).toEqual(memSize) }) }) diff --git a/packages/wasm/tests/zlib.spec.ts b/packages/wasm/tests/zlib.test.ts similarity index 66% rename from packages/wasm/tests/zlib.spec.ts rename to packages/wasm/tests/zlib.test.ts index 7a35dc90..03488807 100644 --- a/packages/wasm/tests/zlib.spec.ts +++ b/packages/wasm/tests/zlib.test.ts @@ -1,11 +1,10 @@ /* eslint-disable no-restricted-globals */ -import { expect } from 'chai' -import { before, describe } from 'mocha' +import { beforeAll, describe, expect, it } from 'vitest' import { inflateSync } from 'zlib' import { __getWasm, deflateMaxSize, initAsync } from '../src/index.js' -before(async () => { +beforeAll(async () => { await initAsync() }) @@ -13,23 +12,23 @@ describe('zlib deflate', () => { it('should add zlib headers', () => { const res = deflateMaxSize(Buffer.from('hello world'), 100) - expect(res).not.to.be.null - expect(res!.slice(0, 2)).to.deep.equal(Buffer.from([0x78, 0x9c])) + expect(res).not.toBeNull() + expect(res!.slice(0, 2)).toEqual(new Uint8Array([0x78, 0x9c])) }) it('should return null if compressed data is larger than size', () => { const res = deflateMaxSize(Buffer.from('hello world'), 1) - expect(res).to.be.null + expect(res).toBeNull() }) it('should correctly deflate', () => { const data = Array.from({ length: 1000 }, () => 'a').join('') const res = deflateMaxSize(Buffer.from(data), 100) - expect(res).not.to.be.null - expect(res!.length).to.be.lessThan(100) - expect(inflateSync(res!)).to.deep.equal(Buffer.from(data)) + expect(res).not.toBeNull() + expect(res!.length).toBeLessThan(100) + expect(inflateSync(res!)).toEqual(Buffer.from(data)) }) it('should not leak memory', () => { @@ -41,9 +40,9 @@ describe('zlib deflate', () => { const res = inflateSync(deflated!) - expect(Buffer.from(res).toString()).to.equal(data) + expect(Buffer.from(res).toString()).toEqual(data) } - expect(__getWasm().memory.buffer.byteLength).to.equal(memSize) + expect(__getWasm().memory.buffer.byteLength).toEqual(memSize) }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e1fd828..dcb53be5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,15 +18,6 @@ importers: '@commitlint/config-conventional': specifier: ^17.6.5 version: 17.6.5 - '@types/chai': - specifier: 4.3.5 - version: 4.3.5 - '@types/chai-spies': - specifier: ^1.0.4 - version: 1.0.4 - '@types/mocha': - specifier: 10.0.1 - version: 10.0.1 '@types/node-forge': specifier: 1.3.2 version: 1.3.2 @@ -39,12 +30,9 @@ importers: '@typescript-eslint/parser': specifier: 6.4.0 version: 6.4.0(eslint@8.47.0)(typescript@5.0.4) - chai: - specifier: 4.3.7 - version: 4.3.7 - chai-spies: - specifier: ^1.0.0 - version: 1.0.0(chai@4.3.7) + '@vitest/coverage-v8': + specifier: ^0.34.6 + version: 0.34.6(vitest@0.34.6) dotenv-flow: specifier: 3.2.0 version: 3.2.0 @@ -78,15 +66,9 @@ importers: lint-staged: specifier: ^13.2.2 version: 13.2.2 - mocha: - specifier: 10.2.0 - version: 10.2.0 node-forge: specifier: 1.3.1 version: 1.3.1 - nyc: - specifier: 15.1.0 - version: 15.1.0 prettier: specifier: 3.0.3 version: 3.0.3 @@ -108,6 +90,12 @@ importers: typescript: specifier: 5.0.4 version: 5.0.4 + vite: + specifier: ^4.5.0 + version: 4.5.0(@types/node@18.16.0) + vitest: + specifier: ^0.34.6 + version: 0.34.6 packages/client: dependencies: @@ -342,11 +330,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@ampproject/remapping@2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.9 dev: true @@ -357,136 +345,11 @@ packages: '@babel/highlight': 7.17.9 dev: true - /@babel/compat-data@7.17.7: - resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.17.9: - resolution: {integrity: sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.9 - '@babel/helper-compilation-targets': 7.17.7(@babel/core@7.17.9) - '@babel/helper-module-transforms': 7.17.7 - '@babel/helpers': 7.17.9 - '@babel/parser': 7.17.9 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 - convert-source-map: 1.8.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.17.9: - resolution: {integrity: sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - - /@babel/helper-compilation-targets@7.17.7(@babel/core@7.17.9): - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.17.7 - '@babel/core': 7.17.9 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.3 - semver: 6.3.0 - dev: true - - /@babel/helper-environment-visitor@7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-function-name@7.17.9: - resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-hoist-variables@7.16.7: - resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-module-imports@7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-module-transforms@7.17.7: - resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.17.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-simple-access@7.17.7: - resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-split-export-declaration@7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - /@babel/helper-validator-identifier@7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.17.9: - resolution: {integrity: sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.17.9: resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} engines: {node: '>=6.9.0'} @@ -496,47 +359,8 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.17.9: - resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/template@7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.9 - '@babel/types': 7.17.0 - dev: true - - /@babel/traverse@7.17.9: - resolution: {integrity: sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.9 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.9 - '@babel/types': 7.17.0 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - to-fast-properties: 2.0.0 + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true /@commitlint/cli@17.6.5: @@ -714,6 +538,204 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -739,7 +761,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 espree: 9.6.1 globals: 13.20.0 ignore: 5.2.0 @@ -765,7 +787,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -791,28 +813,25 @@ packages: wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jridgewell/gen-mapping@0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.0 - '@jridgewell/sourcemap-codec': 1.4.11 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.9 dev: true /@jridgewell/resolve-uri@3.0.6: @@ -820,6 +839,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.0: resolution: {integrity: sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==} engines: {node: '>=6.0.0'} @@ -829,6 +853,17 @@ packages: resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} dev: true + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -887,6 +922,10 @@ packages: requiresBuild: true optional: true + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -914,8 +953,8 @@ packages: '@types/node': 18.16.0 dev: true - /@types/chai-spies@1.0.4: - resolution: {integrity: sha512-HCG1EUGpVYmmqIG9rnSIxkng/tOzARG1HmUIV5miCp55ykqxSnVj2vlXaf6nDwaMm7qzkvNe9SHW15ywPKDqTA==} + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} dependencies: '@types/chai': 4.3.5 dev: true @@ -935,6 +974,10 @@ packages: rxjs: 7.8.1 dev: true + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/js-yaml@4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} dev: true @@ -951,10 +994,6 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/mocha@10.0.1: - resolution: {integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==} - dev: true - /@types/node-forge@1.3.2: resolution: {integrity: sha512-TzX3ahoi9xbmaoT58smrBu7oa6dQXb/+PTNCslZyD/55tlJ/osofIMClzZsoo6buDFrg7e4DvVGkZqVgv6OLxw==} dependencies: @@ -1002,7 +1041,7 @@ packages: '@typescript-eslint/type-utils': 6.4.0(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/utils': 6.4.0(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/visitor-keys': 6.4.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.47.0 graphemer: 1.4.0 ignore: 5.2.4 @@ -1028,7 +1067,7 @@ packages: '@typescript-eslint/types': 6.4.0 '@typescript-eslint/typescript-estree': 6.4.0(typescript@5.0.4) '@typescript-eslint/visitor-keys': 6.4.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.47.0 typescript: 5.0.4 transitivePeerDependencies: @@ -1055,7 +1094,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.4.0(typescript@5.0.4) '@typescript-eslint/utils': 6.4.0(eslint@8.47.0)(typescript@5.0.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.47.0 ts-api-utils: 1.0.1(typescript@5.0.4) typescript: 5.0.4 @@ -1079,7 +1118,7 @@ packages: dependencies: '@typescript-eslint/types': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -1116,6 +1155,65 @@ packages: eslint-visitor-keys: 3.4.1 dev: true + /@vitest/coverage-v8@0.34.6(vitest@0.34.6): + resolution: {integrity: sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==} + peerDependencies: + vitest: '>=0.32.0 <1' + dependencies: + '@ampproject/remapping': 2.2.1 + '@bcoe/v8-coverage': 0.2.3 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + magic-string: 0.30.5 + picocolors: 1.0.0 + std-env: 3.4.3 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.3 + vitest: 0.34.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + dependencies: + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.3.10 + dev: true + + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + dependencies: + '@vitest/utils': 0.34.6 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + dependencies: + magic-string: 0.30.5 + pathe: 1.1.1 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + dependencies: + tinyspy: 2.2.0 + dev: true + + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -1151,7 +1249,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false @@ -1160,7 +1258,7 @@ packages: resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 depd: 1.1.2 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -1192,11 +1290,6 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true - /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1233,25 +1326,15 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - /anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} - dependencies: - default-require-extensions: 3.0.0 - dev: true - /aproba@1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} dev: false @@ -1260,10 +1343,6 @@ packages: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: false - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: true - /are-we-there-yet@1.1.7: resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} dependencies: @@ -1283,12 +1362,6 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1389,11 +1462,6 @@ packages: engines: {node: '>=0.6'} dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: @@ -1436,22 +1504,6 @@ packages: fill-range: 7.0.1 dev: true - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - - /browserslist@4.20.3: - resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001334 - electron-to-chromium: 1.4.124 - escalade: 3.1.1 - node-releases: 2.0.4 - picocolors: 1.0.0 - dev: true - /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -1465,6 +1517,11 @@ packages: run-applescript: 5.0.0 dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /cacache@16.0.7: resolution: {integrity: sha512-a4zfQpp5vm4Ipdvbj+ZrPonikRhm6WBEd4zT1Yc1DXsmAxrPgDwWBLF/u/wTVXSFPIgOJ1U3ghSa2Xm4s3h28w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -1491,16 +1548,6 @@ packages: - bluebird dev: false - /caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - dev: true - /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -1526,33 +1573,15 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001334: - resolution: {integrity: sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==} - dev: true - - /chai-spies@1.0.0(chai@4.3.7): - resolution: {integrity: sha512-elF2ZUczBsFoP07qCfMO/zeggs8pqCf3fZGyK5+2X4AndS8jycZYID91ztD9oQ7d/0tnS963dPkd0frQEThDsg==} - engines: {node: '>= 4.0.0'} - peerDependencies: - chai: '*' - dependencies: - chai: 4.3.7 - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 + check-error: 1.0.3 deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.4 + get-func-name: 2.0.2 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -1587,8 +1616,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 dev: true /cheerio-select@2.1.0: @@ -1615,21 +1646,6 @@ packages: parse5-htmlparser2-tree-adapter: 7.0.0 dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false @@ -1674,22 +1690,6 @@ packages: engines: {node: '>= 12'} dev: false - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1741,10 +1741,6 @@ packages: engines: {node: '>=14'} dev: true - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: @@ -1789,10 +1785,8 @@ packages: through2: 4.0.2 dev: true - /convert-source-map@1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} - dependencies: - safe-buffer: 5.1.2 + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true /core-util-is@1.0.3: @@ -1880,7 +1874,7 @@ packages: ms: 2.1.3 dev: true - /debug@4.3.4(supports-color@8.1.1): + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1890,7 +1884,6 @@ packages: optional: true dependencies: ms: 2.1.2 - supports-color: 8.1.1 /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -1905,11 +1898,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - dev: true - /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -1951,13 +1939,6 @@ packages: titleize: 3.0.0 dev: false - /default-require-extensions@3.0.0: - resolution: {integrity: sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==} - engines: {node: '>=8'} - dependencies: - strip-bom: 4.0.0 - dev: true - /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: @@ -1990,13 +1971,13 @@ packages: engines: {node: '>=8'} dev: false - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true @@ -2105,10 +2086,6 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /electron-to-chromium@1.4.124: - resolution: {integrity: sha512-VhaE9VUYU6d2eIb+4xf83CATD+T+3bTzvxvlADkQE+c2hisiw3sZmvEDtsW704+Zky9WZGhBuQXijDVqSriQLA==} - dev: true - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2225,8 +2202,34 @@ packages: is-symbol: 1.0.4 dev: true - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 dev: true /escalade@3.1.1: @@ -2275,7 +2278,7 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 enhanced-resolve: 5.14.1 eslint: 8.47.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) @@ -2402,7 +2405,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -2442,12 +2445,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -2590,15 +2587,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2623,11 +2611,6 @@ packages: rimraf: 3.0.2 dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - /flatted@3.2.5: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} dev: true @@ -2638,14 +2621,6 @@ packages: is-callable: 1.2.7 dev: true - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true - /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -2653,10 +2628,6 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.0.2 - /fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - dev: true - /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -2732,18 +2703,13 @@ packages: wide-align: 1.1.5 dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true /get-intrinsic@1.2.1: @@ -2754,11 +2720,6 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2859,11 +2820,6 @@ packages: ini: 1.3.8 dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} @@ -2965,19 +2921,6 @@ packages: dependencies: function-bind: 1.1.1 - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - dev: true - - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -3021,7 +2964,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false @@ -3031,7 +2974,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false @@ -3174,13 +3117,6 @@ packages: has-bigints: 1.0.2 dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -3301,11 +3237,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3360,10 +3291,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -3379,11 +3306,6 @@ packages: call-bind: 1.0.2 dev: true - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -3403,44 +3325,12 @@ packages: engines: {node: '>=8'} dev: true - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - dependencies: - append-transform: 2.0.0 - dev: true - - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.17.9 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-processinfo@2.0.2: - resolution: {integrity: sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==} - engines: {node: '>=8'} - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.3 - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 3.4.0 - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + make-dir: 4.0.0 supports-color: 7.2.0 dev: true @@ -3448,19 +3338,19 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.4: - resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 dev: true /jackspeak@2.3.6: @@ -3475,14 +3365,6 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -3490,12 +3372,6 @@ packages: argparse: 2.0.1 dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -3572,7 +3448,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 7.1.1 lilconfig: 2.1.0 listr2: 5.0.8 @@ -3606,6 +3482,11 @@ packages: wrap-ansi: 7.0.0 dev: true + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -3624,10 +3505,6 @@ packages: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - dev: true - /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} dev: true @@ -3688,10 +3565,10 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false - /loupe@2.3.4: - resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lru-cache@6.0.0: @@ -3713,11 +3590,18 @@ packages: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} dependencies: - semver: 6.3.0 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 dev: true /make-error@1.3.6: @@ -3821,13 +3705,6 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@5.1.0: resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} engines: {node: '>=10'} @@ -3928,32 +3805,13 @@ packages: hasBin: true dev: false - /mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} - engines: {node: '>= 14.0.0'} - hasBin: true + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.1 dev: true /ms@2.1.2: @@ -3967,8 +3825,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: false - /nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -4022,17 +3880,6 @@ packages: - supports-color dev: false - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} - dependencies: - process-on-spawn: 1.0.0 - dev: true - - /node-releases@2.0.4: - resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==} - dev: true - /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -4107,42 +3954,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.8.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.2 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.0.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - dev: true - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4266,6 +4077,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -4280,13 +4098,6 @@ packages: p-limit: 3.1.0 dev: true - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - dependencies: - aggregate-error: 3.1.0 - dev: true - /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -4298,16 +4109,6 @@ packages: engines: {node: '>=6'} dev: true - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - dependencies: - graceful-fs: 4.2.10 - hasha: 5.2.2 - lodash.flattendeep: 4.4.0 - release-zalgo: 1.0.0 - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4371,6 +4172,10 @@ packages: engines: {node: '>=8'} dev: true + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true @@ -4390,11 +4195,21 @@ packages: hasBin: true dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: - find-up: 4.1.0 + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 dev: true /prebuild-install@7.1.0: @@ -4428,6 +4243,15 @@ packages: hasBin: true dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /printj@1.1.2: resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} engines: {node: '>=0.8'} @@ -4438,13 +4262,6 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} - dependencies: - fromentries: 1.3.2 - dev: true - /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -4488,12 +4305,6 @@ packages: engines: {node: '>=8'} dev: true - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4504,6 +4315,10 @@ packages: strip-json-comments: 2.0.1 dev: false + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -4543,13 +4358,6 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -4567,13 +4375,6 @@ packages: functions-have-names: 1.2.3 dev: true - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - dependencies: - es6-error: 4.1.1 - dev: true - /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4584,10 +4385,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4662,6 +4459,14 @@ packages: glob: 10.2.6 dev: true + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} engines: {node: '>=12'} @@ -4687,6 +4492,7 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -4709,11 +4515,6 @@ packages: hasBin: true dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4742,14 +4543,9 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - dependencies: - randombytes: 2.1.0 - dev: true - /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -4778,6 +4574,10 @@ packages: object-inspect: 1.12.3 dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4838,7 +4638,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 socks: 2.6.2 transitivePeerDependencies: - supports-color @@ -4852,8 +4652,8 @@ packages: smart-buffer: 4.2.0 dev: false - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true @@ -4861,18 +4661,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - dev: true - /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -4901,10 +4689,6 @@ packages: readable-stream: 3.6.0 dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - /ssri@9.0.0: resolution: {integrity: sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -4912,6 +4696,14 @@ packages: minipass: 3.1.6 dev: false + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + dev: true + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5002,11 +4794,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -5032,6 +4819,12 @@ packages: engines: {node: '>=8'} dev: true + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5045,12 +4838,6 @@ packages: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -5121,6 +4908,20 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + dev: true + + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -5133,11 +4934,6 @@ packages: os-tmpdir: 1.0.2 dev: false - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5261,12 +5057,6 @@ packages: is-typed-array: 1.1.10 dev: true - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - /typedoc@0.25.3(typescript@5.0.4): resolution: {integrity: sha512-Ow8Bo7uY1Lwy7GTmphRIMEo6IOZ+yYUyrc8n5KXIZg1svpqhZSWgni2ZrDhe+wLosFS8yswowUzljTAV/3jmWw==} engines: {node: '>= 16'} @@ -5293,6 +5083,10 @@ packages: hasBin: true dev: true + /ufo@1.3.1: + resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} + dev: true + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -5341,16 +5135,19 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true - /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -5358,6 +5155,129 @@ packages: spdx-expression-parse: 3.0.1 dev: true + /vite-node@0.34.6(@types/node@18.16.0): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.2 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.5.0(@types/node@18.16.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.5.0(@types/node@18.16.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.16.0 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.5 + '@types/node': 18.16.0 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.10 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.5 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.7.0 + vite: 4.5.0(@types/node@18.16.0) + vite-node: 0.34.6(@types/node@18.16.0) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} dev: true @@ -5381,10 +5301,6 @@ packages: is-symbol: 1.0.4 dev: true - /which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - dev: true - /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} @@ -5404,6 +5320,15 @@ packages: dependencies: isexe: 2.0.0 + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -5414,10 +5339,6 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: false - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - dev: true - /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -5445,15 +5366,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} @@ -5467,10 +5379,6 @@ packages: optional: true dev: true - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5484,19 +5392,6 @@ packages: engines: {node: '>= 14'} dev: true - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true - /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -5507,46 +5402,6 @@ packages: engines: {node: '>=12'} dev: true - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - dev: true - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -5569,3 +5424,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/scripts/build-package.js b/scripts/build-package.js index 5418a029..6918ff85 100644 --- a/scripts/build-package.js +++ b/scripts/build-package.js @@ -125,7 +125,23 @@ buildConfig.before() if (buildConfig.buildTs) { console.log('[i] Building typescript...') - exec('pnpm exec tsc --build', { cwd: packageDir, stdio: 'inherit' }) + + fs.cpSync(path.join(packageDir, 'tsconfig.json'), path.join(packageDir, 'tsconfig.backup.json')) + + let tsconfig = fs.readFileSync(path.join(packageDir, 'tsconfig.backup.json'), 'utf-8') + // what the fuck + tsconfig = tsconfig.replace( + /("extends": "\.\.\/\.\.\/tsconfig\.json",)/, + '$1"exclude": ["**/*.{test,test-utils}.ts"],', + ) + fs.writeFileSync(path.join(packageDir, 'tsconfig.json'), tsconfig) + + try { + exec('pnpm exec tsc --build', { cwd: packageDir, stdio: 'inherit' }) + } catch (e) { + fs.renameSync(path.join(packageDir, 'tsconfig.backup.json'), path.join(packageDir, 'tsconfig.json')) + throw e + } if (buildConfig.buildCjs) { console.log('[i] Building typescript (CJS)...') @@ -156,6 +172,8 @@ if (buildConfig.buildTs) { if (error) throw error } + fs.renameSync(path.join(packageDir, 'tsconfig.backup.json'), path.join(packageDir, 'tsconfig.json')) + console.log('[i] Post-processing...') if (buildConfig.removeReferenceComments) { diff --git a/vite.config.mts b/vite.config.mts new file mode 100644 index 00000000..4fddc942 --- /dev/null +++ b/vite.config.mts @@ -0,0 +1,15 @@ +/// +import { defineConfig } from 'vite' + +export default defineConfig({ + test: { + include: [ + 'packages/**/*.test.ts', + ], + typecheck: { + include: [ + 'packages/**/*.test-d.ts', + ], + } + }, +})