diff --git a/mocha.bootstrap.js b/mocha.bootstrap.js deleted file mode 100644 index b0d9fb3b..00000000 --- a/mocha.bootstrap.js +++ /dev/null @@ -1,13 +0,0 @@ -const chai = require('chai'); -const sinonChai = require('sinon-chai'); -const chaiAsPromised = require('chai-as-promised'); - -const config = require('./tsconfig.json'); - -config.compilerOptions.module = 'commonjs'; -config.transpileOnly = true; - -require('ts-node').register(config); - -chai.use(sinonChai); -chai.use(chaiAsPromised); diff --git a/package.json b/package.json index 25e75830..6982a81f 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,14 @@ "format": "prettier --cache --write .", "lint": "eslint --cache --cache-strategy content --report-unused-disable-directives .", "ts-check": "tsc", - "test": "cross-env NODE_ENV=test mocha --require ./mocha.bootstrap.js \"test/*.ts\"", + "test": "vitest", + "test:update-snapshots": "vitest run -u", + "coverage": "vitest run --coverage", "docs:dev": "docsify serve docs", "premigrate": "run-s build:bin", "migrate": "node bin/node-pg-migrate.js", "prepublishOnly": "pnpm run clean && pnpm install && pnpm run build", - "preflight": "pnpm install && run-s format build lint test ts-check" + "preflight": "pnpm install && run-s format build lint test:update-snapshots ts-check" }, "bin": { "node-pg-migrate": "bin/node-pg-migrate.js" @@ -100,20 +102,14 @@ "devDependencies": { "@eslint-types/prettier": "5.1.3", "@eslint-types/typescript-eslint": "7.0.2", - "@types/chai": "4.3.12", - "@types/chai-as-promised": "7.1.8", "@types/mkdirp": "1.0.2", - "@types/mocha": "9.1.1", - "@types/node": "~16.18.86", + "@types/node": "18.19.21", "@types/pg": "8.11.2", - "@types/proxyquire": "1.3.31", - "@types/sinon": "10.0.20", - "@types/sinon-chai": "3.2.12", "@types/yargs": "17.0.32", "@typescript-eslint/eslint-plugin": "7.1.0", "@typescript-eslint/parser": "7.1.0", - "chai": "4.4.1", - "chai-as-promised": "7.1.1", + "@vitest/coverage-v8": "1.3.1", + "@vitest/ui": "1.3.1", "config": "3.3.11", "cross-env": "7.0.3", "docsify-cli": "4.4.4", @@ -125,18 +121,15 @@ "eslint-gitignore": "0.1.0", "eslint-plugin-prettier": "5.1.3", "json5": "2.2.0", - "mocha": "9.2.2", "npm-run-all2": "6.1.2", "pg": "8.11.3", "prettier": "3.2.5", "prettier-plugin-organize-imports": "3.2.4", - "proxyquire": "2.1.3", "rimraf": "5.0.5", - "sinon": "12.0.1", - "sinon-chai": "3.7.0", "ts-node": "10.9.2", "tsup": "8.0.2", - "typescript": "4.8.4" + "typescript": "4.8.4", + "vitest": "1.3.1" }, "peerDependencies": { "@types/pg": ">=6.0.0 <9.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f56dc4f0..301a61a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,33 +22,15 @@ devDependencies: '@eslint-types/typescript-eslint': specifier: 7.0.2 version: 7.0.2 - '@types/chai': - specifier: 4.3.12 - version: 4.3.12 - '@types/chai-as-promised': - specifier: 7.1.8 - version: 7.1.8 '@types/mkdirp': specifier: 1.0.2 version: 1.0.2 - '@types/mocha': - specifier: 9.1.1 - version: 9.1.1 '@types/node': - specifier: ~16.18.86 - version: 16.18.86 + specifier: 18.19.21 + version: 18.19.21 '@types/pg': specifier: 8.11.2 version: 8.11.2 - '@types/proxyquire': - specifier: 1.3.31 - version: 1.3.31 - '@types/sinon': - specifier: 10.0.20 - version: 10.0.20 - '@types/sinon-chai': - specifier: 3.2.12 - version: 3.2.12 '@types/yargs': specifier: 17.0.32 version: 17.0.32 @@ -58,12 +40,12 @@ devDependencies: '@typescript-eslint/parser': specifier: 7.1.0 version: 7.1.0(eslint@8.57.0)(typescript@4.8.4) - chai: - specifier: 4.4.1 - version: 4.4.1 - chai-as-promised: - specifier: 7.1.1 - version: 7.1.1(chai@4.4.1) + '@vitest/coverage-v8': + specifier: 1.3.1 + version: 1.3.1(vitest@1.3.1) + '@vitest/ui': + specifier: 1.3.1 + version: 1.3.1(vitest@1.3.1) config: specifier: 3.3.11 version: 3.3.11 @@ -97,9 +79,6 @@ devDependencies: json5: specifier: 2.2.0 version: 2.2.0 - mocha: - specifier: 9.2.2 - version: 9.2.2 npm-run-all2: specifier: 6.1.2 version: 6.1.2 @@ -112,27 +91,21 @@ devDependencies: prettier-plugin-organize-imports: specifier: 3.2.4 version: 3.2.4(prettier@3.2.5)(typescript@4.8.4) - proxyquire: - specifier: 2.1.3 - version: 2.1.3 rimraf: specifier: 5.0.5 version: 5.0.5 - sinon: - specifier: 12.0.1 - version: 12.0.1 - sinon-chai: - specifier: 3.7.0 - version: 3.7.0(chai@4.4.1)(sinon@12.0.1) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@16.18.86)(typescript@4.8.4) + version: 10.9.2(@types/node@18.19.21)(typescript@4.8.4) tsup: specifier: 8.0.2 version: 8.0.2(ts-node@10.9.2)(typescript@4.8.4) typescript: specifier: 4.8.4 version: 4.8.4 + vitest: + specifier: 1.3.1 + version: 1.3.1(@types/node@18.19.21)(@vitest/ui@1.3.1) packages: @@ -141,6 +114,45 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.24.0: + resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -432,6 +444,18 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@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.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -502,6 +526,10 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dev: true + /@polka/url@1.0.0-next.24: + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + dev: true + /@rollup/rollup-android-arm-eabi@4.12.0: resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} cpu: [arm] @@ -606,47 +634,15 @@ packages: dev: true optional: true + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} dev: true - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@11.2.2: - resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - - /@sinonjs/fake-timers@8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /@sinonjs/samsam@6.1.3: - resolution: {integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==} - dependencies: - '@sinonjs/commons': 1.8.6 - lodash.get: 4.4.2 - type-detect: 4.0.8 - dev: true - - /@sinonjs/text-encoding@0.7.2: - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - dev: true - /@szmarczak/http-timer@1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -670,20 +666,14 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/chai-as-promised@7.1.8: - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - dependencies: - '@types/chai': 4.3.12 - dev: true - - /@types/chai@4.3.12: - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} - dev: true - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -691,62 +681,39 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 16.18.86 + '@types/node': 18.19.21 dev: true /@types/mkdirp@1.0.2: resolution: {integrity: sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==} dependencies: - '@types/node': 16.18.86 + '@types/node': 18.19.21 dev: true - /@types/mocha@9.1.1: - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - dev: true - - /@types/node@16.18.86: - resolution: {integrity: sha512-QMvdZf+ZTSiv7gspwhqbfB7Y5DmbYgCsUnakS8Ul9uRbJQehDKaM7SL+GbcDS003Lh7VK4YlelHsRm9HCv26eA==} + /@types/node@18.19.21: + resolution: {integrity: sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==} + dependencies: + undici-types: 5.26.5 dev: true /@types/pg@8.11.2: resolution: {integrity: sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw==} dependencies: - '@types/node': 16.18.86 + '@types/node': 18.19.21 pg-protocol: 1.6.0 pg-types: 4.0.2 dev: true - /@types/proxyquire@1.3.31: - resolution: {integrity: sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==} - dev: true - /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 16.18.86 + '@types/node': 18.19.21 dev: true /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/sinon-chai@3.2.12: - resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} - dependencies: - '@types/chai': 4.3.12 - '@types/sinon': 10.0.20 - dev: true - - /@types/sinon@10.0.20: - resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} - dependencies: - '@types/sinonjs__fake-timers': 8.1.5 - dev: true - - /@types/sinonjs__fake-timers@8.1.5: - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - dev: true - /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true @@ -889,14 +856,87 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@ungap/promise-all-settled@1.1.2: - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - dev: true - /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true + /@vitest/coverage-v8@1.3.1(vitest@1.3.1): + resolution: {integrity: sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==} + peerDependencies: + vitest: 1.3.1 + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + magic-string: 0.30.8 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.3.1(@types/node@18.19.21)(@vitest/ui@1.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@1.3.1: + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + dependencies: + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.3.1: + resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + dependencies: + '@vitest/utils': 1.3.1 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.3.1: + resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + dependencies: + magic-string: 0.30.8 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.3.1: + resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/ui@1.3.1(vitest@1.3.1): + resolution: {integrity: sha512-2UrFLJ62c/eJGPHcclstMKlAR7E1WB1ITe1isuowEPJJHi3HfqofvsUqQ1cGrEF7kitG1DJuwURUA3HLDtQkXA==} + peerDependencies: + vitest: 1.3.1 + dependencies: + '@vitest/utils': 1.3.1 + fast-glob: 3.3.2 + fflate: 0.8.2 + flatted: 3.3.1 + pathe: 1.1.2 + picocolors: 1.0.0 + sirv: 2.0.4 + vitest: 1.3.1(@types/node@18.19.21)(@vitest/ui@1.3.1) + dev: true + + /@vitest/utils@1.3.1: + resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -931,11 +971,6 @@ packages: string-width: 4.2.3 dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true - /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -973,6 +1008,11 @@ 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'} @@ -1089,10 +1129,6 @@ packages: fill-range: 7.0.1 dev: true - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - /buffer-writer@2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} @@ -1147,20 +1183,6 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /chai-as-promised@7.1.1(chai@4.4.1): - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} - peerDependencies: - chai: '>= 2.1.2 < 5' - dependencies: - chai: 4.4.1 - check-error: 1.0.3 - dev: true - /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -1216,21 +1238,6 @@ packages: get-func-name: 2.0.2 dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - 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 - /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1263,14 +1270,6 @@ packages: 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'} @@ -1354,6 +1353,10 @@ packages: - supports-color dev: true + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cp-file@7.0.0: resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} engines: {node: '>=8'} @@ -1401,19 +1404,6 @@ packages: ms: 2.0.0 dev: true - /debug@4.3.3(supports-color@8.1.1): - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1431,11 +1421,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 - /decamelize@5.0.1: resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} engines: {node: '>=10'} @@ -1496,18 +1481,13 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - 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.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true @@ -1751,6 +1731,7 @@ packages: /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + dev: false /escape-goat@2.1.1: resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} @@ -1908,6 +1889,12 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1933,6 +1920,21 @@ packages: strip-final-newline: 2.0.0 dev: true + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -1966,6 +1968,10 @@ packages: reusify: 1.0.4 dev: true + /fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + dev: true + /figlet@1.7.0: resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} engines: {node: '>= 0.4.0'} @@ -1979,14 +1985,6 @@ packages: flat-cache: 3.2.0 dev: true - /fill-keys@1.0.2: - resolution: {integrity: sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==} - engines: {node: '>=0.10.0'} - dependencies: - is-object: 1.0.2 - merge-descriptors: 1.0.3 - dev: true - /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -2034,11 +2032,6 @@ packages: rimraf: 3.0.2 dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - /flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true @@ -2144,6 +2137,11 @@ packages: engines: {node: '>=10'} dev: true + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -2179,17 +2177,6 @@ packages: path-scurry: 1.10.1 dev: true - /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -2267,11 +2254,6 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - dev: true - /has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} @@ -2328,9 +2310,8 @@ packages: function-bind: 1.1.2 dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true /http-cache-semantics@4.1.1: @@ -2353,6 +2334,11 @@ packages: engines: {node: '>=10.17.0'} dev: true + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -2445,12 +2431,6 @@ packages: ci-info: 2.0.0 dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.1 - dev: true - /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -2509,20 +2489,11 @@ packages: engines: {node: '>=8'} dev: true - /is-object@1.0.2: - resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} - dev: true - /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} 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'} @@ -2543,6 +2514,11 @@ packages: engines: {node: '>=8'} dev: true + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -2568,11 +2544,6 @@ packages: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -2596,6 +2567,39 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + /jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -2610,6 +2614,10 @@ packages: engines: {node: '>=10'} dev: true + /js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + dev: true + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2652,16 +2660,16 @@ packages: hasBin: true dev: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 dev: true - /just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} - dev: true - /keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} dependencies: @@ -2721,6 +2729,14 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + dev: true + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2735,10 +2751,6 @@ packages: p-locate: 5.0.0 dev: true - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -2747,14 +2759,6 @@ packages: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - /loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: @@ -2789,6 +2793,21 @@ packages: yallist: 4.0.0 dev: true + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + dependencies: + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + source-map-js: 1.0.2 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2796,6 +2815,13 @@ packages: semver: 6.3.1 dev: true + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.0 + dev: true + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -2815,10 +2841,6 @@ packages: engines: {node: '>= 0.10.0'} dev: true - /merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - dev: true - /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -2847,6 +2869,11 @@ packages: engines: {node: '>=6'} dev: true + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -2863,13 +2890,6 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 1.1.11 - dev: true - /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2892,39 +2912,18 @@ packages: hasBin: true dev: false - /mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.4.0 dev: true - /module-not-found-error@1.0.1: - resolution: {integrity: sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==} + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} dev: true /ms@2.0.0: @@ -2947,8 +2946,8 @@ packages: thenify-all: 1.6.0 dev: true - /nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -2961,16 +2960,6 @@ packages: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} dev: true - /nise@5.1.9: - resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 6.2.0 - path-to-regexp: 6.2.1 - dev: true - /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3019,6 +3008,13 @@ packages: path-key: 3.1.1 dev: true + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3074,6 +3070,13 @@ packages: mimic-fn: 2.1.0 dev: true + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + /open@6.4.0: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} engines: {node: '>=8'} @@ -3133,6 +3136,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -3205,8 +3215,9 @@ packages: engines: {node: '>=8'} dev: true - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} dev: true /path-scurry@1.10.1: @@ -3217,15 +3228,15 @@ packages: minipass: 7.0.4 dev: true - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true @@ -3312,6 +3323,10 @@ packages: split2: 4.2.0 dev: true + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -3328,6 +3343,14 @@ packages: engines: {node: '>= 6'} dev: true + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + dev: true + /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -3346,10 +3369,19 @@ packages: optional: true dependencies: lilconfig: 3.1.1 - ts-node: 10.9.2(@types/node@16.18.86)(typescript@4.8.4) + ts-node: 10.9.2(@types/node@18.19.21)(typescript@4.8.4) yaml: 2.4.0 dev: true + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -3438,19 +3470,20 @@ 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 + /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} dev: true - /proxyquire@2.1.3: - resolution: {integrity: sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==} - dependencies: - fill-keys: 1.0.2 - module-not-found-error: 1.0.1 - resolve: 1.22.8 - dev: true - /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -3474,12 +3507,6 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -3495,6 +3522,10 @@ packages: strip-json-comments: 2.0.1 dev: true + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /read-package-json-fast@3.0.2: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3556,15 +3587,6 @@ packages: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: @@ -3630,10 +3652,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} @@ -3684,12 +3702,6 @@ packages: - supports-color dev: true - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - dependencies: - randombytes: 2.1.0 - dev: true - /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -3758,6 +3770,10 @@ packages: object-inspect: 1.13.1 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==} dev: true @@ -3767,25 +3783,13 @@ packages: engines: {node: '>=14'} dev: true - /sinon-chai@3.7.0(chai@4.4.1)(sinon@12.0.1): - resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} - peerDependencies: - chai: ^4.0.0 - sinon: '>=4.0.0' - dependencies: - chai: 4.4.1 - sinon: 12.0.1 - dev: true - - /sinon@12.0.1: - resolution: {integrity: sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==} + /sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 8.1.0 - '@sinonjs/samsam': 6.1.3 - diff: 5.2.0 - nise: 5.1.9 - supports-color: 7.2.0 + '@polka/url': 1.0.0-next.24 + mrmime: 2.0.0 + totalist: 3.0.1 dev: true /slash@3.0.0: @@ -3793,6 +3797,16 @@ packages: engines: {node: '>=8'} dev: true + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -3805,6 +3819,10 @@ packages: engines: {node: '>= 10.x'} dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -3815,6 +3833,10 @@ packages: engines: {node: '>= 0.8'} dev: true + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3882,6 +3904,11 @@ packages: engines: {node: '>=6'} dev: true + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3899,6 +3926,12 @@ packages: engines: {node: '>=8'} dev: true + /strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + dependencies: + js-tokens: 8.0.3 + dev: true + /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3932,18 +3965,6 @@ packages: has-flag: 4.0.0 dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - /synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3957,6 +3978,15 @@ packages: engines: {node: '>=8'} dev: true + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -3974,11 +4004,30 @@ packages: any-promise: 1.3.0 dev: true + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + /tinydate@1.3.0: resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} engines: {node: '>=4'} dev: true + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + /to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -3996,6 +4045,11 @@ packages: engines: {node: '>=0.6'} dev: true + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true @@ -4024,7 +4078,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node@10.9.2(@types/node@16.18.86)(typescript@4.8.4): + /ts-node@10.9.2(@types/node@18.19.21)(typescript@4.8.4): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -4043,7 +4097,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.86 + '@types/node': 18.19.21 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -4180,6 +4234,10 @@ packages: hasBin: true dev: true + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -4189,6 +4247,10 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -4247,6 +4309,129 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /vite-node@1.3.1(@types/node@18.19.21): + resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.1.5(@types/node@18.19.21) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.1.5(@types/node@18.19.21): + resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + 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.19.21 + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.3.1(@types/node@18.19.21)(@vitest/ui@1.3.1): + resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.3.1 + '@vitest/ui': 1.3.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 18.19.21 + '@vitest/expect': 1.3.1 + '@vitest/runner': 1.3.1 + '@vitest/snapshot': 1.3.1 + '@vitest/spy': 1.3.1 + '@vitest/ui': 1.3.1(vitest@1.3.1) + '@vitest/utils': 1.3.1 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.8 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.5(@types/node@18.19.21) + vite-node: 1.3.1(@types/node@18.19.21) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true @@ -4303,6 +4488,15 @@ packages: isexe: 2.0.0 dev: true + /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 + /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -4310,10 +4504,6 @@ packages: string-width: 4.2.3 dev: true - /workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - dev: true - /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -4383,6 +4573,7 @@ packages: /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + dev: false /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -4414,26 +4605,11 @@ packages: decamelize: 1.2.0 dev: true - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true - /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: false - /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'} @@ -4451,19 +4627,6 @@ packages: 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.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: true - /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -4486,3 +4649,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/test/db-test.ts b/test/db-test.ts deleted file mode 100644 index 3ec31e19..00000000 --- a/test/db-test.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import type { SinonSandbox, SinonStub } from 'sinon'; -import sinon from 'sinon'; - -class Client { - /* eslint-disable */ - constructor() {} - - async connect() {} - - async query(...args: any[]) {} - - async end() {} - /* eslint-enable */ -} - -const pgMock = { - Client, -}; - -const { default: Db } = proxyquire('../src/db', { pg: pgMock }); - -describe('lib/db', () => { - let sandbox: SinonSandbox; - const log: typeof console.log = () => null; - const client = new Client(); - - beforeEach(() => { - sandbox = sinon.createSandbox(); - }); - - afterEach(() => { - sandbox.restore(); - }); - - describe('.constructor( connection )', () => { - let db: typeof Db; - afterEach(() => { - if (db) { - db.close(); - } - }); - - it('pg.Client should be called with connection string', () => { - const mocked = sandbox.stub(pgMock, 'Client').returns(client); - db = Db('connection_string'); - expect(mocked).to.be.calledWith('connection_string'); - }); - - it('should use external client', () => { - const mockClient = new pgMock.Client(); - const mocked = sandbox - .stub(mockClient, 'query') - .returns(Promise.resolve()); - - db = Db(mockClient, log); - return db.query('query').then(() => { - expect(mocked.getCall(0).args[0]).to.equal('query'); - }); - }); - }); - - describe('.query( query )', () => { - let db: typeof Db; - let connectMock: SinonStub; - let queryMock: SinonStub; - beforeEach(() => { - sandbox.stub(pgMock, 'Client').returns(client); - connectMock = sandbox.stub(client, 'connect').returns(Promise.resolve()); - queryMock = sandbox.stub(client, 'query').returns(Promise.resolve()); - db = Db(undefined, log); - }); - afterEach(() => { - db.close(); - }); - - it('should call client.connect if this is the first query', () => { - connectMock.callsFake((fn) => fn()); - queryMock.returns(Promise.resolve()); - return db.query('query').then(() => { - expect(connectMock).to.be.calledOnce; - }); - }); - it('should not call client.connect on subsequent queries', () => { - connectMock.callsFake((fn) => fn()); - queryMock.returns(Promise.resolve()); - return db - .query('query_one') - .then(() => db.query('query_two')) - .then(() => { - expect(connectMock).to.be.calledOnce; - }); - }); - it('should call client.query with query', () => { - connectMock.callsFake((fn) => fn()); - queryMock.returns(Promise.resolve()); - return db.query('query').then(() => { - expect(queryMock.getCall(0).args[0]).to.equal('query'); - }); - }); - it('should not call client.query if client.connect fails', () => { - const error = 'error'; - connectMock.callsFake((fn) => fn(error)); - return expect(db.query('query')) - .to.eventually.be.rejectedWith(error) - .then(() => expect(queryMock).to.not.been.called); - }); - it('should resolve promise if query throws no error', () => { - connectMock.callsFake((fn) => fn()); - const result = 'result'; - queryMock.returns(Promise.resolve(result)); - return expect(db.query('query')).to.eventually.equal(result); - }); - it('should reject promise if query throws error', () => { - connectMock.callsFake((fn) => fn()); - const error = 'error'; - // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors - queryMock.returns(Promise.reject(error)); - return expect(db.query('query')).to.eventually.be.rejectedWith(error); - }); - }); - - describe('.close()', () => { - let db: typeof Db; - beforeEach(() => { - sandbox.stub(pgMock, 'Client').returns(client); - sandbox.stub(client, 'end').returns(Promise.resolve()); - db = Db(); - }); - afterEach(() => { - db.close(); - }); - - it('should call client.end', () => { - return db.close().then(() => expect(client.end).to.be.calledOnce); - }); - }); -}); diff --git a/test/db.spec.ts b/test/db.spec.ts new file mode 100644 index 00000000..ffaf345a --- /dev/null +++ b/test/db.spec.ts @@ -0,0 +1,131 @@ +import { Client } from 'pg'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import type { DBConnection } from '../src/db'; +import Db from '../src/db'; +import type { Logger } from '../src/types'; + +const hoisted = vi.hoisted(() => ({ + client: { + connect: vi.fn(), + end: vi.fn(), + query: vi.fn(), + }, +})); + +vi.mock('pg', () => ({ + Client: vi.fn().mockImplementation(() => hoisted.client), +})); + +describe('lib/db', () => { + const log: Logger = { + debug: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }; + + describe('.constructor(connection)', () => { + let db: DBConnection; + + afterEach(() => { + if (db) { + db.close(); + } + }); + + it('pg.Client should be called with connection string', () => { + db = Db('connection_string'); + + expect(Client).toBeCalledWith('connection_string'); + }); + + it('should use external client', async () => { + const mockClient = new Client(); + const mocked = vi.spyOn(mockClient, 'query'); + + db = Db(mockClient, log); + + await db.query('query'); + + expect(mocked).toHaveBeenCalledOnce(); + expect(mocked).toHaveBeenCalledWith('query', undefined); + }); + }); + + describe('.query(query)', () => { + let db: DBConnection; + + beforeEach(() => { + // @ts-expect-error: JS test + db = Db(undefined, log); + }); + + afterEach(() => { + db.close(); + + vi.clearAllMocks(); + }); + + it('should call client.connect if this is the first query', async () => { + vi.spyOn(hoisted.client, 'connect').mockImplementation((fn) => fn()); + + await db.query('query'); + + expect(hoisted.client.connect).toHaveBeenCalledOnce(); + }); + + it('should not call client.connect on subsequent queries', async () => { + await db.query('query_one'); + await db.query('query_two'); + + expect(hoisted.client.connect).toHaveBeenCalledOnce(); + }); + + it('should call client.query with query', async () => { + await db.query('query'); + + expect(hoisted.client.query).toHaveBeenCalledOnce(); + expect(hoisted.client.query).toHaveBeenCalledWith('query', undefined); + }); + + it('should not call client.query if client.connect fails', () => { + const error = 'error'; + + vi.spyOn(hoisted.client, 'connect').mockImplementation((fn) => + fn(new Error(error)) + ); + + expect(() => db.query('query')).rejects.toThrow(error); + expect(hoisted.client.query).not.toHaveBeenCalled(); + }); + + it('should resolve promise if query throws no error', () => { + const result = 'result'; + + vi.spyOn(hoisted.client, 'connect').mockImplementation((fn) => fn()); + vi.spyOn(hoisted.client, 'query').mockResolvedValue(result); + + expect(db.query('query')).resolves.toBe(result); + }); + + it('should reject promise if query throws error', () => { + const error = 'error'; + + vi.spyOn(hoisted.client, 'query').mockRejectedValue(new Error(error)); + + expect(() => db.query('query')).rejects.toThrow(error); + expect(hoisted.client.connect).toHaveBeenCalledOnce(); + }); + }); + + describe('.close()', () => { + it('should call client.end', async () => { + // @ts-expect-error: JS test + const db = Db(); + + await db.close(); + + expect(hoisted.client.end).toHaveBeenCalled(); + }); + }); +}); diff --git a/test/indexes-test.ts b/test/indexes.spec.ts similarity index 90% rename from test/indexes-test.ts rename to test/indexes.spec.ts index 0ce6d808..87bf9c9b 100644 --- a/test/indexes-test.ts +++ b/test/indexes.spec.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai'; +import { describe, expect, it } from 'vitest'; import * as Indexes from '../src/operations/indexes'; import { options1, options2 } from './utils'; @@ -13,10 +13,11 @@ describe('lib/operations/indexes', () => { ]; const sql1 = Indexes.createIndex(options1)(...args); const sql2 = Indexes.createIndex(options2)(...args); - expect(sql1).to.equal( + + expect(sql1).toBe( 'CREATE INDEX "myTable_colA_colB_index" ON "mySchema"."myTable" ("colA", "colB");' ); - expect(sql2).to.equal( + expect(sql2).toBe( 'CREATE INDEX "my_table_col_a_col_b_index" ON "my_schema"."my_table" ("col_a", "col_b");' ); }); @@ -34,10 +35,11 @@ describe('lib/operations/indexes', () => { ]; const sql1 = Indexes.createIndex(options1)(...args); const sql2 = Indexes.createIndex(options2)(...args); - expect(sql1).to.equal( + + expect(sql1).toBe( 'CREATE INDEX "zIndex" ON "xTable" USING gist ("yName" "someOpclass") WHERE some condition;' ); - expect(sql2).to.equal( + expect(sql2).toBe( 'CREATE INDEX "z_index" ON "x_table" USING gist ("y_name" "some_opclass") WHERE some condition;' ); }); @@ -59,10 +61,11 @@ describe('lib/operations/indexes', () => { ]; const sql1 = Indexes.createIndex(options1)(...args); const sql2 = Indexes.createIndex(options2)(...args); - expect(sql1).to.equal( + + expect(sql1).toBe( 'CREATE INDEX "zIndex" ON "xTable" USING gist ("yName" "someSchema"."someOpclass") WHERE some condition;' ); - expect(sql2).to.equal( + expect(sql2).toBe( 'CREATE INDEX "z_index" ON "x_table" USING gist ("y_name" "some_schema"."some_opclass") WHERE some condition;' ); }); @@ -79,10 +82,11 @@ describe('lib/operations/indexes', () => { ]; const sql1 = Indexes.createIndex(options1)(...args); const sql2 = Indexes.createIndex(options2)(...args); - expect(sql1).to.equal( + + expect(sql1).toBe( 'CREATE INDEX "zIndex" ON "xTable" USING gist ("yName" DESC) WHERE some condition;' ); - expect(sql2).to.equal( + expect(sql2).toBe( 'CREATE INDEX "z_index" ON "x_table" USING gist ("y_name" DESC) WHERE some condition;' ); }); @@ -95,10 +99,11 @@ describe('lib/operations/indexes', () => { ]; const sql1 = Indexes.createIndex(options1)(...args); const sql2 = Indexes.createIndex(options2)(...args); - expect(sql1).to.equal( + + expect(sql1).toBe( 'CREATE INDEX "zIndex" ON "xTable" ("yName") INCLUDE ("someOtherColumn");' ); - expect(sql2).to.equal( + expect(sql2).toBe( 'CREATE INDEX "z_index" ON "x_table" ("y_name") INCLUDE ("some_other_column");' ); }); diff --git a/test/migration-test.ts b/test/migration-test.ts deleted file mode 100644 index 49456010..00000000 --- a/test/migration-test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { expect } from 'chai'; -import type { SinonSpy } from 'sinon'; -import sinon from 'sinon'; -import type { DBConnection } from '../src/db'; -import { getTimestamp, Migration } from '../src/migration'; -import type { Logger, RunnerOption } from '../src/types'; - -const callbackMigration = '1414549381268_names.js'; -const promiseMigration = '1414549381268_names_promise.js'; -const migrationsTable = 'pgmigrations'; - -const actionsCallback = require(`./${callbackMigration}`); -const actionsPromise = require(`./${promiseMigration}`); - -describe('lib/migration', () => { - const dbMock = {} as DBConnection; - const logger: Logger = { - info: () => null, - warn: () => null, - error: () => null, - }; - const options = { migrationsTable } as RunnerOption; - let migration; - let queryMock: SinonSpy; - - beforeEach(() => { - queryMock = sinon.spy(); - dbMock.query = queryMock; - }); - - describe('getTimestamp', () => { - it('Should get timestamp for normal timestamp', () => { - const now = Date.now(); - expect(getTimestamp(logger, String(now))).to.eql(now); - }); - - it('Should get timestamp for shortened iso format', () => { - const now = new Date(); - expect( - getTimestamp(logger, now.toISOString().replace(/[^\d]/g, '')) - ).to.eql(now.valueOf()); - }); - }); - - describe('self.applyUp', () => { - it('normal operations: db.query should be called', () => { - migration = new Migration( - dbMock, - callbackMigration, - actionsCallback, - options, - {}, - logger - ); - return migration.apply('up').then(() => { - expect(queryMock).to.be.called; - }); - }); - - it('normal operations: db.query should be called when returning promise', () => { - migration = new Migration( - dbMock, - promiseMigration, - actionsPromise, - options, - {}, - logger - ); - return migration.apply('up').then(() => { - expect(queryMock).to.be.called; - }); - }); - - it('--dry-run option: db.query should not be called', () => { - migration = new Migration( - dbMock, - callbackMigration, - actionsCallback, - { ...options, dryRun: true }, - {}, - logger - ); - return migration.apply('up').then(() => { - expect(queryMock).to.not.be.called; - }); - }); - - it('should make proper SQL calls', () => { - migration = new Migration( - dbMock, - promiseMigration, - actionsCallback, - options, - {}, - logger - ); - return migration.apply('up').then(() => { - expect(queryMock).to.have.callCount(4); - expect(queryMock.getCall(0).args[0]).to.equal('BEGIN;'); - expect(queryMock.getCall(1).args[0]).to.include('CREATE TABLE'); - expect(queryMock.getCall(2).args[0]).to.include( - `INSERT INTO "public"."${migrationsTable}"` - ); - expect(queryMock.getCall(3).args[0]).to.equal('COMMIT;'); - }); - }); - - it('should fail with an error message if the migration is invalid', () => { - const invalidMigrationName = 'invalid-migration'; - migration = new Migration( - dbMock, - invalidMigrationName, - {}, - options, - {}, - logger - ); - const direction = 'up'; - let error; - try { - migration.apply(direction); - } catch (err) { - error = err; - } - - // expecting outside the catch block ensures that the test will fail if the - // an exception is not caught - expect(error.toString()).to.include( - `${invalidMigrationName} exporting a '${direction}' function` - ); - }); - }); - - describe('self.applyDown', () => { - it('normal operations: db.query should be called', () => { - migration = new Migration( - dbMock, - callbackMigration, - actionsCallback, - options, - {}, - logger - ); - return migration.apply('down').then(() => { - expect(queryMock).to.be.called; - }); - }); - - it('--dry-run option: db.query should not be called', () => { - migration = new Migration( - dbMock, - callbackMigration, - actionsCallback, - { ...options, dryRun: true }, - {}, - logger - ); - return migration.apply('down').then(() => { - expect(queryMock).to.not.be.called; - }); - }); - - it('should make proper SQL calls', () => { - migration = new Migration( - dbMock, - promiseMigration, - actionsCallback, - options, - {}, - logger - ); - return migration.apply('down').then(() => { - expect(queryMock).to.have.callCount(4); - expect(queryMock.getCall(0).args[0]).to.equal('BEGIN;'); - expect(queryMock.getCall(1).args[0]).to.include('DROP TABLE'); - expect(queryMock.getCall(2).args[0]).to.include( - `DELETE FROM "public"."${migrationsTable}"` - ); - expect(queryMock.getCall(3).args[0]).to.equal('COMMIT;'); - }); - }); - }); -}); diff --git a/test/migration.spec.ts b/test/migration.spec.ts new file mode 100644 index 00000000..259a7567 --- /dev/null +++ b/test/migration.spec.ts @@ -0,0 +1,197 @@ +import type { Mock } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import type { DBConnection } from '../src/db'; +import { getTimestamp, Migration } from '../src/migration'; +import type { Logger, RunnerOption } from '../src/types'; + +const callbackMigration = '1414549381268_names.js'; +const promiseMigration = '1414549381268_names_promise.js'; +const migrationsTable = 'pgmigrations'; + +const actionsCallback = require(`./${callbackMigration}`); +const actionsPromise = require(`./${promiseMigration}`); + +describe('lib/migration', () => { + const dbMock = {} as DBConnection; + + const logger: Logger = { + info: () => null, + warn: () => null, + error: () => null, + }; + + const options = { migrationsTable } as RunnerOption; + + let queryMock: Mock; + + beforeEach(() => { + queryMock = vi.fn(); + dbMock.query = queryMock; + }); + + describe('getTimestamp', () => { + it('should get timestamp for normal timestamp', () => { + const now = Date.now(); + + expect(getTimestamp(logger, String(now))).toBe(now); + }); + + it('should get timestamp for shortened iso format', () => { + const now = new Date(); + + expect( + getTimestamp(logger, now.toISOString().replace(/[^\d]/g, '')) + ).toBe(now.valueOf()); + }); + }); + + describe('self.applyUp', () => { + it('normal operations: db.query should be called', async () => { + const migration = new Migration( + dbMock, + callbackMigration, + actionsCallback, + options, + {}, + logger + ); + + await migration.apply('up'); + + expect(queryMock).toHaveBeenCalled(); + }); + + it('normal operations: db.query should be called when returning promise', async () => { + const migration = new Migration( + dbMock, + promiseMigration, + actionsPromise, + options, + {}, + logger + ); + + await migration.apply('up'); + + expect(queryMock).toHaveBeenCalled(); + }); + + it('--dry-run option: db.query should not be called', async () => { + const migration = new Migration( + dbMock, + callbackMigration, + actionsCallback, + { ...options, dryRun: true }, + {}, + logger + ); + + await migration.apply('up'); + + expect(queryMock).not.toHaveBeenCalled(); + }); + + it('should make proper SQL calls', async () => { + const migration = new Migration( + dbMock, + promiseMigration, + actionsCallback, + options, + {}, + logger + ); + + await migration.apply('up'); + + expect(queryMock).toHaveBeenCalledTimes(4); + expect(queryMock).toHaveBeenNthCalledWith(1, 'BEGIN;'); + expect(queryMock).toHaveBeenNthCalledWith( + 2, + expect.stringMatching('CREATE TABLE') + ); + expect(queryMock).toHaveBeenNthCalledWith( + 3, + expect.stringMatching(`INSERT INTO "public"."${migrationsTable}"`) + ); + expect(queryMock).toHaveBeenNthCalledWith(4, 'COMMIT;'); + }); + + it('should fail with an error message if the migration is invalid', () => { + const invalidMigrationName = 'invalid-migration'; + + const migration = new Migration( + dbMock, + invalidMigrationName, + {}, + options, + {}, + logger + ); + + const direction = 'up'; + + expect(() => migration.apply(direction)).toThrow( + new Error( + `Unknown value for direction: ${direction}. Is the migration ${invalidMigrationName} exporting a '${direction}' function?` + ) + ); + }); + }); + + describe('self.applyDown', () => { + it('normal operations: db.query should be called', async () => { + const migration = new Migration( + dbMock, + callbackMigration, + actionsCallback, + options, + {}, + logger + ); + + await migration.apply('down'); + + expect(queryMock).toHaveBeenCalled(); + }); + + it('--dry-run option: db.query should not be called', async () => { + const migration = new Migration( + dbMock, + callbackMigration, + actionsCallback, + { ...options, dryRun: true }, + {}, + logger + ); + + await migration.apply('down'); + + expect(queryMock).not.toHaveBeenCalled(); + }); + + it('should make proper SQL calls', async () => { + const migration = new Migration( + dbMock, + promiseMigration, + actionsCallback, + options, + {}, + logger + ); + + await migration.apply('down'); + + expect(queryMock).toHaveBeenCalledTimes(4); + expect(queryMock).toHaveBeenNthCalledWith(1, 'BEGIN;'); + expect(queryMock).toHaveBeenNthCalledWith( + 2, + expect.stringMatching('DROP TABLE') + ); + expect(queryMock).toHaveBeenNthCalledWith( + 3, + expect.stringMatching(`DELETE FROM "public"."${migrationsTable}"`) + ); + expect(queryMock).toHaveBeenNthCalledWith(4, 'COMMIT;'); + }); + }); +}); diff --git a/test/roles-test.ts b/test/roles.spec.ts similarity index 85% rename from test/roles-test.ts rename to test/roles.spec.ts index ba19779c..f2a92b04 100644 --- a/test/roles-test.ts +++ b/test/roles.spec.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai'; +import { describe, expect, it } from 'vitest'; import * as Roles from '../src/operations/roles'; import { options1, options2 } from './utils'; @@ -7,10 +7,11 @@ describe('lib/operations/roles', () => { it('check defaults', () => { const sql1 = Roles.createRole(options1)('roleTest'); const sql2 = Roles.createRole(options2)('roleTest'); - expect(sql1).to.equal( + + expect(sql1).toBe( 'CREATE ROLE "roleTest" WITH NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION;' ); - expect(sql2).to.equal( + expect(sql2).toBe( 'CREATE ROLE "role_test" WITH NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION;' ); }); diff --git a/test/sqlMigration-test.ts b/test/sqlMigration-test.ts deleted file mode 100644 index d22759db..00000000 --- a/test/sqlMigration-test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { expect } from 'chai'; -import sinon from 'sinon'; -import { getActions } from '../src/sqlMigration'; - -describe('lib/sqlMigration', () => { - describe('getActions', () => { - it('without comments', () => { - const content = 'SELECT 1 FROM something'; - const { up, down } = getActions(content); - expect(up).to.exist; - expect(down).to.be.false; - - const sql = sinon.spy(); - expect(up({ sql })).to.not.exist; - expect(sql.called).to.be.true; - expect(sql.lastCall.args[0].trim()).to.eql(content.trim()); - }); - - it('with up comment', () => { - const content = ` --- Up Migration -SELECT 1 FROM something -`; - const { up, down } = getActions(content); - expect(up).to.exist; - expect(down).to.be.false; - - const sql = sinon.spy(); - expect(up({ sql })).to.not.exist; - expect(sql.called).to.be.true; - expect(sql.lastCall.args[0].trim()).to.eql(content.trim()); - }); - - it('with both comments', () => { - const upMigration = ` --- Up Migration -SELECT 1 FROM something`; - const downMigration = ` --- Down Migration -SELECT 2 FROM something`; - const content = `${upMigration}${downMigration}`; - const { up, down } = getActions(content); - expect(up).to.exist; - expect(down).to.exist; - - const upSql = sinon.spy(); - expect(up({ sql: upSql })).to.not.exist; - expect(upSql.called).to.be.true; - expect(upSql.lastCall.args[0].trim()).to.eql(upMigration.trim()); - - const downSql = sinon.spy(); - expect(down({ sql: downSql })).to.not.exist; - expect(downSql.called).to.be.true; - expect(downSql.lastCall.args[0].trim()).to.eql(downMigration.trim()); - }); - - it('with both comments in reverse order', () => { - const upMigration = ` --- Up Migration -SELECT 1 FROM something`; - const downMigration = ` --- Down Migration -SELECT 2 FROM something`; - const content = `${downMigration}${upMigration}`; - const { up, down } = getActions(content); - expect(up).to.exist; - expect(down).to.exist; - - const upSql = sinon.spy(); - expect(up({ sql: upSql })).to.not.exist; - expect(upSql.called).to.be.true; - expect(upSql.lastCall.args[0].trim()).to.eql(upMigration.trim()); - - const downSql = sinon.spy(); - expect(down({ sql: downSql })).to.not.exist; - expect(downSql.called).to.be.true; - expect(downSql.lastCall.args[0].trim()).to.eql(downMigration.trim()); - }); - - it('with both comments with some chars added', () => { - const upMigration = ` - -- - up Migration to do Up migration -SELECT 1 FROM something`; - const downMigration = ` - -- -- -- Down migration to bring DB down -SELECT 2 FROM something`; - const content = `${upMigration}${downMigration}`; - const { up, down } = getActions(content); - expect(up).to.exist; - expect(down).to.exist; - - const upSql = sinon.spy(); - expect(up({ sql: upSql })).to.not.exist; - expect(upSql.called).to.be.true; - expect(upSql.lastCall.args[0].trim()).to.eql(upMigration.trim()); - - const downSql = sinon.spy(); - expect(down({ sql: downSql })).to.not.exist; - expect(downSql.called).to.be.true; - expect(downSql.lastCall.args[0].trim()).to.eql(downMigration.trim()); - }); - }); -}); diff --git a/test/sqlMigration.spec.ts b/test/sqlMigration.spec.ts new file mode 100644 index 00000000..fbf936eb --- /dev/null +++ b/test/sqlMigration.spec.ts @@ -0,0 +1,124 @@ +import { describe, expect, it, vi } from 'vitest'; +import { getActions } from '../src/sqlMigration'; + +describe('lib/sqlMigration', () => { + describe('getActions', () => { + it('without comments', () => { + const content = 'SELECT 1 FROM something'; + const { up, down } = getActions(content); + + expect(up).toBeDefined(); + expect(down).toBeFalsy(); + + const sql = vi.fn(); + + expect(up({ sql })).not.toBeDefined(); + expect(sql).toHaveBeenCalled(); + expect(sql).toHaveBeenLastCalledWith(content.trim()); + }); + + it('with up comment', () => { + const content = ` +-- Up Migration +SELECT 1 FROM something +`; + const { up, down } = getActions(content); + + expect(up).toBeDefined(); + expect(down).toBeFalsy(); + + const sql = vi.fn(); + + expect(up({ sql })).not.toBeDefined(); + expect(sql).toHaveBeenCalled(); + expect(sql).toHaveBeenLastCalledWith(content); + }); + + it('with both comments', () => { + const upMigration = ` +-- Up Migration +SELECT 1 FROM something +`; + const downMigration = ` +-- Down Migration +SELECT 2 FROM something +`; + const content = `${upMigration}${downMigration}`; + + const { up, down } = getActions(content); + + expect(up).toBeDefined(); + expect(down).toBeDefined(); + + const upSql = vi.fn(); + + expect(up({ sql: upSql })).not.toBeDefined(); + expect(upSql).toHaveBeenCalled(); + expect(upSql).toHaveBeenLastCalledWith(upMigration); + + const downSql = vi.fn(); + + expect(down({ sql: downSql })).not.toBeDefined(); + expect(downSql).toHaveBeenCalled(); + expect(downSql).toHaveBeenLastCalledWith(downMigration); + }); + + it('with both comments in reverse order', () => { + const upMigration = ` +-- Up Migration +SELECT 1 FROM something +`; + const downMigration = ` +-- Down Migration +SELECT 2 FROM something +`; + const content = `${downMigration}${upMigration}`; + + const { up, down } = getActions(content); + + expect(up).toBeDefined(); + expect(down).toBeDefined(); + + const upSql = vi.fn(); + + expect(up({ sql: upSql })).not.toBeDefined(); + expect(upSql).toHaveBeenCalled(); + expect(upSql).toHaveBeenLastCalledWith(upMigration); + + const downSql = vi.fn(); + + expect(down({ sql: downSql })).not.toBeDefined(); + expect(downSql).toHaveBeenCalled(); + expect(downSql).toHaveBeenLastCalledWith(downMigration); + }); + + it('with both comments with some chars added', () => { + const upMigration = ` + -- - up Migration to do Up migration +SELECT 1 FROM something +`; + const downMigration = ` + -- -- -- Down migration to bring DB down +SELECT 2 FROM something +`; + const content = `${upMigration}${downMigration}`; + + const { up, down } = getActions(content); + + expect(up).toBeDefined(); + expect(down).toBeDefined(); + + const upSql = vi.fn(); + + expect(up({ sql: upSql })).not.toBeDefined(); + expect(upSql).toHaveBeenCalled(); + expect(upSql).toHaveBeenLastCalledWith(upMigration); + + const downSql = vi.fn(); + + expect(down({ sql: downSql })).not.toBeDefined(); + expect(downSql).toHaveBeenCalled(); + expect(downSql).toHaveBeenLastCalledWith(downMigration); + }); + }); +}); diff --git a/test/tables-test.ts b/test/tables.spec.ts similarity index 84% rename from test/tables-test.ts rename to test/tables.spec.ts index 1c6f7c2a..84ce0b03 100644 --- a/test/tables-test.ts +++ b/test/tables.spec.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai'; +import { describe, expect, it } from 'vitest'; import * as Tables from '../src/operations/tables'; import { options1, options2 } from './utils'; @@ -15,10 +15,11 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "mySchema"."myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "mySchema"."myTableName" ( "idColumn" serial );`); - expect(sql2).to.equal(`CREATE TABLE "my_schema"."my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_schema"."my_table_name" ( "id_column" serial );`); }); @@ -27,10 +28,11 @@ describe('lib/operations/tables', () => { const args: CreateTableParams = ['myTableName', { idColumn: 'id' }]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "idColumn" serial PRIMARY KEY );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "id_column" serial PRIMARY KEY );`); }); @@ -51,10 +53,11 @@ describe('lib/operations/tables', () => { idTest: { type: 'uuid', primaryKey: true }, }, })(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "idColumn" uuid PRIMARY KEY );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "id_column" uuid PRIMARY KEY );`); }); @@ -71,10 +74,11 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "parentId" integer REFERENCES "schemaA"."tableB" );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "parent_id" integer REFERENCES "schema_a"."table_b" );`); }); @@ -92,10 +96,11 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "parentId" integer REFERENCES "schemaA"."tableB" MATCH SIMPLE );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "parent_id" integer REFERENCES "schema_a"."table_b" MATCH SIMPLE );`); }); @@ -109,10 +114,11 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "parentId" integer REFERENCES schemaA.tableB(idColumn) );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "parent_id" integer REFERENCES schemaA.tableB(idColumn) );`); }); @@ -127,12 +133,13 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "mySchema"."myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "mySchema"."myTableName" ( "colA" integer, "colB" varchar, CONSTRAINT "myTableName_pkey" PRIMARY KEY ("colA", "colB") );`); - expect(sql2).to.equal(`CREATE TABLE "my_schema"."my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_schema"."my_table_name" ( "col_a" integer, "col_b" varchar, CONSTRAINT "my_table_name_pkey" PRIMARY KEY ("col_a", "col_b") @@ -159,12 +166,13 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "colA" integer, "colB" varchar, CONSTRAINT "myTableName_fk_colA_colB" FOREIGN KEY ("colA", "colB") REFERENCES otherTable (A, B) );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "col_a" integer, "col_b" varchar, CONSTRAINT "my_table_name_fk_col_a_col_b" FOREIGN KEY ("col_a", "col_b") REFERENCES otherTable (A, B) @@ -186,12 +194,13 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "colA" integer, "colB" varchar, CONSTRAINT "myTableName_uniq_colA_colB" UNIQUE ("colA", "colB") );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "col_a" integer, "col_b" varchar, CONSTRAINT "my_table_name_uniq_col_a_col_b" UNIQUE ("col_a", "col_b") @@ -213,12 +222,13 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "colA" integer, "colB" varchar, CONSTRAINT "myTableName_uniq_colA" UNIQUE ("colA") );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "col_a" integer, "col_b" varchar, CONSTRAINT "my_table_name_uniq_col_a" UNIQUE ("col_a") @@ -241,14 +251,15 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "colA" integer, "colB" varchar, "colC" varchar, CONSTRAINT "myTableName_uniq_colA_colB" UNIQUE ("colA", "colB"), CONSTRAINT "myTableName_uniq_colC" UNIQUE ("colC") );`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "col_a" integer, "col_b" varchar, "col_c" varchar, @@ -275,12 +286,13 @@ describe('lib/operations/tables', () => { ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "colA" integer, CONSTRAINT "myTableName_fk_colA" FOREIGN KEY ("colA") REFERENCES "otherTable" ); COMMENT ON CONSTRAINT "myTableName_fk_colA" ON "myTableName" IS $pga$example comment$pga$;`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "col_a" integer, CONSTRAINT "my_table_name_fk_col_a" FOREIGN KEY ("col_a") REFERENCES "other_table" ); @@ -306,13 +318,14 @@ COMMENT ON CONSTRAINT "my_table_name_fk_col_a" ON "my_table_name" IS $pga$exampl ]; const sql1 = Tables.createTable(options1)(...args); const sql2 = Tables.createTable(options2)(...args); - expect(sql1).to.equal(`CREATE TABLE "myTableName" ( + + expect(sql1).toBe(`CREATE TABLE "myTableName" ( "colA" integer CONSTRAINT "myTableName_fk_colA" REFERENCES otherTable (a), "colB" integer CONSTRAINT "fkColB" REFERENCES "otherTableTwo" ); COMMENT ON CONSTRAINT "myTableName_fk_colA" ON "myTableName" IS $pga$fk a comment$pga$; COMMENT ON CONSTRAINT "fkColB" ON "myTableName" IS $pga$fk b comment$pga$;`); - expect(sql2).to.equal(`CREATE TABLE "my_table_name" ( + expect(sql2).toBe(`CREATE TABLE "my_table_name" ( "col_a" integer CONSTRAINT "my_table_name_fk_col_a" REFERENCES otherTable (a), "col_b" integer CONSTRAINT "fk_col_b" REFERENCES "other_table_two" ); @@ -333,10 +346,11 @@ COMMENT ON CONSTRAINT "fk_col_b" ON "my_table_name" IS $pga$fk b comment$pga$;`) }, }, ]; - expect(() => Tables.createTable(options1)(...args)).to.throw( + + expect(() => Tables.createTable(options1)(...args)).toThrow( 'cannot comment on unspecified constraints' ); - expect(() => Tables.createTable(options2)(...args)).to.throw( + expect(() => Tables.createTable(options2)(...args)).toThrow( 'cannot comment on unspecified constraints' ); }); @@ -347,10 +361,11 @@ COMMENT ON CONSTRAINT "fk_col_b" ON "my_table_name" IS $pga$fk b comment$pga$;`) const args: DropColumnsParams = ['myTableName', ['colC1', 'colC2']]; const sql1 = Tables.dropColumns(options1)(...args); const sql2 = Tables.dropColumns(options2)(...args); - expect(sql1).to.equal(`ALTER TABLE "myTableName" + + expect(sql1).toBe(`ALTER TABLE "myTableName" DROP "colC1", DROP "colC2";`); - expect(sql2).to.equal(`ALTER TABLE "my_table_name" + expect(sql2).toBe(`ALTER TABLE "my_table_name" DROP "col_c1", DROP "col_c2";`); }); @@ -365,9 +380,10 @@ COMMENT ON CONSTRAINT "fk_col_b" ON "my_table_name" IS $pga$fk b comment$pga$;`) ]; const sql1 = Tables.addConstraint(options1)(...args); const sql2 = Tables.addConstraint(options2)(...args); - expect(sql1).to.equal(`ALTER TABLE "myTableName" + + expect(sql1).toBe(`ALTER TABLE "myTableName" ADD CONSTRAINT "myConstraintName" CHECK name IS NOT NULL;`); - expect(sql2).to.equal(`ALTER TABLE "my_table_name" + expect(sql2).toBe(`ALTER TABLE "my_table_name" ADD CONSTRAINT "my_constraint_name" CHECK name IS NOT NULL;`); }); @@ -379,9 +395,10 @@ COMMENT ON CONSTRAINT "fk_col_b" ON "my_table_name" IS $pga$fk b comment$pga$;`) ]; const sql1 = Tables.addConstraint(options1)(...args); const sql2 = Tables.addConstraint(options2)(...args); - expect(sql1).to.equal(`ALTER TABLE "myTableName" + + expect(sql1).toBe(`ALTER TABLE "myTableName" ADD CHECK name IS NOT NULL;`); - expect(sql2).to.equal(`ALTER TABLE "my_table_name" + expect(sql2).toBe(`ALTER TABLE "my_table_name" ADD CHECK name IS NOT NULL;`); }); @@ -396,10 +413,11 @@ COMMENT ON CONSTRAINT "fk_col_b" ON "my_table_name" IS $pga$fk b comment$pga$;`) ]; const sql1 = Tables.addConstraint(options1)(...args); const sql2 = Tables.addConstraint(options2)(...args); - expect(sql1).to.equal(`ALTER TABLE "myTableName" + + expect(sql1).toBe(`ALTER TABLE "myTableName" ADD CONSTRAINT "myConstraintName" PRIMARY KEY ("colA"); COMMENT ON CONSTRAINT "myConstraintName" ON "myTableName" IS $pga$this is an important primary key$pga$;`); - expect(sql2).to.equal(`ALTER TABLE "my_table_name" + expect(sql2).toBe(`ALTER TABLE "my_table_name" ADD CONSTRAINT "my_constraint_name" PRIMARY KEY ("col_a"); COMMENT ON CONSTRAINT "my_constraint_name" ON "my_table_name" IS $pga$this is an important primary key$pga$;`); }); diff --git a/test/utils-test.ts b/test/utils.spec.ts similarity index 76% rename from test/utils-test.ts rename to test/utils.spec.ts index e8372b62..336eeae8 100644 --- a/test/utils-test.ts +++ b/test/utils.spec.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai'; +import { describe, expect, it } from 'vitest'; import type { PgLiteralValue } from '../src/operations/generalTypes'; import PgLiteral from '../src/operations/PgLiteral'; import type { ColumnDefinitions } from '../src/operations/tablesTypes'; @@ -15,60 +15,58 @@ describe('lib/utils', () => { it("parse null to 'NULL'", () => { const value = null; - expect(escapeValue(value)).to.equal('NULL'); + expect(escapeValue(value)).toBe('NULL'); }); it('parse boolean to string', () => { const value = true; - expect(escapeValue(value)).to.equal('true'); + expect(escapeValue(value)).toBe('true'); }); it('escape string', () => { const value = '#escape_me'; - expect(escapeValue(value)).to.equal('$pga$#escape_me$pga$'); + expect(escapeValue(value)).toBe('$pga$#escape_me$pga$'); }); it('keep number as is', () => { const value = 77.7; - expect(escapeValue(value)).to.equal(77.7); + expect(escapeValue(value)).toBe(77.7); }); it('parse array to ARRAY constructor syntax string', () => { const value = [[1], [2]]; const value2 = [['a'], ['b']]; - expect(escapeValue(value)).to.equal('ARRAY[[1],[2]]'); - expect(escapeValue(value2)).to.equal( - 'ARRAY[[$pga$a$pga$],[$pga$b$pga$]]' - ); + expect(escapeValue(value)).toBe('ARRAY[[1],[2]]'); + expect(escapeValue(value2)).toBe('ARRAY[[$pga$a$pga$],[$pga$b$pga$]]'); }); it('parse PgLiteral to unescaped string', () => { const value = PgLiteral.create('@l| { const value: PgLiteralValue = { literal: true, value: '@l| { const value = PgLiteral.create('@l| { const value = undefined; - expect(escapeValue(value)).to.equal(''); + expect(escapeValue(value)).toBe(''); }); }); @@ -76,19 +74,20 @@ describe('lib/utils', () => { it('convert string', () => { const type = 'type'; - expect(applyType(type)).to.eql({ type }); + expect(applyType(type)).toEqual({ type }); }); it('apply id shorthand', () => { - expect(applyType('id')).to.eql({ type: 'serial', primaryKey: true }); + expect(applyType('id')).toEqual({ type: 'serial', primaryKey: true }); }); it('apply shorthand', () => { const shorthandName = 'type'; const shorthandDefinition = { type: 'integer', defaultValue: 1 }; + expect( applyType(shorthandName, { [shorthandName]: shorthandDefinition }) - ).to.eql(shorthandDefinition); + ).toEqual(shorthandDefinition); }); it('apply recursive shorthand', () => { @@ -96,7 +95,8 @@ describe('lib/utils', () => { ref: { type: `integer`, onDelete: `CASCADE` }, user: { type: `ref`, references: `users` }, }; - expect(applyType('user', shorthands)).to.eql({ + + expect(applyType('user', shorthands)).toEqual({ type: `integer`, onDelete: `CASCADE`, references: `users`, @@ -108,7 +108,8 @@ describe('lib/utils', () => { ref: { type: `user`, onDelete: `CASCADE` }, user: { type: `ref`, references: `users` }, }; - expect(() => applyType('user', shorthands)).to.throw(); + + expect(() => applyType('user', shorthands)).toThrow(); }); }); @@ -121,7 +122,7 @@ describe('lib/utils', () => { string: 'string', name: { schema: 'schema', name: 'name' }, }) - ).to.equal('CREATE INDEX "string" ON "schema"."name" (id);'); + ).toBe('CREATE INDEX "string" ON "schema"."name" (id);'); }); it('Do not escape PgLiteral', () => { @@ -131,7 +132,7 @@ describe('lib/utils', () => { t('INSERT INTO s (id) VALUES {values};', { values: new PgLiteral(['s1', 's2'].map((e) => `('${e}')`).join(', ')), }) - ).to.equal("INSERT INTO s (id) VALUES ('s1'), ('s2');"); + ).toBe("INSERT INTO s (id) VALUES ('s1'), ('s2');"); }); it('Can use number', () => { @@ -141,7 +142,7 @@ describe('lib/utils', () => { t('INSERT INTO s (id) VALUES ({values});', { values: 1, }) - ).to.equal('INSERT INTO s (id) VALUES (1);'); + ).toBe('INSERT INTO s (id) VALUES (1);'); }); }); @@ -176,8 +177,9 @@ describe('lib/utils', () => { 'aac', 'aad', ]; + results.forEach((res) => { - expect(ids.next()).to.equal(res); + expect(ids.next()).toBe(res); }); }); }); diff --git a/tsconfig.json b/tsconfig.json index ea469a93..9548ae0c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,8 @@ "strict": true, "noImplicitAny": true, "noUnusedLocals": true, - "noImplicitOverride": true + "noImplicitOverride": true, + "skipLibCheck": true }, "exclude": ["node_modules", "templates", "test", "dist", "bin", "migrations"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..cf782c78 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vitest/config'; + +// https://vitejs.dev/config/ +export default defineConfig({ + test: { + coverage: { + all: true, + provider: 'v8', + reporter: ['clover', 'cobertura', 'lcov', 'text'], + include: ['src'], + }, + reporters: process.env.CI_PREFLIGHT + ? ['basic', 'github-actions'] + : ['basic'], + }, +});