diff --git a/package-lock.json b/package-lock.json index 6d7f67d4..c8d41edc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,6 @@ }, "devDependencies": { "@types/jest": "^29.5.11", - "http-server": "^14.1.1", "prettier": "^3.2.1", "ts-jest": "^29.1.1", "ts-node": "^10.9.2" @@ -1719,15 +1718,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -1848,18 +1838,6 @@ "dev": true, "peer": true }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1945,20 +1923,6 @@ "dev": true, "peer": true }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2113,15 +2077,6 @@ "dev": true, "peer": true }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -2165,15 +2120,6 @@ "node": ">= 8" } }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -2199,20 +2145,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -2347,12 +2279,6 @@ "node": ">=4" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2445,26 +2371,6 @@ "node": ">=8" } }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2492,6 +2398,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2516,21 +2423,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -2585,18 +2477,6 @@ "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2612,47 +2492,12 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, + "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2660,27 +2505,6 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2688,47 +2512,6 @@ "dev": true, "peer": true }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2739,18 +2522,6 @@ "node": ">=10.17.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -3706,12 +3477,6 @@ "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -3816,18 +3581,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -3851,33 +3604,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3922,15 +3648,6 @@ "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3957,15 +3674,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4119,20 +3827,6 @@ "node": ">=8" } }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, "node_modules/prettier": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.1.tgz", @@ -4205,21 +3899,6 @@ ], "peer": true }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -4236,12 +3915,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4293,24 +3966,6 @@ "node": ">=10" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4321,21 +3976,6 @@ "semver": "bin/semver.js" } }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4359,20 +3999,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -4742,18 +4368,6 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -4785,12 +4399,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -4822,18 +4430,6 @@ "makeerror": "1.0.12" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/src/bptree/bptree.ts b/src/btree/bptree.ts similarity index 89% rename from src/bptree/bptree.ts rename to src/btree/bptree.ts index 4976a701..72364d97 100644 --- a/src/bptree/bptree.ts +++ b/src/btree/bptree.ts @@ -1,9 +1,6 @@ import { BPTreeNode, MemoryPointer, compareBytes } from "./node"; import { LengthIntegrityError, RangeResolver } from "../resolver"; - -export interface MetaPage { - root(): Promise; -} +import { LinkedMetaPage } from "./multi"; type RootResponse = { rootNode: BPTreeNode; @@ -12,9 +9,9 @@ type RootResponse = { export class BPTree { private tree: RangeResolver; - private meta: MetaPage; + private meta: LinkedMetaPage; - constructor(tree: RangeResolver, meta: MetaPage) { + constructor(tree: RangeResolver, meta: LinkedMetaPage) { this.tree = tree; this.meta = meta; } @@ -104,14 +101,14 @@ export class BPTree { const rootResponse = await this.root(); if (!rootResponse) { - return [{ offset: 0, length: 0 }, false]; + return [{ offset: BigInt(0), length: 0 }, false]; } let { rootNode, pointer } = rootResponse; const path = await this.traverse(key, rootNode, pointer); if (!path) { - return [{ offset: 0, length: 0 }, false]; + return [{ offset: BigInt(0), length: 0 }, false]; } const n = path[0].node; @@ -122,7 +119,7 @@ export class BPTree { return [n.pointers[i], true]; } - return [{ offset: 0, length: 0 }, false]; + return [{ offset: BigInt(0), length: 0 }, false]; } } diff --git a/src/btree/multi.ts b/src/btree/multi.ts new file mode 100644 index 00000000..19e0b016 --- /dev/null +++ b/src/btree/multi.ts @@ -0,0 +1,77 @@ +import { RangeResolver } from "../resolver"; +import { MemoryPointer } from "./node"; + + +const PAGE_SIZE_BYTES = 4096; + +export class LinkedMetaPage { + private resolver: RangeResolver; + private offset: number; + private pageData: ArrayBuffer | null; + + constructor(resolver: RangeResolver, offset: number) { + this.resolver = resolver; + this.offset = offset; + this.pageData = null; + } + + async root(): Promise { + const pageData = await this.getPage(); + + // we seek by 12 bytes since offset is 8 bytes, length is 4 bytes + const data = pageData.slice(this.offset, this.offset + 12); + const view = new DataView(data); + + const pointerOffset = view.getBigUint64(0); + const lengthOffset = view.getUint32(8); + + return { + offset: pointerOffset, + length: lengthOffset, + }; + } + + async metadata(): Promise { + const pageData = await this.getPage(); + const lengthData = pageData.slice(this.offset + 24, this.offset + PAGE_SIZE_BYTES) + + const lengthView = new DataView(lengthData); + + // read the first four because that represnts length + const metadataLength = lengthView.getUint32(0); + const metadata = pageData.slice(this.offset + 28, this.offset + metadataLength); + + return metadata; + } + + private async getPage(): Promise { + if (this.pageData) { + return this.pageData + } + + const { data } = await this.resolver({ + start: this.offset, + end: this.offset + PAGE_SIZE_BYTES - 1, + }); + + this.pageData = data; + + return data; + } + + async next(): Promise { + const pageData = await this.getPage(); + const data = pageData.slice(this.offset + 12, this.offset + 12 + 8); + + const view = new DataView(data); + + const nextOffset = view.getBigUint64(0); + + const maxUint64 = BigInt(2) ** BigInt(64) - BigInt(1); + if (nextOffset === maxUint64) { + return null; + } + + return new LinkedMetaPage(this.resolver, Number(nextOffset)); + } +} diff --git a/src/bptree/node.ts b/src/btree/node.ts similarity index 90% rename from src/bptree/node.ts rename to src/btree/node.ts index b384ac3f..0a041214 100644 --- a/src/bptree/node.ts +++ b/src/btree/node.ts @@ -1,7 +1,7 @@ import { RangeResolver } from "../resolver"; export type ReferencedValue = { dataPointer: MemoryPointer; value: Buffer }; -export type MemoryPointer = { offset: number; length: number }; +export type MemoryPointer = { offset: BigInt; length: number }; export class BPTreeNode { public keys: ReferencedValue[]; @@ -23,8 +23,8 @@ export class BPTreeNode { try { const node = new BPTreeNode([], []); let { data: sizeData } = await resolver({ - start: mp.offset, - end: mp.offset + mp.length, + start: Number(mp.offset), + end: Number(mp.offset) + mp.length, }); let sizeBuffer = Buffer.from(sizeData); @@ -67,7 +67,7 @@ export class BPTreeNode { node.keys.push({ value: Buffer.from(keyValue), - dataPointer: { offset: dpOffset, length: dpLength }, + dataPointer: { offset: BigInt(dpOffset), length: dpLength }, }); } else { let { data: keyValue } = await resolver({ @@ -77,7 +77,7 @@ export class BPTreeNode { node.keys.push({ value: Buffer.from(keyValue), - dataPointer: { offset: currentOffset, length: l }, + dataPointer: { offset: BigInt(currentOffset), length: l }, }); currentOffset += l; @@ -104,7 +104,7 @@ export class BPTreeNode { let pointerLength = lengthBuffer.readUint32BE(0); currentOffset += 4; - node.pointers.push({ offset: pointerOffset, length: pointerLength }); + node.pointers.push({ offset: BigInt(pointerOffset), length: pointerLength }); } return { node, bytesRead: currentOffset }; diff --git a/src/db/database.ts b/src/db/database.ts index 86e79a12..3e0f6662 100644 --- a/src/db/database.ts +++ b/src/db/database.ts @@ -1,6 +1,6 @@ import { FormatType } from ".."; import { DataFile } from "../data-file"; -import { IndexFile, VersionedIndexFile } from "../index-file"; +import { IndexFile, VersionedIndexFile } from "../index-file/index-file"; import { QueryBuilder } from "./query-builder"; import { validateQuery } from "./query-validation"; @@ -141,6 +141,7 @@ export class Database { return await this.indexFile.indexHeaders(); } + /* async *query(query: Query) { // verify that the query does not require a composite index if (new Set((query.where ?? []).map((where) => where.key)).size > 1) { @@ -296,6 +297,7 @@ export class Database { } } } + */ where( key: keyof T, diff --git a/src/db/query-builder.ts b/src/db/query-builder.ts index f5e2c4dc..c5a74936 100644 --- a/src/db/query-builder.ts +++ b/src/db/query-builder.ts @@ -40,7 +40,7 @@ export class QueryBuilder { * Executes the constructed query */ get() { - return this.database.query(this.queryObject); + //return this.database.query(this.queryObject); } /** diff --git a/src/db/query-validation.ts b/src/db/query-validation.ts index f779fdab..a16d441f 100644 --- a/src/db/query-validation.ts +++ b/src/db/query-validation.ts @@ -1,4 +1,4 @@ -import { Header } from "../index-file"; +import { IndexMeta } from "../index-file/index-meta"; import { FieldType, OrderBy, @@ -24,12 +24,12 @@ function containsType(compositeType: bigint, singleType: FieldType): boolean { * validateWhere validates the 'where' clause of the query. * * @param {WhereNode[] | undefined} where - The 'where' clause to validate. - * @param {Header[]} headers - List of headers to check field existence and type compatibility. + * @param {IndexMeta[]} headers - List of headers to check field existence and type compatibility. * @throws {Error} - Throws an error if the 'where' clause is missing, invalid, or refers to non-existent fields. */ function validateWhere( where: WhereNode[] | undefined, - headers: Header[] + headers: IndexMeta[] ): void { if (!where || !Array.isArray(where) || where.length === 0) { throw new Error("Missing 'where' clause."); @@ -138,12 +138,12 @@ function validateOrderBy( * validateSelect validates the 'select' fields of a query. * * @param {SelectField[] | undefined} select - The 'select' clause to validate. - * @param {Header[]} headers - List of headers to check for field existence. + * @param {IndexMeta[]} headers - List of headers to check for field existence. * @throws {Error} Throws an error if any field in the 'select' clause doesn't exist in headers. */ function validateSelect( select: SelectField[] | undefined, - headers: Header[] + headers: IndexMeta[] ): void { if (select) { console.log("validating select: ", select); @@ -169,12 +169,12 @@ function validateSelect( * If any part of the query is invalid (e.g., a field doesn't exist), it throws an error. * * @param {Query} query - The query object to validate. - * @param {Header[]} headers - The headers against which to validate the query fields. + * @param {IndexMeta[]} headers - The headers against which to validate the query fields. * @throws {Error} Throws an error if query is invalid. */ export async function validateQuery( query: Query, - headers: Header[] + headers: IndexMeta[] ): Promise { validateWhere(query.where, headers); validateOrderBy(query.orderBy, query.where![0].key as string); diff --git a/src/index-file.ts b/src/index-file.ts deleted file mode 100644 index 377b0939..00000000 --- a/src/index-file.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { LengthIntegrityError, RangeResolver } from "./resolver"; - -export type Header = { - fieldName: string; - fieldType: bigint; - indexRecordCount: bigint; -}; - -export class IndexFile { - static async forUrl(url: string) { - return await IndexFile.forResolver( - async ({ start, end, expectedLength }) => { - const response = await fetch(url, { - headers: { Range: `bytes=${start}-${end}` }, - }); - const totalLength = Number( - response.headers.get("Content-Range")!.split("/")[1] - ); - if (expectedLength && totalLength !== expectedLength) { - throw new LengthIntegrityError(); - } - return { - data: await response.arrayBuffer(), - totalLength: totalLength, - }; - } - ); - } - - static async forResolver( - resolver: RangeResolver - ): Promise> { - const response = await resolver({ start: 0, end: 0 }); - const version = new DataView(response.data).getUint8(0); - switch (version) { - case 1: - return new IndexFileV1(async (start, end) => { - return ( - await resolver({ - start, - end, - expectedLength: response.totalLength, - }) - ).data; - }); - default: - throw new Error("invalid version"); - } - } -} - -function decodeFloatingInt16(x: number) { - const exponent = x >> 11; - const mantissa = x & 0x7ff; - return (1 << exponent) * mantissa + (1 << (exponent + 11)) - (1 << 11); -} - -export interface VersionedIndexFile { - indexFileHeader(): Promise<{ - indexLength: number; - dataCount: number; - }>; - indexHeaders(): Promise; - indexRecord( - field: keyof T, - offset: number - ): Promise<{ - dataNumber: number; - fieldStartByteOffset: number; - fieldLength: number; - }>; - dataRecord( - offset: number - ): Promise<{ startByteOffset: number; endByteOffset: number }>; -} - -class IndexFileV1 implements VersionedIndexFile { - private _indexFileHeader?: { - indexLength: number; - dataCount: number; - }; - private _indexHeaders?: Header[]; - - private static INDEX_RECORD_SIZE = 18; - - constructor( - private resolver: (start: number, end: number) => Promise - ) {} - - async indexFileHeader() { - if (this._indexFileHeader) { - return this._indexFileHeader; - } - const header = new DataView(await this.resolver(1, 16)); - this._indexFileHeader = { - indexLength: Number(header.getBigUint64(0)), - dataCount: Number(header.getBigUint64(8)), - }; - return this._indexFileHeader; - } - - async indexHeaders() { - if (this._indexHeaders) { - return this._indexHeaders; - } - - const indexFileHeader = await this.indexFileHeader(); - const buffer = await this.resolver(17, indexFileHeader.indexLength + 16); - const data = new DataView(buffer); - const headers: Header[] = []; - let offset = 0; - while (offset < indexFileHeader.indexLength) { - const fieldNameLength = data.getUint32(offset); - offset += 4; - const fieldName = new TextDecoder("utf-8").decode( - buffer.slice(offset, offset + fieldNameLength) - ); - offset += fieldNameLength; - const fieldType = data.getBigUint64(offset); - offset += 8; - const indexRecordCount = data.getBigUint64(offset); - offset += 8; - headers.push({ - fieldName, - fieldType, - indexRecordCount, - }); - } - if (offset !== indexFileHeader.indexLength) { - throw new Error( - `Inaccurate header read, offset = ${offset} but indexFileHeader.indexLength = ${indexFileHeader.indexLength}. This could indicate that the index file is corrupt.` - ); - } - this._indexHeaders = headers; - return headers; - } - - async indexRecord(field: keyof T, offset: number) { - if (offset < 0) { - throw new Error("offset out of range"); - } - const headers = await this.indexHeaders(); - const headerIndex = headers.findIndex( - (header) => header.fieldName === field - ); - if (headerIndex === -1) { - throw new Error("field not found"); - } - const header = headers[headerIndex]; - if (offset >= Number(header.indexRecordCount)) { - throw new Error("offset out of range"); - } - - const indexFileHeader = await this.indexFileHeader(); - const indexRecordsStart = 17 + indexFileHeader.indexLength; - const headerOffset = headers.slice(0, headerIndex).reduce((acc, header) => { - return ( - acc + Number(header.indexRecordCount) * IndexFileV1.INDEX_RECORD_SIZE - ); - }, 0); - const recordOffset = - indexRecordsStart + headerOffset + offset * IndexFileV1.INDEX_RECORD_SIZE; - const buffer = await this.resolver( - recordOffset, - recordOffset + IndexFileV1.INDEX_RECORD_SIZE - ); - const data = new DataView(buffer); - - const dataNumber = data.getBigUint64(0); - const fieldStartByteOffset = data.getBigUint64(8); - const fieldLength = decodeFloatingInt16(data.getUint16(16)); - - return { - dataNumber: Number(dataNumber), - fieldStartByteOffset: Number(fieldStartByteOffset), - fieldLength: fieldLength, - }; - } - - async dataRecord(offset: number) { - if (offset < 0) { - throw new Error("offset out of range"); - } - const indexFileHeader = await this.indexFileHeader(); - if (offset >= indexFileHeader.dataCount) { - throw new Error("offset out of range"); - } - const headers = await this.indexHeaders(); - const indexRecordsLength = headers.reduce((acc, header) => { - return ( - acc + Number(header.indexRecordCount) * IndexFileV1.INDEX_RECORD_SIZE - ); - }, 0); - const start = 17 + indexFileHeader.indexLength + indexRecordsLength; - // fetch the byte offsets. if offset is 0, we can just fetch the first 8 bytes. - if (offset === 0) { - const buffer = await this.resolver( - start + offset * 8, - start + offset * 8 + 8 - ); - const data = new DataView(buffer); - const endByteOffset = data.getBigUint64(0); - return { - startByteOffset: 0, - endByteOffset: Number(endByteOffset), - }; - } - - const buffer = await this.resolver( - start + (offset - 1) * 8, - start + offset * 8 + 8 - ); - const data = new DataView(buffer); - const startByteOffset = data.getBigUint64(0); - const endByteOffset = data.getBigUint64(8); - return { - startByteOffset: Number(startByteOffset), - endByteOffset: Number(endByteOffset), - }; - } -} diff --git a/src/index-file/index-file.ts b/src/index-file/index-file.ts new file mode 100644 index 00000000..fbaf701b --- /dev/null +++ b/src/index-file/index-file.ts @@ -0,0 +1,114 @@ +import { LinkedMetaPage } from "../btree/multi"; +import { LengthIntegrityError, RangeResolver } from "../resolver"; +import { IndexMeta, unmarshalBinaryForIndexMeta } from "./index-meta"; + + + +export class IndexFile { + static async forUrl(url: string) { + return await IndexFile.forResolver( + async ({ start, end, expectedLength }) => { + const response = await fetch(url, { + headers: { Range: `bytes=${start}-${end}` }, + }); + const totalLength = Number( + response.headers.get("Content-Range")!.split("/")[1] + ); + if (expectedLength && totalLength !== expectedLength) { + throw new LengthIntegrityError(); + } + return { + data: await response.arrayBuffer(), + totalLength: totalLength, + }; + } + ); + } + + static async forResolver( + resolver: RangeResolver + ): Promise> { + return new IndexFileV1(resolver); + } +} + +function decodeFloatingInt16(x: number) { + const exponent = x >> 11; + const mantissa = x & 0x7ff; + return (1 << exponent) * mantissa + (1 << (exponent + 11)) - (1 << 11); +} + +export type FileMeta = { + version: number; + format: number; + readOffset: bigint; +}; + +export interface VersionedIndexFile { + tree(): Promise; + + metadata(): Promise; + + indexHeaders(): Promise; +} + +class IndexFileV1 implements VersionedIndexFile { + private _tree?: LinkedMetaPage; + + constructor(private resolver: RangeResolver) {} + + async tree(): Promise { + if (this._tree) { + return this._tree; + } + + this._tree = new LinkedMetaPage(this.resolver, 0); + + return this._tree; + } + + async metadata(): Promise { + const tree = await this.tree(); + + const buffer = await tree.metadata(); + + // unmarshall binary for FileMeta + if (buffer.byteLength < 9) { + return null; + } + + const dataView = new DataView(buffer); + const version = dataView.getUint8(0); + const format = dataView.getUint8(1); + + const readOffset = dataView.getBigUint64(2); + + return { + version: version, + format: format, + readOffset: readOffset, + }; + } + + async indexHeaders(): Promise { + let headers: IndexMeta[] = []; + + let mp = await this.tree(); + + while (mp) { + const next = await mp.next(); + if (next === null) { + return headers; + } + + const nextBuffer = await next?.metadata(); + const indexMeta = await unmarshalBinaryForIndexMeta(this.resolver, nextBuffer); + + headers.push(indexMeta); + + mp = next; + } + + return headers; + } +} diff --git a/src/index-file/index-meta.ts b/src/index-file/index-meta.ts new file mode 100644 index 00000000..8e6ce594 --- /dev/null +++ b/src/index-file/index-meta.ts @@ -0,0 +1,39 @@ +import { RangeResolver } from "../resolver"; + +export type IndexMeta = { + fieldName: string; + fieldType: bigint; +}; + +export async function unmarshalBinaryForIndexMeta( + resolver: RangeResolver, + buffer: ArrayBuffer +): Promise { + if (buffer.byteLength < 10) { + throw new Error(`invalid metadata size ${buffer.byteLength}`); + } + + const indexMeta = { + fieldName: "", + fieldType: BigInt(0), + }; + + const dataView = new DataView(buffer); + + indexMeta.fieldType = dataView.getBigUint64(0); + + const nameLength = dataView.getUint16(8); + + if (buffer.byteLength < 10 + nameLength) { + throw new Error(`invalid metadata size: ${buffer.byteLength}`); + } + + const { data: fieldNameData } = await resolver({ + start: 10, + end: 10 + nameLength - 1, + }); + + indexMeta.fieldName = new TextDecoder("utf-8").decode(fieldNameData); + + return indexMeta; +} diff --git a/src/index.ts b/src/index.ts index 9702bb83..d92fed18 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import { DataFile } from "./data-file"; import { Database, FieldType} from "./db/database"; -import { IndexFile } from "./index-file"; +import { IndexFile } from "./index-file/index-file"; import { RangeResolver } from "./resolver"; export enum FormatType { diff --git a/src/tests/node.test.ts b/src/tests/node.test.ts index 58596874..8dae6688 100644 --- a/src/tests/node.test.ts +++ b/src/tests/node.test.ts @@ -3,7 +3,7 @@ import { MemoryPointer, ReferencedValue, compareBytes, -} from "../bptree/node"; +} from "../btree/node"; import { RangeResolver } from "../resolver"; const strToUint8Array = (str: string) => { @@ -50,23 +50,23 @@ describe("test binary search", () => { beforeEach(() => { keys = [ { - dataPointer: { offset: 3, length: 1 }, + dataPointer: { offset: BigInt(3), length: 1 }, value: Buffer.from(strToUint8Array("omoplata")), }, { - dataPointer: { offset: 4, length: 1 }, + dataPointer: { offset: BigInt(4), length: 1 }, value: Buffer.from(strToUint8Array("tarikoplata")), }, { - dataPointer: { offset: 1, length: 1 }, + dataPointer: { offset: BigInt(1), length: 1 }, value: Buffer.from(strToUint8Array("baratoplata")), }, { - dataPointer: { offset: 2, length: 1 }, + dataPointer: { offset: BigInt(2), length: 1 }, value: Buffer.from(strToUint8Array("choibar")), }, { - dataPointer: { offset: 0, length: 1 }, + dataPointer: { offset: BigInt(0), length: 1 }, value: Buffer.from(strToUint8Array("armbar")), }, ]; @@ -164,7 +164,7 @@ describe("test readNode", () => { }; }); - mockMemoryPointer = { offset: 0, length: mockLeafNodeData.length }; + mockMemoryPointer = { offset: BigInt(0), length: mockLeafNodeData.length }; const { node, bytesRead } = await BPTreeNode.fromMemoryPointer( mockMemoryPointer, @@ -179,7 +179,7 @@ describe("test readNode", () => { it("create non-leaf BPTreeNode from memory", async () => { const nonLeafMemoryPointer = { - offset: 0, + offset: BigInt(0), length: mockNonLeafNodeData.length, }; @@ -203,7 +203,7 @@ describe("test readNode", () => { it("create empty leaf BPTreeNode from memory", async () => { const leafMemoryPointer = { - offset: 0, + offset: BigInt(0), length: emptyLeafNodeData.length, }; diff --git a/src/tests/query-builder.test.ts b/src/tests/query-builder.test.ts index 7c0201a9..0289899f 100644 --- a/src/tests/query-builder.test.ts +++ b/src/tests/query-builder.test.ts @@ -1,8 +1,7 @@ -import { DataFile } from "../data-file"; import { Database, Query } from "../db/database"; import { QueryBuilder } from "../db/query-builder"; import { validateQuery } from "../db/query-validation"; -import { Header } from "../index-file"; +import { IndexMeta } from "../index-file/index-meta"; describe("test validate queries", () => { interface MockSchema { @@ -13,26 +12,22 @@ describe("test validate queries", () => { payment_type: {}; } - const headers: Header[] = [ + const headers: IndexMeta[] = [ { fieldName: "VendorID", fieldType: BigInt(2), - indexRecordCount: BigInt(683211), }, { fieldName: "store_and_fwd_flag", fieldType: BigInt(33), - indexRecordCount: BigInt(423), }, { fieldName: "fare_amount", fieldType: BigInt(2), - indexRecordCount: BigInt(68211), }, { fieldName: "payment_type", fieldType: BigInt(33), - indexRecordCount: BigInt(63887), }, ]; diff --git a/src/tests/query-validation.test.ts b/src/tests/query-validation.test.ts index 4514721f..98faa927 100644 --- a/src/tests/query-validation.test.ts +++ b/src/tests/query-validation.test.ts @@ -1,6 +1,6 @@ import { Query } from "../db/database"; import { validateQuery } from "../db/query-validation"; -import { Header } from "../index-file"; +import { IndexMeta } from "../index-file/index-meta"; describe("test validate queries", () => { interface MockSchema { @@ -11,26 +11,22 @@ describe("test validate queries", () => { payment_type: {}; } - const headers: Header[] = [ + const headers: IndexMeta[] = [ { fieldName: "VendorID", fieldType: BigInt(2), - indexRecordCount: BigInt(683211), }, { fieldName: "store_and_fwd_flag", fieldType: BigInt(33), - indexRecordCount: BigInt(423), }, { fieldName: "fare_amount", fieldType: BigInt(2), - indexRecordCount: BigInt(68211), }, { fieldName: "payment_type", fieldType: BigInt(34), - indexRecordCount: BigInt(63887), }, ];