diff --git a/examples/chat/.gitignore b/examples/chat/.gitignore deleted file mode 100644 index f06235c4..00000000 --- a/examples/chat/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist diff --git a/examples/chat/DESIGN.md b/examples/chat/DESIGN.md deleted file mode 100644 index 1fd8bf24..00000000 --- a/examples/chat/DESIGN.md +++ /dev/null @@ -1,20 +0,0 @@ -## Chat Design - -Building a real-time messaging platform without a dedicated server. - -### Description - -This chat is a single channel, where multiple people can write and read messages. - -#### Message.index - -```typescript -{ - username: string; - message_id: number; - timestamp: number; - content: string; -} -``` - -We can query for messages sent by a specific user or by a specific date or time. diff --git a/examples/chat/README.md b/examples/chat/README.md deleted file mode 100644 index b1fd8937..00000000 --- a/examples/chat/README.md +++ /dev/null @@ -1,24 +0,0 @@ -```bash -$ npm install -``` - -In the project directory, you can run: - -### `npm run dev` or `npm start` - -Runs the app in the development mode.
-Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.
- -### `npm run build` - -Builds the app for production to the `dist` folder.
-It correctly bundles Solid in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.
-Your app is ready to be deployed! - -## Deployment - -You can deploy the `dist` folder to any static host provider (netlify, surge, now, etc.) diff --git a/examples/chat/declarations.d.ts b/examples/chat/declarations.d.ts deleted file mode 100644 index 229aee5f..00000000 --- a/examples/chat/declarations.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module "*.js"; diff --git a/examples/chat/index.html b/examples/chat/index.html deleted file mode 100644 index ffc008c0..00000000 --- a/examples/chat/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - Appendable Chat - - - -
- - - - diff --git a/examples/chat/package-lock.json b/examples/chat/package-lock.json deleted file mode 100644 index fadd3208..00000000 --- a/examples/chat/package-lock.json +++ /dev/null @@ -1,3238 +0,0 @@ -{ - "name": "appendable-chat", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "appendable-chat", - "version": "0.0.1", - "license": "MIT", - "dependencies": { - "solid-js": "^1.8.11", - "unique-names-generator": "^4.7.1" - }, - "devDependencies": { - "autoprefixer": "^10.4.18", - "postcss": "^8.4.35", - "solid-devtools": "^0.29.2", - "tailwindcss": "^3.4.1", - "typescript": "^5.3.3", - "vite": "^5.0.11", - "vite-plugin-solid": "^2.8.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nothing-but/utils": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@nothing-but/utils/-/utils-0.12.1.tgz", - "integrity": "sha512-1qZU1Q5El0IjE7JT/ucvJNzdr2hL3W8Rm27xNf1p6gb3Nw8pGnZmxp6/GEW9h+I1k1cICxXNq25hBwknTQ7yhg==", - "dev": true - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", - "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", - "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", - "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", - "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", - "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", - "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", - "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", - "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", - "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz", - "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", - "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", - "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", - "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@solid-devtools/debugger": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@solid-devtools/debugger/-/debugger-0.23.3.tgz", - "integrity": "sha512-VrgswTjb2FyHxQJp5y5u7OaJ2k1R14LYlAOX/1rDZrGHWKdGYCaWHGzxI7C8AExtMP+LS+WOxy0uXMPQpoAD2g==", - "dev": true, - "dependencies": { - "@nothing-but/utils": "~0.12.0", - "@solid-devtools/shared": "^0.13.1", - "@solid-primitives/bounds": "^0.0.118", - "@solid-primitives/cursor": "^0.0.112", - "@solid-primitives/event-bus": "^1.0.8", - "@solid-primitives/event-listener": "^2.3.0", - "@solid-primitives/keyboard": "^1.2.5", - "@solid-primitives/platform": "^0.1.0", - "@solid-primitives/rootless": "^1.4.2", - "@solid-primitives/scheduled": "^1.4.1", - "@solid-primitives/static-store": "^0.0.5", - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.8.0" - } - }, - "node_modules/@solid-devtools/shared": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@solid-devtools/shared/-/shared-0.13.1.tgz", - "integrity": "sha512-qaAcZF47FFr4alVQSy5ooLy7mMt4MMDxSHw52heY1oCut8yfXDrnLcYDONabfoin2WYIwsQpjYhryHgjtB0uDg==", - "dev": true, - "dependencies": { - "@solid-primitives/event-bus": "^1.0.8", - "@solid-primitives/event-listener": "^2.3.0", - "@solid-primitives/media": "^2.2.5", - "@solid-primitives/refs": "^1.0.5", - "@solid-primitives/rootless": "^1.4.2", - "@solid-primitives/scheduled": "^1.4.1", - "@solid-primitives/static-store": "^0.0.5", - "@solid-primitives/styles": "^0.0.111", - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.8.0" - } - }, - "node_modules/@solid-primitives/bounds": { - "version": "0.0.118", - "resolved": "https://registry.npmjs.org/@solid-primitives/bounds/-/bounds-0.0.118.tgz", - "integrity": "sha512-Qj42w8LlnhJ3r/t+t0c0vrdwIvvQMPgjEFGmLiwREaA85ojLbgL9lSBq2tKvljeLCvRVkgj10KEUf+vc99VCIg==", - "dev": true, - "dependencies": { - "@solid-primitives/event-listener": "^2.3.0", - "@solid-primitives/resize-observer": "^2.0.22", - "@solid-primitives/static-store": "^0.0.5", - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/cursor": { - "version": "0.0.112", - "resolved": "https://registry.npmjs.org/@solid-primitives/cursor/-/cursor-0.0.112.tgz", - "integrity": "sha512-TAtU7qD7ipSLSXHnq8FhhosAPVX+dnOCb/ITcGcLlj8e/C9YKcxDhgBHJ3R/d1xDRb5/vO/szJtEz6fnQD311Q==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/event-bus": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@solid-primitives/event-bus/-/event-bus-1.0.11.tgz", - "integrity": "sha512-bSwVA4aI2aNHomSbEroUnisMSyDDXJbrw4U8kFEvrcYdlLrJX5i6QeCFx+vj/zdQQw62KAllrEIyWP8KMpPVnQ==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/event-listener": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@solid-primitives/event-listener/-/event-listener-2.3.3.tgz", - "integrity": "sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/keyboard": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@solid-primitives/keyboard/-/keyboard-1.2.8.tgz", - "integrity": "sha512-pJtcbkjozS6L1xvTht9rPpyPpX55nAkfBzbFWdf3y0Suwh6qClTibvvObzKOf7uzQ+8aZRDH4LsoGmbTKXtJjQ==", - "dev": true, - "dependencies": { - "@solid-primitives/event-listener": "^2.3.3", - "@solid-primitives/rootless": "^1.4.5", - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/media": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@solid-primitives/media/-/media-2.2.8.tgz", - "integrity": "sha512-jcwTxjEn07W5KEeQIc0nR+07xRjvsWTf115PIwScCWgo6aPkfW3x74aq7lH5F3mLfb/9SeTn0ixz8fBVel3cHg==", - "dev": true, - "dependencies": { - "@solid-primitives/event-listener": "^2.3.3", - "@solid-primitives/rootless": "^1.4.5", - "@solid-primitives/static-store": "^0.0.8", - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/media/node_modules/@solid-primitives/static-store": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.0.8.tgz", - "integrity": "sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/platform": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/platform/-/platform-0.1.2.tgz", - "integrity": "sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==", - "dev": true, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/refs": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@solid-primitives/refs/-/refs-1.0.8.tgz", - "integrity": "sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/resize-observer": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@solid-primitives/resize-observer/-/resize-observer-2.0.25.tgz", - "integrity": "sha512-jVDXkt2MiriYRaz4DYs62185d+6jQ+1DCsR+v7f6XMsIJJuf963qdBRFjtZtKXBaxdPNMyuPeDgf5XQe3EoDJg==", - "dev": true, - "dependencies": { - "@solid-primitives/event-listener": "^2.3.3", - "@solid-primitives/rootless": "^1.4.5", - "@solid-primitives/static-store": "^0.0.8", - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/resize-observer/node_modules/@solid-primitives/static-store": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.0.8.tgz", - "integrity": "sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/rootless": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@solid-primitives/rootless/-/rootless-1.4.5.tgz", - "integrity": "sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.3" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/scheduled": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@solid-primitives/scheduled/-/scheduled-1.4.3.tgz", - "integrity": "sha512-HfWN5w7b7FEc6VPLBKnnE302h90jsLMuR28Fcf7neRGGf8jBj6wm6/UFQ00VlKexHFMR6KQ2u4VBh5a1ZcqM8g==", - "dev": true, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/static-store": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.0.5.tgz", - "integrity": "sha512-ssQ+s/wrlFAEE4Zw8GV499yBfvWx7SMm+ZVc11wvao4T5xg9VfXCL9Oa+x4h+vPMvSV/Knv5LrsLiUa+wlJUXQ==", - "dev": true, - "dependencies": { - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/styles": { - "version": "0.0.111", - "resolved": "https://registry.npmjs.org/@solid-primitives/styles/-/styles-0.0.111.tgz", - "integrity": "sha512-1mBxOGAPXmfD5oYCvqjKBDN7SuNjz2qz7RdH7KtsuNLQh6lpuSKadtHnLvru0Y8Vz1InqTJisBIy/6P5kyDmPw==", - "dev": true, - "dependencies": { - "@solid-primitives/rootless": "^1.4.2", - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/utils": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.2.3.tgz", - "integrity": "sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==", - "dev": true, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-plugin-jsx-dom-expressions": { - "version": "0.37.17", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.37.17.tgz", - "integrity": "sha512-1bv8rOTzs6TR3DVyVZ7ElxyPEhnS556FMWRIsB3gBPfkn/cSKaLvXLGk+X1lvI+SzcUo4G+UcmJrn3vr1ig8mQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "7.18.6", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.20.7", - "html-entities": "2.3.3", - "validate-html-nesting": "^1.2.1" - }, - "peerDependencies": { - "@babel/core": "^7.20.12" - } - }, - "node_modules/babel-plugin-jsx-dom-expressions/node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/babel-preset-solid": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.8.15.tgz", - "integrity": "sha512-P2yOQbB7Hn/m4YvpXV6ExHIMcgNWXWXcvY4kJzG3yqAB3hKS58OZRsvJ7RObsZWqXRvZTITBIwnpK0BMGu+ZIQ==", - "dev": true, - "dependencies": { - "babel-plugin-jsx-dom-expressions": "^0.37.17" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001596", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", - "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.696", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.696.tgz", - "integrity": "sha512-SOr0bHP52OvYg2chCsz/0+FUSMGFm8L8HKwPpx3cbwRY24EOemVJtbgTm+IFO8LzhcnPy+hXmTq7ZcZ8uUuaYg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge-anything": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", - "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", - "dev": true, - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", - "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.1", - "@rollup/rollup-android-arm64": "4.12.1", - "@rollup/rollup-darwin-arm64": "4.12.1", - "@rollup/rollup-darwin-x64": "4.12.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.1", - "@rollup/rollup-linux-arm64-gnu": "4.12.1", - "@rollup/rollup-linux-arm64-musl": "4.12.1", - "@rollup/rollup-linux-riscv64-gnu": "4.12.1", - "@rollup/rollup-linux-x64-gnu": "4.12.1", - "@rollup/rollup-linux-x64-musl": "4.12.1", - "@rollup/rollup-win32-arm64-msvc": "4.12.1", - "@rollup/rollup-win32-ia32-msvc": "4.12.1", - "@rollup/rollup-win32-x64-msvc": "4.12.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/seroval": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.0.4.tgz", - "integrity": "sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval-plugins": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.0.4.tgz", - "integrity": "sha512-DQ2IK6oQVvy8k+c2V5x5YCtUa/GGGsUwUBNN9UqohrZ0rWdUapBFpNMYP1bCyRHoxOJjdKGl+dieacFIpU/i1A==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/solid-devtools": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/solid-devtools/-/solid-devtools-0.29.3.tgz", - "integrity": "sha512-9j3VxVbEoC54ML22gAMytR8ZS1nk9xKatsWziKSkI4c/Bcyh4sxQBGESHuXSLs9xaxpyGVTmFl3hknoxEpKzlA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.3", - "@babel/plugin-syntax-typescript": "^7.23.3", - "@babel/types": "^7.23.3", - "@solid-devtools/debugger": "^0.23.3", - "@solid-devtools/shared": "^0.13.1" - }, - "peerDependencies": { - "solid-js": "^1.8.0", - "solid-start": "^0.3.0", - "vite": "^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "solid-start": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/solid-js": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.15.tgz", - "integrity": "sha512-d0QP/efr3UVcwGgWVPveQQ0IHOH6iU7yUhc2piy8arNG8wxKmvUy1kFxyF8owpmfCWGB87usDKMaVnsNYZm+Vw==", - "dependencies": { - "csstype": "^3.1.0", - "seroval": "^1.0.3", - "seroval-plugins": "^1.0.3" - } - }, - "node_modules/solid-refresh": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", - "integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.23.6", - "@babel/helper-module-imports": "^7.22.15", - "@babel/types": "^7.23.6" - }, - "peerDependencies": { - "solid-js": "^1.3" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unique-names-generator": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", - "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/validate-html-nesting": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.2.tgz", - "integrity": "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==", - "dev": true - }, - "node_modules/vite": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", - "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "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 - } - } - }, - "node_modules/vite-plugin-solid": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.10.1.tgz", - "integrity": "sha512-kfVdNLWaJqaJVL52U6iCCKNW/nXE7bS1VVGOWPGllOkJfcNILymVSY0LCBLSnyy0iYnRtrXpiHm14rMuzeC7CA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.3", - "@types/babel__core": "^7.20.4", - "babel-preset-solid": "^1.8.4", - "merge-anything": "^5.1.7", - "solid-refresh": "^0.6.3", - "vitefu": "^0.2.5" - }, - "peerDependencies": { - "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", - "solid-js": "^1.7.2", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@testing-library/jest-dom": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/examples/chat/package.json b/examples/chat/package.json deleted file mode 100644 index 640f79ad..00000000 --- a/examples/chat/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "appendable-chat", - "version": "0.0.1", - "description": "", - "scripts": { - "start": "vite", - "dev": "vite", - "build": "vite build", - "serve": "vite preview" - }, - "license": "MIT", - "devDependencies": { - "autoprefixer": "^10.4.18", - "postcss": "^8.4.35", - "solid-devtools": "^0.29.2", - "tailwindcss": "^3.4.1", - "typescript": "^5.3.3", - "vite": "^5.0.11", - "vite-plugin-solid": "^2.8.2" - }, - "dependencies": { - "solid-js": "^1.8.11", - "unique-names-generator": "^4.7.1" - } -} diff --git a/examples/chat/postcss.config.js b/examples/chat/postcss.config.js deleted file mode 100644 index 12a703d9..00000000 --- a/examples/chat/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/examples/chat/src/App.tsx b/examples/chat/src/App.tsx deleted file mode 100644 index 1da00d22..00000000 --- a/examples/chat/src/App.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import type { Component } from "solid-js"; -import { init } from "../src/appendable/appendable.min.js"; -import Header from "./header.jsx"; -import Channel from "./chat/channel.jsx"; -import Textbar from "./chat/textbar.jsx"; -import { createResource, createSignal } from "solid-js"; -import UserModal, { getCookie } from "./user.js"; - -export function generateUniqueId(): number { - return Number(`${Date.now()}${Math.floor(Math.random() * 1000000)}`); -} - -// For a more detailed guide on the design, read DESIGN.md -export type Message = { - username: string; - messageId: number; - timestamp: number; - content: string; -}; - -const App: Component = () => { - async function fetchMessageData(): Promise { - // fetch for all messages - // we would be making a db.query() call here - return []; - } - - const [user, setUser] = createSignal(getCookie("user")); - const [messages, { refetch }] = createResource(fetchMessageData); - - return ( -
-
-
- {!user() && } - - -
-
- ); -}; - -export default App; diff --git a/examples/chat/src/appendable/appendable.min.js b/examples/chat/src/appendable/appendable.min.js deleted file mode 100644 index 646be650..00000000 --- a/examples/chat/src/appendable/appendable.min.js +++ /dev/null @@ -1,1018 +0,0 @@ -function Z(n) { - let e = null, - t = !1, - r = n.getReader(); - return async (a) => { - if (r instanceof ReadableStreamBYOBReader) return await r.read(a); - for (;;) { - if (e) { - let l = Math.min(e.length, a.length); - return ( - a.set(e.subarray(0, l)), - (e = e.subarray(l)), - e.length === 0 && (e = null), - { done: t && e === null, value: a.subarray(0, l) } - ); - } - let o = await r.read(); - o.value && (e = o.value), (t ||= o.done); - } - }; -} -function X(n) { - let e = n.split(" "); - if (e.length !== 2) throw new Error("Invalid Content-Range header"); - let [t, r] = e[1].split("/"), - [a, o] = t.split("-"); - return [e[0], Number(a), Number(o), Number(r)]; -} -async function* $(n, e) { - let t = Z(e), - r = n.split(";"); - if (r[0] !== "multipart/byteranges") - throw new Error("Not a multipart/byteranges body"); - let a = r - .map((c) => c.trim()) - .find((c) => c.startsWith("boundary=")) - ?.split("=", 2)?.[1]; - if (!a) throw new Error("No boundary found"); - let o = `--${a}`, - l = {}, - d = new Uint8Array(4096), - i = 0, - u = 0, - b = async () => { - if (u === d.byteLength) throw new Error("no buffer space left"); - let { done: c, value: p } = await t( - i + u >= d.length - ? d.subarray((i + u) % d.length, i) - : d.subarray(i + u, d.length), - ); - return c || ((u += p.length), !1); - }; - for (;;) { - for (let s = 0; s < o.length; s++) { - for (; u === 0; ) if (await b()) return; - if (d[i] !== o.charCodeAt(s)) - throw ( - (console.log("boundary.charCode", d[i], o.charCodeAt(s), s), - new Error("Invalid boundary")) - ); - (i = (i + 1) % d.length), u--; - } - for (let s of [ - "\r", - ` -`, - ]) { - for (; u === 0; ) if (await b()) return; - if (d[i] === s.charCodeAt(0)) (i = (i + 1) % d.length), u--; - else { - if (d[i] === 45) return; - throw new Error("Invalid boundary"); - } - } - let c = 0, - p = []; - for (;;) { - for (; u === 0; ) if (await b()) return; - let s = d[i]; - if (((i = (i + 1) % d.length), u--, c === 13 && s === 10)) { - if (p.length === 1) break; - { - let m = new TextDecoder().decode(new Uint8Array(p)), - f = m.split(":", 2); - if (f.length !== 2) throw new Error(`Invalid header: ${m}`); - let [g, Y] = f; - (l[g.trim()] = Y.trim()), (p.length = 0); - } - } else p.push(s); - c = s; - } - if (!l["Content-Range"]) throw new Error("Missing Content-Range header"); - let [x, L, P] = X(l["Content-Range"]); - if (x !== "bytes") throw new Error("Invalid Content-Range header"); - let w = P - L + 1, - h = new Uint8Array(w); - for (let s = 0; s < w; s++) { - for (; u === 0; ) if (await b()) return; - (h[s] = d[i]), (i = (i + 1) % d.length), u--; - } - yield { data: h.buffer, headers: l }, (l = {}); - for (let s of [ - "\r", - ` -`, - ]) { - for (; u === 0; ) if (await b()) return; - if (d[i] === s.charCodeAt(0)) (i = (i + 1) % d.length), u--; - else throw new Error("Invalid boundary"); - } - } -} -var M = class extends Error { - constructor() { - super("length integrity error"); - } -}; -async function H(n, e) { - let t = e.map(async ({ start: r, end: a, expectedLength: o }) => { - let l = `${r}-${a}`, - d = await fetch(n, { headers: { Range: `bytes=${l}` } }), - i = Number(d.headers.get("Content-Range").split("/")[1]); - if (o && i !== o) throw new M(); - return { data: await d.arrayBuffer(), totalLength: i }; - }); - return await Promise.all(t); -} -async function A(n, e, t) { - let { useMultipartByteRanges: r } = t; - if (r === !1) return await H(n, e); - let a = e.map(({ start: l, end: d }) => `${l}-${d}`).join(","), - o = await fetch(n, { - headers: { Range: `bytes=${a}`, Accept: "multipart/bytesranges" }, - }); - switch (o.status) { - case 200: - return ( - console.warn( - "useMultipartByteRanges is enabled but the server indicated did not respond with a subset of bytes. Set useMultipartByteRanges: false in your Appendable config object.", - ), - await H(n, e) - ); - case 206: - let l = o.headers.get("Content-Type"); - if (!l) throw new Error("Missing Content-Type in response"); - if (l.includes("multipart/byteranges")) { - let i = []; - if (!o.body) throw new Error(`response body is null: ${o.body}`); - for await (let u of $(l, o.body)) i.push(u); - return ( - i[i.length - 1].data === void 0 && i.pop(), - i.map(({ data: u, headers: b }) => { - let c = b["content-range"]?.split("/")[1], - p = c ? parseInt(c, 10) : 0; - return { data: u, totalLength: p }; - }) - ); - } else if (o.headers.has("Content-Range")) { - let i = await o.arrayBuffer(), - u = Number(o.headers.get("Content-Range").split("/")[1]); - return [{ data: i, totalLength: u }]; - } else throw new Error(`Unexpected response format: ${l}`); - case 416: - let d = o.headers.get("Range") || a; - throw new Error(`Resolver cannot serve the requested ranges: ${d}`); - default: - throw new Error(`Expected 206 or 200 response, got ${o.status}`); - } -} -var B = class n { - constructor(e) { - this.resolver = e; - } - static forUrl(e, t) { - return n.forResolver(async (r) => await A(e, r, t)); - } - static forResolver(e) { - let t = new n(async (r) => await e(r)); - return (t.originalResolver = e), t; - } - getResolver() { - return this.originalResolver; - } - async get(e, t) { - let r = await this.resolver([{ start: e, end: t }]); - return new TextDecoder().decode(r[0].data); - } -}; -var E = ((t) => ((t[(t.JSONL = 0)] = "JSONL"), (t[(t.CSV = 1)] = "CSV"), t))( - E || {}, -); -async function k(n) { - if (n.byteLength < 4) - throw new Error(`invalid metadata size ${n.byteLength}`); - let e = new DataView(n), - t = e.getUint16(0, !0), - r = e.getUint16(2, !0); - if (n.byteLength < 4 + r) - throw new Error(`invalid metadata size ${n.byteLength}`); - let a = n.slice(4, 4 + r); - return { fieldName: new TextDecoder("utf-8").decode(a), fieldType: t }; -} -function Q(n) { - let e = new Map(); - for (let r of n) - if (!e.has(r.fieldName)) e.set(r.fieldName, [r.fieldType]); - else { - let a = e.get(r.fieldName); - a?.push(r.fieldType), e.set(r.fieldName, a); - } - let t = []; - return ( - e.forEach((r, a) => { - t.push({ fieldName: a, fieldTypes: r }); - }), - t - ); -} -var _ = 4096, - S = class n { - constructor(e, t, r, a, o, l) { - (this.keys = e), - (this.leafPointers = t), - (this.internalPointers = r), - (this.dataFileResolver = a), - (this.fileFormat = o), - (this.pageFieldType = l); - } - leaf() { - return this.leafPointers.length > 0; - } - pointer(e) { - return this.leaf() - ? this.leafPointers[e] - : { offset: this.internalPointers[e], length: 0 }; - } - numPointers() { - return this.internalPointers.length + this.leafPointers.length; - } - size() { - let e = 4; - for (let t = 0; t <= this.keys.length - 1; t++) { - let r = this.keys[t]; - r.dataPointer.length > 0 ? (e += 16) : (e += 4 * r.value.byteLength); - } - for (let t = 0; t <= this.leafPointers.length - 1; t++) e += 12; - for (let t = 0; t <= this.internalPointers.length - 1; t++) e += 8; - return BigInt(e); - } - async unmarshalBinary(e) { - let t = new DataView(e), - r = t.getUint32(0, !0); - if ( - (r > 2147483647 && (r = r - 4294967296), - r < 0 - ? ((this.leafPointers = new Array(-r) - .fill({ offset: 0n, length: 0 }) - .map(() => ({ offset: 0n, length: 0 }))), - (this.keys = new Array(-r) - .fill(null) - .map(() => new y({ offset: 0n, length: 0 }, new ArrayBuffer(0))))) - : ((this.internalPointers = Array(r + 1) - .fill(0n) - .map(() => 0n)), - (this.keys = new Array(r) - .fill(null) - .map( - () => new y({ offset: 0n, length: 0 }, new ArrayBuffer(0)), - ))), - r === 0) - ) - throw new Error("empty node"); - let o = [], - l = [], - d = 4; - for (let i = 0; i <= this.keys.length - 1; i++) { - t = new DataView(e, d); - let u = t.getBigUint64(0, !0), - b = t.getUint32(8, !0); - d += 12; - let c = t.getUint32(12, !0); - if ( - ((d += 4), - this.keys[i].setDataPointer({ offset: u, length: b }), - c === -1 >>> 0) - ) { - let p = this.keys[i].dataPointer; - o.push({ - start: Number(p.offset), - end: Number(p.offset) + p.length - 1, - }), - l.push(i); - } else { - let p = e.slice(d, d + c); - this.keys[i].setValue(p), (d += p.byteLength); - } - } - o.length > 0 && - (await this.dataFileResolver(o)).forEach((u, b) => { - let c = l[b], - { data: p } = u, - x = this.parseValue(p); - this.keys[c].setValue(x); - }); - for (let i = 0; i <= this.leafPointers.length - 1; i++) - (t = new DataView(e, d)), - (this.leafPointers[i].offset = t.getBigUint64(0, !0)), - (this.leafPointers[i].length = t.getUint32(8, !0)), - (d += 12); - for (let i = 0; i <= this.internalPointers.length - 1; i++) - (t = new DataView(e, d)), - (this.internalPointers[i] = t.getBigUint64(0, !0)), - (d += 8); - } - parseValue(e) { - let t = new TextDecoder().decode(e); - switch (this.fileFormat) { - case 0: - let r = JSON.parse(t); - switch (this.pageFieldType) { - case 7: - if (r !== null) - throw new Error(`unrecognized value for null type: ${r}`); - return new ArrayBuffer(0); - case 6: - return new Uint8Array([r ? 1 : 0]).buffer; - case 3: - case 1: - case 2: - let a = new ArrayBuffer(8); - return new DataView(a).setFloat64(0, r), a; - case 0: - return new TextEncoder().encode(r).buffer; - default: - throw new Error( - `Unexpected Field Type. Got: ${this.pageFieldType}`, - ); - } - case 1: - return e; - } - } - static async fromMemoryPointer(e, t, r, a, o) { - let l = await t([ - { start: Number(e.offset), end: Number(e.offset) + 4096 - 1 }, - ]), - { data: d } = l[0], - i = new n([], [], [], r, a, o); - return await i.unmarshalBinary(d), { node: i, bytesRead: _ }; - } - }; -var I = class { - constructor(e, t) { - (this.tree = e), (this.key = t), (this.records = []); - } - async init() { - let e = await this.tree.root(); - if (e.rootNode === null) return !1; - let t = e.rootNode, - r = e.pointer, - a = await this.tree.traverse(this.key, t, r); - return (this.records = a), !0; - } - getKey() { - return this.records[0].node.keys[this.records[0].index]; - } - getPointer() { - return this.records[0].node.pointer(this.records[0].index); - } - async increment(e, t) { - if (e === this.records.length) return !1; - this.records[e].index += t; - let r = this.records[e].index < 0, - a = this.records[e].index >= this.records[e].node.numPointers(); - if (r || a) { - if (!this.increment(e + 1, t) || !this.records[e + 1]) return !1; - let o = await this.tree.readNode( - this.records[e + 1].node.pointer(this.records[e + 1].index), - ); - (this.records[e].node = o), - r - ? (this.records[e].index = this.records[e].node.numPointers() - 1) - : (this.records[e].index = 0); - } - return !0; - } - async next() { - return this.records.length === 0 ? await this.init() : this.increment(0, 1); - } - async prev() { - return this.records.length === 0 && !(await this.init()) - ? !1 - : this.increment(0, -1); - } -}; -var O = class { - constructor(e, t, r, a, o) { - (this.tree = e), - (this.meta = t), - (this.dataFileResolver = r), - (this.fileFormat = a), - (this.pageFieldType = o); - } - async root() { - let e = await this.meta.root(); - if (!e || e.length === 0) return { rootNode: null, pointer: e }; - let t = await this.readNode(e); - return t ? { rootNode: t, pointer: e } : { rootNode: null, pointer: e }; - } - async readNode(e) { - try { - let { node: t, bytesRead: r } = await S.fromMemoryPointer( - e, - this.tree, - this.dataFileResolver, - this.fileFormat, - this.pageFieldType, - ); - if (!r) throw new Error("bytes read do not line up"); - return t; - } catch (t) { - throw new Error(`${t}`); - } - } - iter(e) { - return new I(this, e); - } - async first() { - let { rootNode: e } = await this.root(); - if (!e) throw new Error("unable to get root node"); - let t = await this.readNode(e.pointer(0)); - for (; !t.leaf(); ) { - let r = t.pointer(0); - t = await this.readNode(r); - } - return t.keys[0]; - } - async last() { - let { rootNode: e } = await this.root(); - if (!e) throw new Error("unable to get root node"); - let t = await this.readNode(e.pointer(e.numPointers() - 1)); - for (; !t.leaf(); ) { - let r = t.pointer(t.numPointers() - 1); - t = await this.readNode(r); - } - return t.keys[t.keys.length - 1]; - } - async traverse(e, t, r) { - let [a, o] = ee(t.keys, e); - if (t.leaf()) return [{ node: t, index: a, pointer: r }]; - o && (a += 1); - let l = t.pointer(a), - d = await this.readNode(l); - return [ - ...(await this.traverse(e, d, l)), - { node: t, index: a, pointer: r }, - ]; - } - async find(e) { - let t = this.iter(e); - return (await t.next()) - ? [t.getKey(), t.getPointer()] - : [ - new y({ offset: 0n, length: 0 }, new Uint8Array(0).buffer), - { offset: 0n, length: 0 }, - ]; - } - }, - y = class { - constructor(e, t) { - (this.dataPointer = e), (this.value = t); - } - setDataPointer(e) { - this.dataPointer = e; - } - setValue(e) { - this.value = e; - } - static compareBytes(e, t) { - let r = new Uint8Array(e), - a = new Uint8Array(t), - o = Math.min(r.length, a.length); - for (let l = 0; l < o; l++) - if (r[l] !== a[l]) return r[l] < a[l] ? -1 : 1; - return r.length < a.length ? -1 : r.length > a.length ? 1 : 0; - } - }; -function W(n, e) { - let t = y.compareBytes(n.value, e.value); - return t !== 0 - ? t - : n.dataPointer.offset > e.dataPointer.offset - ? 1 - : n.dataPointer.offset < e.dataPointer.offset - ? -1 - : n.dataPointer.length > e.dataPointer.length - ? 1 - : n.dataPointer.length < e.dataPointer.length - ? -1 - : 0; -} -function ee(n, e) { - let t = n.length, - r = 0, - a = t; - for (; r < a; ) { - let o = Math.floor((r + a) / 2); - W(n[o], e) < 0 ? (r = o + 1) : (a = o); - } - return [r, r < t && W(n[r], e) === 0]; -} -var j = 16, - V = 4096, - D = 2n ** 64n - 1n, - N = class { - constructor(e, t, r) { - (this.resolver = e), (this.offset = t), (this.metaPageData = r); - } - async root() { - let t = (await this.getMetaPage()).slice(0, 12), - r = new DataView(t), - a = r.getBigUint64(0, !0), - o = r.getUint32(8, !0); - return { offset: a, length: o }; - } - async metadata() { - let e = await this.getMetaPage(), - r = new DataView(e, 8 * j + 16).getUint32(0, !0), - a = 8 * j + 20; - return e.slice(a, a + r); - } - setMetaPage(e) { - this.metaPageData = e; - } - async getMetaPage() { - if (this.metaPageData) return this.metaPageData; - this.metaPageDataPromise || - (this.metaPageDataPromise = this.resolver([ - { start: Number(this.offset), end: Number(this.offset) + V - 1 }, - ])); - let e = await this.metaPageDataPromise, - { data: t } = e[0]; - return t; - } - async nextNOffsets() { - let e = await this.getMetaPage(), - t = new DataView(e, 12), - r = []; - for (let a = 0; a <= j - 1; a++) { - let o = t.getBigUint64(a * 8, !0); - if (o === D) return r; - r.push(o); - } - return r; - } - getOffset() { - return this.offset; - } - }; -function q(n, e) { - let t = e < 0 ? BigInt(0) : BigInt(e + 1) * BigInt(V); - return new N(n, t); -} -var C = class n { - constructor(e) { - this.database = e; - this.queryObject = { - where: [], - orderBy: void 0, - select: void 0, - limit: void 0, - }; - } - toQuery() { - return { - where: this.queryObject.where ? [...this.queryObject.where] : [], - orderBy: this.queryObject.orderBy - ? [...this.queryObject.orderBy] - : void 0, - select: this.queryObject.select ? [...this.queryObject.select] : void 0, - limit: this.queryObject.limit, - }; - } - get() { - return this.database.query(this.queryObject); - } - where(e, t, r) { - let a = new n(this.database); - return ( - (a.queryObject = { - ...this.queryObject, - where: [ - ...(this.queryObject.where || []), - { key: e, operation: t, value: r }, - ], - }), - a - ); - } - orderBy(e, t) { - let r = new n(this.database); - return ( - (r.queryObject = { - ...this.queryObject, - orderBy: [ - ...(this.queryObject.orderBy || []), - { key: e, direction: t }, - ], - }), - r - ); - } - select(e) { - let t = new n(this.database); - return (t.queryObject = { ...this.queryObject, select: e }), t; - } - limit(e) { - let t = new n(this.database); - return (t.queryObject = { ...this.queryObject, limit: e }), t; - } -}; -function z(n) { - let e; - if (n === null) return { fieldType: 7, valueBuf: new ArrayBuffer(0) }; - switch (typeof n) { - case "bigint": - case "number": - return ( - (e = new ArrayBuffer(8)), - new DataView(e).setFloat64(0, Number(n)), - { fieldType: 3, valueBuf: e } - ); - case "boolean": - return { fieldType: 6, valueBuf: new Uint8Array([n ? 1 : 0]).buffer }; - case "string": - return { fieldType: 0, valueBuf: new TextEncoder().encode(n).buffer }; - } - return null; -} -function v(n, e) { - let t = JSON.parse(n); - return e && e.length > 0 - ? e.reduce((r, a) => (a in t && (r[a] = t[a]), r), {}) - : t; -} -function T(n, e) { - return n.includes(e); -} -function te(n, e) { - if (!n || !Array.isArray(n) || n.length === 0) - throw new Error("Missing 'where' clause."); - for (let t of n) { - if (!["<", "<=", "==", ">=", ">"].includes(t.operation)) - throw new Error("Invalid operation in 'where' clause."); - if (typeof t.key != "string") - throw new Error("'key' in 'where' clause must be a string."); - let r = e.find((o) => o.fieldName === t.key); - if (!r) - throw new Error( - `key: ${t.key} in 'where' clause does not exist in dataset.`, - ); - if (typeof t.value > "u") - throw new Error("'value' in 'where' clause is missing."); - let a = r.fieldTypes; - if (t.value === null) { - if (!T(a, 7)) - throw new Error(`null type not included in ${t.key}'s header types.`); - } else - switch (typeof t.value) { - case "bigint": - case "number": - if (!T(a, 3) && !T(a, 2) && !T(a, 1)) - throw new Error( - `number type not included in ${t.key}'s header types.`, - ); - break; - case "string": - if (!T(a, 0)) - throw new Error( - `string type not included in ${t.key}'s header types`, - ); - break; - case "boolean": - if (!T(a, 6)) - throw new Error( - `boolean type not included in ${t.key}'s header types`, - ); - break; - default: - throw new Error( - `unrecognized type: ${typeof t.value} not included in ${t.key}'s header types`, - ); - } - } -} -function re(n, e) { - if (n) { - if (!Array.isArray(n) || n.length === 0) - throw new Error("Invalid 'orderBy' clause."); - let t = n[0]; - if (!["ASC", "DESC"].includes(t.direction)) - throw new Error("Invalid direction in `orderBy`."); - if (t.key !== e) - throw new Error("'key' in `orderBy` must match `key` in `where` clause"); - } -} -function ne(n, e) { - if (n) { - if (!Array.isArray(n)) throw new Error(`select is not an array: ${n}`); - if (n.length <= 0) throw new Error(`select clause is empty: ${n}`); - let t = new Set(); - e.map((r) => t.add(r.fieldName)), - n.map((r) => { - if (!t.has(r)) - throw new Error(`${r} is not included in the field name headers`); - }); - } -} -function G(n, e) { - te(n.where, e), re(n.orderBy, n.where[0].key), ne(n.select, e); -} -var R = ((i) => ( - (i[(i.String = 0)] = "String"), - (i[(i.Int64 = 1)] = "Int64"), - (i[(i.Uint64 = 2)] = "Uint64"), - (i[(i.Float64 = 3)] = "Float64"), - (i[(i.Object = 4)] = "Object"), - (i[(i.Array = 5)] = "Array"), - (i[(i.Boolean = 6)] = "Boolean"), - (i[(i.Null = 7)] = "Null"), - i -))(R || {}); -function J(n) { - let e; - switch (n) { - case 0: - e = "String"; - break; - case 1: - e = "Int64"; - break; - case 2: - e = "Uint64"; - break; - case 3: - e = "Float64"; - break; - case 4: - e = "Object"; - break; - case 5: - e = "Array"; - break; - case 6: - e = "Boolean"; - break; - case 7: - e = "Null"; - break; - } - return e; -} -var U = class n { - constructor(e, t) { - this.dataFile = e; - this.indexFile = t; - } - static forDataFileAndIndexFile(e, t) { - return new n(e, t); - } - async fields() { - return ( - this.indexHeadersPromise || - (this.indexHeadersPromise = this.indexFile.indexHeaders()), - this.indexHeadersPromise - ); - } - async *query(e) { - if (new Set((e.where ?? []).map((o) => o.key)).size > 1) - throw new Error("composite indexes not supported... yet"); - let { format: t } = await this.indexFile.metadata(), - r = this.dataFile.getResolver(); - if (!r) throw new Error("data file is undefined"); - let a = await this.fields(); - G(e, a); - for (let { key: o, value: l, operation: d } of e.where ?? []) { - if (!a.find((h) => h.fieldName === o)) throw new Error("field not found"); - let u = z(l); - if (u === null) - throw new Error(`unable to process key with a type ${typeof l}`); - let { fieldType: b, valueBuf: c } = u, - x = (await this.indexFile.seek(o, b))[0], - { fieldType: L } = await k(await x.metadata()), - P = "ASC"; - e.orderBy && e.orderBy[0] && (P = e.orderBy[0].direction); - let w = new O(this.indexFile.getResolver(), x, r, t, L); - if (d === ">") - if (P === "ASC") { - let h = new y({ offset: 0n, length: 0 }, c), - s = w.iter(h); - for (; await s.next(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) < 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } else { - let h = await w.last(), - s = w.iter(h); - for (; await s.prev(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) < 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } - else if (d === ">=") - if (P === "ASC") { - let h = new y({ offset: 0n, length: 0 }, c), - s = w.iter(h); - for (; await s.next(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) <= 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } else { - let h = await w.last(), - s = w.iter(h); - for (; await s.prev(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) <= 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } - else if (d === "==") { - let h = new y({ offset: 0n, length: 0 }, c), - s = w.iter(h); - for (; await s.next(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) === 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } else if (d === "<=") - if (P === "DESC") { - let h = new y({ offset: D, length: 0 }, c), - s = w.iter(h); - for (; await s.prev(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) >= 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } else { - let h = await w.first(), - s = w.iter(h); - for (; await s.next(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) >= 0) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } - else if (d === "<") - if (P === "DESC") { - let h = new y({ offset: D, length: 0 }, c), - s = w.iter(h); - for (; await s.prev(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) === 1) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } else { - let h = await w.first(), - s = w.iter(h); - for (; await s.next(); ) { - let m = s.getKey(); - if (y.compareBytes(c, m.value) === 1) { - let f = s.getPointer(), - g = await this.dataFile.get( - Number(f.offset), - Number(f.offset) + f.length - 1, - ); - yield v(g, e.select); - } - } - } - } - } - where(e, t, r) { - return new C(this).where(e, t, r); - } -}; -var F = class n { - static async forUrl(e, t) { - return await n.forResolver(async (r) => await A(e, r, t)); - } - static async forResolver(e) { - return new K(e); - } - }, - K = class { - constructor(e) { - this.resolver = e; - this.linkedMetaPages = []; - } - getResolver() { - return this.resolver; - } - async tree() { - if (this._tree) return this._tree; - let e = q(this.resolver, 0); - return (this._tree = e), e; - } - async metadata() { - let t = await (await this.tree()).metadata(); - if (t.byteLength < 10) - throw new Error(`incorrect byte length! Want: 10, got ${t.byteLength}`); - let r = new DataView(t), - a = r.getUint8(0), - o = r.getUint8(1); - if (Object.values(E).indexOf(o) === -1) - throw new Error(`unexpected file format. Got: ${o}`); - let l = r.getBigUint64(2, !0); - return { version: a, format: o, readOffset: l }; - } - async seek(e, t) { - this.linkedMetaPages.length === 0 && (await this.fetchMetaPages()); - let r = []; - for (let a = 0; a <= this.linkedMetaPages.length - 1; a++) { - let o = this.linkedMetaPages[a], - l = await k(await o.metadata()); - l.fieldName === e && - (t === 3 - ? (l.fieldType === 3 || l.fieldType === 1 || l.fieldType === 2) && - r.push(o) - : l.fieldType === t && r.push(o)); - } - return r; - } - async fetchMetaPages() { - let e = await this.tree(), - t = await e.nextNOffsets(); - for (; t.length > 0; ) { - let r = t.map((l) => ({ start: Number(l), end: Number(l) + V - 1 })), - a = await this.resolver(r), - o = 0; - for (let { data: l } of a) - this.linkedMetaPages.push(new N(this.resolver, t[o], l)), o++; - (e = this.linkedMetaPages[this.linkedMetaPages.length - 1]), - (t = await e.nextNOffsets()); - } - } - async indexHeaders() { - this.linkedMetaPages.length === 0 && (await this.fetchMetaPages()); - let e = []; - for (let t of this.linkedMetaPages) { - let r = await k(await t.metadata()); - e.push(r); - } - return Q(e); - } - }; -async function ae(n, e, t) { - return ( - t || (t = { useMultipartByteRanges: !0 }), - U.forDataFileAndIndexFile( - typeof n == "string" ? B.forUrl(n, t) : B.forResolver(n), - typeof e == "string" ? await F.forUrl(e, t) : await F.forResolver(e), - ) - ); -} -globalThis.Appendable = { init: ae, FieldType: R, fieldTypeToString: J }; -export { ae as init }; -//# sourceMappingURL=appendable.min.js.map diff --git a/examples/chat/src/appendable/appendable.min.js.map b/examples/chat/src/appendable/appendable.min.js.map deleted file mode 100644 index 15e7e147..00000000 --- a/examples/chat/src/appendable/appendable.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/multipart.ts", "../src/resolver.ts", "../src/range-request.ts", "../src/data-file.ts", "../src/index-file/meta.ts", "../src/btree/node.ts", "../src/btree/traversal.ts", "../src/btree/bptree.ts", "../src/btree/multi.ts", "../src/db/query-builder.ts", "../src/db/query-logic.ts", "../src/db/query-validation.ts", "../src/db/database.ts", "../src/index-file/index-file.ts", "../src/index.ts"], - "sourcesContent": ["function getReader(stream: ReadableStream) {\n let residual: Uint8Array | null = null;\n let readDone = false;\n let reader: ReadableStreamDefaultReader = stream.getReader();\n return async (\n buf: Uint8Array,\n ): Promise> => {\n if (reader instanceof ReadableStreamBYOBReader) {\n return await reader.read(buf);\n } else {\n while (true) {\n if (residual) {\n const n = Math.min(residual.length, buf.length);\n buf.set(residual.subarray(0, n));\n residual = residual.subarray(n);\n if (residual.length === 0) {\n residual = null;\n }\n return {\n done: readDone && residual === null,\n value: buf.subarray(0, n),\n };\n }\n const result = await reader.read();\n if (result.value) {\n residual = result.value;\n }\n readDone ||= result.done;\n }\n }\n };\n}\n\nfunction parseContentRangeHeader(\n header: string,\n): [string, number, number, number] {\n // parse bytes a-b/c\n const tokens = header.split(\" \");\n if (tokens.length !== 2) {\n throw new Error(\"Invalid Content-Range header\");\n }\n const [range, total] = tokens[1].split(\"/\");\n const [start, end] = range.split(\"-\");\n return [tokens[0], Number(start), Number(end), Number(total)];\n}\n\nexport default async function* parseMultipartBody(\n contentType: string,\n stream: ReadableStream,\n): AsyncGenerator<{ data: ArrayBuffer; headers: Record }> {\n const reader = getReader(stream);\n const tokens = contentType.split(\";\");\n if (tokens[0] !== \"multipart/byteranges\") {\n throw new Error(\"Not a multipart/byteranges body\");\n }\n const boundaryToken = tokens\n .map((s) => s.trim())\n .find((s) => s.startsWith(\"boundary=\"))\n ?.split(\"=\", 2)?.[1];\n if (!boundaryToken) {\n throw new Error(\"No boundary found\");\n }\n const boundary = `--${boundaryToken}`;\n\n let headers: Record = {};\n\n const buf = new Uint8Array(4096);\n let ptr = 0;\n let length = 0;\n\n const extend = async () => {\n if (length === buf.byteLength) {\n throw new Error(\"no buffer space left\");\n }\n const { done, value } = await reader(\n ptr + length >= buf.length\n ? buf.subarray((ptr + length) % buf.length, ptr)\n : buf.subarray(ptr + length, buf.length),\n );\n if (done) {\n return done;\n }\n length += value.length;\n return false;\n };\n\n while (true) {\n // read boundary\n for (let i = 0; i < boundary.length; i++) {\n while (length === 0) {\n if (await extend()) {\n return;\n }\n }\n if (buf[ptr] !== boundary.charCodeAt(i)) {\n console.log(\"boundary.charCode\", buf[ptr], boundary.charCodeAt(i), i);\n throw new Error(\"Invalid boundary\");\n }\n ptr = (ptr + 1) % buf.length;\n length--;\n }\n\n // read the boundary terminator\n for (const c of [\"\\r\", \"\\n\"]) {\n while (length === 0) {\n if (await extend()) {\n return;\n }\n }\n if (buf[ptr] === c.charCodeAt(0)) {\n ptr = (ptr + 1) % buf.length;\n length--;\n } else if (buf[ptr] === \"-\".charCodeAt(0)) {\n // eof\n return;\n } else {\n // invalid boundary\n throw new Error(\"Invalid boundary\");\n }\n }\n\n // read headers\n let lastByte = 0;\n let header: number[] = [];\n while (true) {\n while (length === 0) {\n if (await extend()) {\n return;\n }\n }\n const byte = buf[ptr];\n ptr = (ptr + 1) % buf.length;\n length--;\n if (lastByte === \"\\r\".charCodeAt(0) && byte === \"\\n\".charCodeAt(0)) {\n // end of header\n if (header.length === 1 /* it's an \\r */) {\n // end of headers\n break;\n } else {\n const decoded = new TextDecoder().decode(new Uint8Array(header));\n const tokens = decoded.split(\":\", 2);\n if (tokens.length !== 2) {\n throw new Error(`Invalid header: ${decoded}`);\n }\n const [key, value] = tokens;\n headers[key.trim()] = value.trim();\n header.length = 0;\n }\n } else {\n header.push(byte);\n }\n lastByte = byte;\n }\n\n // read body\n // read the Content-Range header\n if (!headers[\"Content-Range\"]) {\n // TODO: read until the next boundary\n throw new Error(\"Missing Content-Range header\");\n }\n const [unit, start, end] = parseContentRangeHeader(\n headers[\"Content-Range\"],\n );\n if (unit !== \"bytes\") {\n throw new Error(\"Invalid Content-Range header\");\n }\n const contentLength = end - start + 1;\n const data = new Uint8Array(contentLength);\n for (let i = 0; i < contentLength; i++) {\n while (length === 0) {\n if (await extend()) {\n return;\n }\n }\n data[i] = buf[ptr];\n ptr = (ptr + 1) % buf.length;\n length--;\n }\n yield { data: data.buffer, headers };\n headers = {};\n\n // read the trailing \\r\\n\n for (const c of [\"\\r\", \"\\n\"]) {\n while (length === 0) {\n if (await extend()) {\n return;\n }\n }\n if (buf[ptr] === c.charCodeAt(0)) {\n ptr = (ptr + 1) % buf.length;\n length--;\n } else {\n // invalid boundary\n throw new Error(\"Invalid boundary\");\n }\n }\n }\n}\n", "/**\n * RangeResolver is a function that takes a range of bytes and returns a promise\n * that resolves to an ArrayBuffer containing the bytes in that range. Note that\n * the range is inclusive.\n *\n * Additionally, the RangeResolver must return a checksum which is computed from\n * the source data. This checksum is used to verify that the data has not been\n * changed between requests. The checksum can be any type, for example it is\n * valid to use the last modified timestamp of the source data or the total\n * length of the data. This checksum is passed to the RangeResolver on future\n * requests as the `checksum` argument. If it does not match the checksum when\n * reading the data, the RangeResolver should throw a LengthIntegrityError.\n *\n * @see LengthIntegrityError\n */\nexport type RangeResolver = (\n args: {\n start: number;\n end: number;\n expectedLength?: number;\n }[],\n) => Promise<\n {\n data: ArrayBuffer;\n totalLength: number;\n }[]\n>;\n\n/**\n * LengthIntegrityError is thrown by a RangeResolver when the length argument is\n * inconsistent with the data returned. This is used to detect when the data has\n * changed between requests.\n *\n * When a LengthIntegrityError is thrown, typically the cache is evicted and the\n * query will be tried again with the exception of the data file where the error\n * is ignored due to the assumed immutability of the data file.\n *\n * @see RangeResolver\n */\nexport class LengthIntegrityError extends Error {\n constructor() {\n super(\"length integrity error\");\n }\n}\n", "import { Config } from \".\";\nimport parseMultipartBody from \"./multipart\";\nimport { LengthIntegrityError } from \"./resolver\";\n\nasync function resolveIndividualPromises(\n url: string,\n ranges: { start: number; end: number; expectedLength?: number }[],\n) {\n // fallback to resolving ranges individually\n const individualRangePromises = ranges.map(\n async ({ start, end, expectedLength }) => {\n const rangeHeader = `${start}-${end}`;\n const res = await fetch(url, {\n headers: { Range: `bytes=${rangeHeader}` },\n });\n\n const totalLength = Number(\n res.headers.get(\"Content-Range\")!.split(\"/\")[1],\n );\n if (expectedLength && totalLength !== expectedLength) {\n throw new LengthIntegrityError();\n }\n return {\n data: await res.arrayBuffer(),\n totalLength: totalLength,\n };\n },\n );\n return await Promise.all(individualRangePromises);\n}\n\nexport async function requestRanges(\n url: string,\n ranges: { start: number; end: number; expectedLength?: number }[],\n config: Config,\n): Promise<{ data: ArrayBuffer; totalLength: number }[]> {\n const { useMultipartByteRanges } = config;\n if (useMultipartByteRanges === false) {\n return await resolveIndividualPromises(url, ranges);\n }\n\n const rangesHeader = ranges\n .map(({ start, end }) => `${start}-${end}`)\n .join(\",\");\n\n const response = await fetch(url, {\n headers: {\n Range: `bytes=${rangesHeader}`,\n Accept: \"multipart/bytesranges\",\n },\n });\n\n switch (response.status) {\n case 200:\n console.warn(\n `useMultipartByteRanges is enabled but the server indicated did not respond with a subset of bytes. Set useMultipartByteRanges: false in your Appendable config object.`,\n );\n return await resolveIndividualPromises(url, ranges);\n case 206:\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) {\n throw new Error(\"Missing Content-Type in response\");\n }\n if (contentType.includes(\"multipart/byteranges\")) {\n let chunks = [];\n\n if (!response.body) {\n throw new Error(`response body is null: ${response.body}`);\n }\n\n for await (const chunk of parseMultipartBody(\n contentType,\n response.body,\n )) {\n chunks.push(chunk);\n }\n\n // the last element is null since the final boundary marker is followed by another delim.\n if (chunks[chunks.length - 1].data === undefined) {\n chunks.pop();\n }\n\n return chunks.map(({ data, headers }) => {\n const totalLengthStr = headers[\"content-range\"]?.split(\"/\")[1];\n const totalLength = totalLengthStr ? parseInt(totalLengthStr, 10) : 0;\n\n return { data, totalLength };\n });\n } else if (response.headers.has(\"Content-Range\")) {\n const abuf = await response.arrayBuffer();\n const totalLength = Number(\n response.headers.get(\"Content-Range\")!.split(\"/\")[1],\n );\n return [\n {\n data: abuf,\n totalLength: totalLength,\n },\n ];\n } else {\n throw new Error(`Unexpected response format: ${contentType}`);\n }\n case 416:\n const requestedRange = response.headers.get(\"Range\") || rangesHeader;\n throw new Error(\n `Resolver cannot serve the requested ranges: ${requestedRange}`,\n );\n default:\n throw new Error(`Expected 206 or 200 response, got ${response.status}`);\n }\n}\n", "import { Config } from \".\";\nimport { requestRanges } from \"./range-request\";\nimport { RangeResolver } from \"./resolver\";\n\nexport class DataFile {\n private originalResolver?: RangeResolver;\n\n private constructor(private resolver: RangeResolver) {}\n\n static forUrl(url: string, config: Config) {\n return DataFile.forResolver(\n async (ranges) => await requestRanges(url, ranges, config),\n );\n }\n\n static forResolver(resolver: RangeResolver) {\n const instance = new DataFile(async (ranges) => {\n const result = await resolver(ranges);\n return result;\n });\n instance.originalResolver = resolver;\n return instance;\n }\n\n getResolver(): RangeResolver | undefined {\n return this.originalResolver;\n }\n\n async get(start: number, end: number) {\n const res = await this.resolver([{ start, end }]);\n return new TextDecoder().decode(res[0].data);\n }\n}\n", "export enum FileFormat {\n JSONL = 0,\n CSV = 1,\n}\n\nexport type FileMeta = {\n version: number;\n format: FileFormat;\n readOffset: bigint;\n};\n\nexport async function readFileMeta(buffer: ArrayBuffer): Promise {\n if (buffer.byteLength !== 10) {\n throw new Error(\n `incorrect byte length! Want: 10, got ${buffer.byteLength}`,\n );\n }\n\n const dataView = new DataView(buffer);\n\n const version = dataView.getUint8(0);\n const formatByte = dataView.getUint8(1);\n\n if (Object.values(FileFormat).indexOf(formatByte) === -1) {\n throw new Error(`unexpected file format. Got: ${formatByte}`);\n }\n\n const readOffset = dataView.getBigUint64(2, true);\n\n return {\n version,\n format: formatByte,\n readOffset,\n };\n}\n\nexport type IndexMeta = {\n fieldName: string;\n fieldType: number;\n};\n\nexport type IndexHeader = {\n fieldName: string;\n fieldTypes: number[];\n};\n\nexport async function readIndexMeta(buffer: ArrayBuffer): Promise {\n if (buffer.byteLength < 4) {\n throw new Error(`invalid metadata size ${buffer.byteLength}`);\n }\n\n const dataView = new DataView(buffer);\n const fieldType = dataView.getUint16(0, true);\n const nameLength = dataView.getUint16(2, true);\n\n if (buffer.byteLength < 4 + nameLength) {\n throw new Error(`invalid metadata size ${buffer.byteLength}`);\n }\n\n const fieldNameBuffer = buffer.slice(4, 4 + nameLength);\n const fieldName = new TextDecoder(\"utf-8\").decode(fieldNameBuffer);\n\n return {\n fieldName,\n fieldType,\n };\n}\n\nexport function collectIndexMetas(indexMetas: IndexMeta[]): IndexHeader[] {\n const headersMap: Map = new Map();\n\n for (const meta of indexMetas) {\n if (!headersMap.has(meta.fieldName)) {\n headersMap.set(meta.fieldName, [meta.fieldType]);\n } else {\n const updatedTypes = headersMap.get(meta.fieldName);\n updatedTypes?.push(meta.fieldType);\n headersMap.set(meta.fieldName, updatedTypes!!);\n }\n }\n\n const indexHeaders: IndexHeader[] = [];\n headersMap.forEach((fieldTypes, fieldName) => {\n indexHeaders.push({ fieldName, fieldTypes });\n });\n\n return indexHeaders;\n}\n", "import { FieldType } from \"../db/database\";\nimport { FileFormat } from \"../index-file/meta\";\nimport { RangeResolver } from \"../resolver\";\nimport { ReferencedValue } from \"./bptree\";\n\nexport const pageSizeBytes = 4096;\n\nexport type MemoryPointer = { offset: bigint; length: number };\nexport class BPTreeNode {\n public keys: ReferencedValue[];\n public leafPointers: MemoryPointer[];\n public internalPointers: bigint[];\n private readonly dataFileResolver: RangeResolver;\n private fileFormat: FileFormat;\n private pageFieldType: FieldType;\n\n constructor(\n keys: ReferencedValue[],\n leafPointers: MemoryPointer[],\n internalPointers: bigint[],\n dataFileResolver: RangeResolver,\n fileFormat: FileFormat,\n pageFieldType: FieldType,\n ) {\n this.keys = keys;\n this.leafPointers = leafPointers;\n this.internalPointers = internalPointers;\n this.dataFileResolver = dataFileResolver;\n this.fileFormat = fileFormat;\n this.pageFieldType = pageFieldType;\n }\n\n leaf(): boolean {\n return this.leafPointers.length > 0;\n }\n\n pointer(i: number): MemoryPointer {\n if (this.leaf()) {\n return this.leafPointers[i];\n }\n\n return {\n offset: this.internalPointers[i],\n length: 0, // disregard since this is a free value in golang version\n };\n }\n\n numPointers(): number {\n return this.internalPointers.length + this.leafPointers.length;\n }\n\n size(): bigint {\n let size = 4;\n\n for (let idx = 0; idx <= this.keys.length - 1; idx++) {\n const k = this.keys[idx];\n if (k.dataPointer.length > 0) {\n size += 4 + 12;\n } else {\n size += 4 * k.value.byteLength;\n }\n }\n\n for (let idx = 0; idx <= this.leafPointers.length - 1; idx++) {\n size += 12;\n }\n for (let idx = 0; idx <= this.internalPointers.length - 1; idx++) {\n size += 8;\n }\n\n return BigInt(size);\n }\n\n async unmarshalBinary(buffer: ArrayBuffer) {\n let dataView = new DataView(buffer);\n let size = dataView.getUint32(0, true);\n\n if (size > 2147483647) {\n size = size - 4294967296;\n }\n\n const leaf = size < 0;\n\n if (leaf) {\n this.leafPointers = new Array(-size)\n .fill({ offset: 0n, length: 0 })\n .map(() => ({\n offset: 0n,\n length: 0,\n }));\n this.keys = new Array(-size)\n .fill(null)\n .map(\n () =>\n new ReferencedValue({ offset: 0n, length: 0 }, new ArrayBuffer(0)),\n );\n } else {\n this.internalPointers = Array(size + 1)\n .fill(0n)\n .map(() => 0n);\n this.keys = new Array(size)\n .fill(null)\n .map(\n () =>\n new ReferencedValue({ offset: 0n, length: 0 }, new ArrayBuffer(0)),\n );\n }\n\n if (size === 0) {\n throw new Error(\"empty node\");\n }\n\n let dpRanges = [];\n let dpIndexes: number[] = [];\n\n let m = 4;\n for (let idx = 0; idx <= this.keys.length - 1; idx++) {\n dataView = new DataView(buffer, m);\n const dpOffset = dataView.getBigUint64(0, true);\n const dpLength = dataView.getUint32(8, true);\n m += 12;\n\n const l = dataView.getUint32(12, true);\n m += 4;\n\n this.keys[idx].setDataPointer({ offset: dpOffset, length: dpLength });\n if (l === ~0 >>> 0) {\n const dp = this.keys[idx].dataPointer;\n\n dpRanges.push({\n start: Number(dp.offset),\n end: Number(dp.offset) + dp.length - 1,\n });\n\n dpIndexes.push(idx);\n } else {\n // we are storing the values directly in the referenced value\n const value = buffer.slice(m, m + l);\n this.keys[idx].setValue(value);\n m += value.byteLength;\n }\n }\n\n if (dpRanges.length > 0) {\n const res = await this.dataFileResolver(dpRanges);\n res.forEach((res, index) => {\n const dpIndex = dpIndexes[index];\n const { data } = res;\n\n const parsedData = this.parseValue(data);\n this.keys[dpIndex].setValue(parsedData);\n });\n }\n\n for (let idx = 0; idx <= this.leafPointers.length - 1; idx++) {\n dataView = new DataView(buffer, m);\n this.leafPointers[idx].offset = dataView.getBigUint64(0, true);\n this.leafPointers[idx].length = dataView.getUint32(8, true);\n\n m += 12;\n }\n\n for (let idx = 0; idx <= this.internalPointers.length - 1; idx++) {\n dataView = new DataView(buffer, m);\n this.internalPointers[idx] = dataView.getBigUint64(0, true);\n\n m += 8;\n }\n }\n\n parseValue(incomingData: ArrayBuffer): ArrayBuffer {\n const stringData = new TextDecoder().decode(incomingData);\n\n switch (this.fileFormat) {\n case FileFormat.JSONL:\n const jValue = JSON.parse(stringData);\n\n switch (this.pageFieldType) {\n case FieldType.Null:\n if (jValue !== null) {\n throw new Error(`unrecognized value for null type: ${jValue}`);\n }\n return new ArrayBuffer(0);\n\n case FieldType.Boolean:\n return new Uint8Array([jValue ? 1 : 0]).buffer;\n\n case FieldType.Float64:\n case FieldType.Int64:\n case FieldType.Uint64:\n const floatBuf = new ArrayBuffer(8);\n let floatBufView = new DataView(floatBuf);\n floatBufView.setFloat64(0, jValue);\n\n return floatBuf;\n\n case FieldType.String:\n const e = new TextEncoder().encode(jValue);\n return e.buffer;\n\n default:\n throw new Error(\n `Unexpected Field Type. Got: ${this.pageFieldType}`,\n );\n }\n\n case FileFormat.CSV:\n return incomingData;\n }\n }\n\n static async fromMemoryPointer(\n mp: MemoryPointer,\n resolver: RangeResolver,\n dataFilePointer: RangeResolver,\n fileFormat: FileFormat,\n pageFieldType: FieldType,\n ): Promise<{ node: BPTreeNode; bytesRead: number }> {\n const res = await resolver([\n {\n start: Number(mp.offset),\n end: Number(mp.offset) + 4096 - 1,\n },\n ]);\n const { data: bufferData } = res[0];\n const node = new BPTreeNode(\n [],\n [],\n [],\n dataFilePointer,\n fileFormat,\n pageFieldType,\n );\n\n await node.unmarshalBinary(bufferData);\n\n return { node, bytesRead: pageSizeBytes };\n }\n}\n", "import { BPTree, ReferencedValue } from \"./bptree\";\nimport { BPTreeNode, MemoryPointer } from \"./node\";\n\nexport type TraversalRecord = {\n node: BPTreeNode;\n index: number;\n pointer: MemoryPointer;\n};\n\nexport class TraversalIterator {\n private tree: BPTree;\n private key: ReferencedValue;\n private records: TraversalRecord[];\n\n constructor(tree: BPTree, key: ReferencedValue) {\n this.tree = tree;\n this.key = key;\n this.records = []; // note this works iff all records are non-empty\n }\n\n async init(): Promise {\n const rootResponse = await this.tree.root();\n\n if (rootResponse.rootNode === null) {\n return false;\n }\n\n const root = rootResponse.rootNode;\n const offset = rootResponse.pointer;\n const path = await this.tree.traverse(this.key, root, offset);\n this.records = path;\n return true;\n }\n\n getKey(): ReferencedValue {\n return this.records[0].node.keys[this.records[0].index];\n }\n\n getPointer(): MemoryPointer {\n return this.records[0].node.pointer(this.records[0].index);\n }\n\n async increment(i: number, delta: number): Promise {\n if (i === this.records.length) {\n return false;\n }\n\n this.records[i].index += delta;\n const rolloverLeft = this.records[i].index < 0;\n const rolloverRight =\n this.records[i].index >= this.records[i].node.numPointers();\n\n if (rolloverLeft || rolloverRight) {\n if (!this.increment(i + 1, delta)) {\n return false;\n }\n\n if (!this.records[i + 1]) {\n return false;\n }\n const node = await this.tree.readNode(\n this.records[i + 1].node.pointer(this.records[i + 1].index),\n );\n\n // propagate the rollover\n this.records[i].node = node;\n\n if (rolloverLeft) {\n this.records[i].index = this.records[i].node.numPointers() - 1;\n } else {\n this.records[i].index = 0;\n }\n }\n\n return true;\n }\n\n async next(): Promise {\n if (this.records.length === 0) {\n return await this.init();\n }\n\n return this.increment(0, 1);\n }\n\n async prev(): Promise {\n if (this.records.length === 0) {\n const res = await this.init();\n if (!res) {\n return false;\n }\n }\n\n return this.increment(0, -1);\n }\n}\n", "import { BPTreeNode, MemoryPointer } from \"./node\";\nimport { RangeResolver } from \"../resolver\";\nimport { TraversalIterator, TraversalRecord } from \"./traversal\";\nimport { FileFormat } from \"../index-file/meta\";\nimport { FieldType } from \"../db/database\";\n\nexport interface MetaPage {\n root(): Promise;\n}\n\ntype RootResponse = {\n rootNode: BPTreeNode | null;\n pointer: MemoryPointer;\n};\n\nexport class BPTree {\n private readonly tree: RangeResolver;\n private meta: MetaPage;\n private readonly dataFileResolver: RangeResolver;\n private fileFormat: FileFormat;\n private pageFieldType: FieldType;\n\n constructor(\n tree: RangeResolver,\n meta: MetaPage,\n dataFileResolver: RangeResolver,\n fileFormat: FileFormat,\n pageFieldType: FieldType,\n ) {\n this.tree = tree;\n this.meta = meta;\n this.dataFileResolver = dataFileResolver;\n this.fileFormat = fileFormat;\n this.pageFieldType = pageFieldType;\n }\n\n async root(): Promise {\n const mp = await this.meta.root();\n\n if (!mp || mp.length === 0) {\n return {\n rootNode: null,\n pointer: mp,\n };\n }\n\n const root = await this.readNode(mp);\n if (!root) {\n return {\n rootNode: null,\n pointer: mp,\n };\n }\n\n return {\n rootNode: root,\n pointer: mp,\n };\n }\n\n async readNode(ptr: MemoryPointer): Promise {\n try {\n const { node, bytesRead } = await BPTreeNode.fromMemoryPointer(\n ptr,\n this.tree,\n this.dataFileResolver,\n this.fileFormat,\n this.pageFieldType,\n );\n\n if (!bytesRead) {\n throw new Error(\"bytes read do not line up\");\n }\n\n return node;\n } catch (error) {\n throw new Error(`${error}`);\n }\n }\n\n public iter(key: ReferencedValue): TraversalIterator {\n return new TraversalIterator(this, key);\n }\n\n async first(): Promise {\n let { rootNode } = await this.root();\n if (!rootNode) {\n throw new Error(\"unable to get root node\");\n }\n\n let currNode = await this.readNode(rootNode.pointer(0));\n\n while (!currNode.leaf()) {\n const childPointer = currNode.pointer(0);\n currNode = await this.readNode(childPointer);\n }\n\n return currNode.keys[0];\n }\n\n async last(): Promise {\n let { rootNode } = await this.root();\n if (!rootNode) {\n throw new Error(\"unable to get root node\");\n }\n\n let currNode = await this.readNode(\n rootNode.pointer(rootNode.numPointers() - 1),\n );\n\n while (!currNode.leaf()) {\n const childPointer = currNode.pointer(currNode.numPointers() - 1);\n currNode = await this.readNode(childPointer);\n }\n\n return currNode.keys[currNode.keys.length - 1];\n }\n\n async traverse(\n key: ReferencedValue,\n node: BPTreeNode,\n pointer: MemoryPointer,\n ): Promise {\n let [index, found] = binarySearchReferencedValues(node.keys, key);\n if (node.leaf()) {\n return [{ node, index, pointer }];\n }\n\n if (found) {\n index += 1;\n }\n\n const childPointer = node.pointer(index);\n const child = await this.readNode(childPointer);\n const path = await this.traverse(key, child, childPointer);\n\n return [...path, { node, index, pointer }];\n }\n\n public async find(\n key: ReferencedValue,\n ): Promise<[ReferencedValue, MemoryPointer]> {\n const p = this.iter(key);\n\n if (!(await p.next())) {\n return [\n new ReferencedValue(\n { offset: 0n, length: 0 },\n new Uint8Array(0).buffer,\n ),\n { offset: 0n, length: 0 },\n ];\n }\n\n return [p.getKey(), p.getPointer()];\n }\n}\n\nexport class ReferencedValue {\n public dataPointer: MemoryPointer;\n public value: ArrayBuffer;\n\n constructor(dataPointer: MemoryPointer, value: ArrayBuffer) {\n this.dataPointer = dataPointer;\n this.value = value;\n }\n\n setDataPointer(mp: MemoryPointer) {\n this.dataPointer = mp;\n }\n\n setValue(value: ArrayBuffer) {\n this.value = value;\n }\n\n static compareBytes(aBuffer: ArrayBuffer, bBuffer: ArrayBuffer): number {\n const a = new Uint8Array(aBuffer);\n const b = new Uint8Array(bBuffer);\n\n const len = Math.min(a.length, b.length);\n for (let idx = 0; idx < len; idx++) {\n if (a[idx] !== b[idx]) {\n return a[idx] < b[idx] ? -1 : 1;\n }\n }\n\n if (a.length < b.length) {\n return -1;\n }\n if (a.length > b.length) {\n return 1;\n }\n return 0;\n }\n}\n\nfunction compareReferencedValues(\n a: ReferencedValue,\n b: ReferencedValue,\n): number {\n const valueComparison = ReferencedValue.compareBytes(a.value, b.value);\n if (valueComparison !== 0) {\n return valueComparison;\n }\n\n if (a.dataPointer.offset > b.dataPointer.offset) {\n return 1;\n } else if (a.dataPointer.offset < b.dataPointer.offset) {\n return -1;\n }\n\n if (a.dataPointer.length > b.dataPointer.length) {\n return 1;\n } else if (a.dataPointer.length < b.dataPointer.length) {\n return -1;\n }\n\n return 0;\n}\n\nexport function binarySearchReferencedValues(\n values: ReferencedValue[],\n target: ReferencedValue,\n): [number, boolean] {\n const n = values.length;\n\n let i = 0;\n let j = n;\n\n while (i < j) {\n const h = Math.floor((i + j) / 2);\n\n if (compareReferencedValues(values[h], target) < 0) {\n i = h + 1;\n } else {\n j = h;\n }\n }\n\n return [i, i < n && compareReferencedValues(values[i], target) === 0];\n}\n", "import { RangeResolver } from \"../resolver\";\nimport { MemoryPointer } from \"./node\";\n\nexport const N = 16;\nexport const PAGE_SIZE_BYTES = 4096;\nexport const maxUint64 = 2n ** 64n - 1n;\n\nexport class LinkedMetaPage {\n private resolver: RangeResolver;\n private offset: bigint;\n private metaPageData?: ArrayBuffer;\n private metaPageDataPromise?: Promise<\n { data: ArrayBuffer; totalLength: number }[]\n >;\n\n constructor(resolver: RangeResolver, offset: bigint, data?: ArrayBuffer) {\n this.resolver = resolver;\n this.offset = offset;\n this.metaPageData = data;\n }\n\n async root(): Promise {\n const pageData = await this.getMetaPage();\n\n // we seek by 12 bytes since offset is 8 bytes, length is 4 bytes\n const data = pageData.slice(0, 12);\n const view = new DataView(data);\n\n const pointerOffset = view.getBigUint64(0, true);\n const lengthOffset = view.getUint32(8, true);\n\n return {\n offset: pointerOffset,\n length: lengthOffset,\n };\n }\n\n async metadata(): Promise {\n const pageData = await this.getMetaPage();\n\n const lengthView = new DataView(pageData, 8 * N + 16);\n\n // read the first four because that represents length\n const metadataLength = lengthView.getUint32(0, true);\n const start = 8 * N + 20;\n\n return pageData.slice(start, start + metadataLength);\n }\n\n public setMetaPage(pageData: ArrayBuffer) {\n this.metaPageData = pageData;\n }\n\n private async getMetaPage(): Promise {\n if (this.metaPageData) {\n return this.metaPageData;\n }\n\n if (!this.metaPageDataPromise) {\n this.metaPageDataPromise = this.resolver([\n {\n start: Number(this.offset),\n end: Number(this.offset) + PAGE_SIZE_BYTES - 1,\n },\n ]);\n }\n\n const res = await this.metaPageDataPromise;\n const { data } = res[0];\n\n return data;\n }\n\n async nextNOffsets(): Promise {\n const pageData = await this.getMetaPage();\n const view = new DataView(pageData, 12);\n let offsets: bigint[] = [];\n\n for (let idx = 0; idx <= N - 1; idx++) {\n const nextOffset = view.getBigUint64(idx * 8, true);\n\n if (nextOffset === maxUint64) {\n return offsets;\n }\n offsets.push(nextOffset);\n }\n\n return offsets;\n }\n\n getOffset(): bigint {\n return this.offset;\n }\n}\n\nexport function ReadMultiBPTree(\n resolver: RangeResolver,\n idx: number,\n): LinkedMetaPage {\n let offset = idx < 0 ? BigInt(0) : BigInt(idx + 1) * BigInt(PAGE_SIZE_BYTES);\n return new LinkedMetaPage(resolver, offset);\n}\n", "import { Database, OrderBy, Query, Schema, WhereNode } from \"./database\";\n\n/**\n * A class for building and executing database queries in a flexible API style.\n * Allows chaining methods for 'where', 'orderBy', 'select', and 'limit' clauses.\n */\nexport class QueryBuilder {\n private queryObject: Query = {\n where: [],\n orderBy: undefined,\n select: undefined,\n limit: undefined,\n };\n\n /**\n * Initializes a new instance of the QueryBuilder class.\n * @param {Database} database - An Appendable database instance to execute queries against.\n */\n constructor(private database: Database) {}\n\n /**\n * Retrieves an immutable copy of the current query.\n *\n * @returns {Query} The Query instance.\n */\n toQuery(): Query {\n return {\n where: this.queryObject.where ? [...this.queryObject.where] : [],\n orderBy: this.queryObject.orderBy\n ? [...this.queryObject.orderBy]\n : undefined,\n select: this.queryObject.select\n ? [...this.queryObject.select]\n : undefined,\n limit: this.queryObject.limit,\n };\n }\n\n /**\n * Executes the constructed query\n */\n get() {\n return this.database.query(this.queryObject);\n }\n\n /**\n * Adds a 'where' clause to the query.\n *\n * @param {keyof T} key - The index header's field name to apply the 'where' condition.\n * @param {WhereNode[\"operation\"]} operation - The comparison relation (e.g., >=, <=, ==, >=, >).\n * @param {T[keyof T]} value - The value to compare against.\n * @returns {QueryBuilder} The QueryBuilder instance.\n */\n where(\n key: keyof T,\n operation: WhereNode[\"operation\"],\n value: T[keyof T],\n ): QueryBuilder {\n const newQuery = new QueryBuilder(this.database);\n newQuery.queryObject = {\n ...this.queryObject,\n where: [...(this.queryObject.where || []), { key, operation, value }],\n };\n return newQuery;\n }\n /**\n * Adds an 'orderBy' clause to the query.\n *\n * @param {keyof T} key - The index header's field name to order by.\n * @param {OrderBy[\"direction\"]} direction - The sorting direction (e.g., ASC, DESC).\n * @returns {QueryBuilder} The QueryBuilder instance.\n */\n orderBy(key: keyof T, direction: OrderBy[\"direction\"]): QueryBuilder {\n const newQuery = new QueryBuilder(this.database);\n newQuery.queryObject = {\n ...this.queryObject,\n orderBy: [...(this.queryObject.orderBy || []), { key, direction }],\n };\n return newQuery;\n }\n\n /**\n * Specifies the fields to be selected in the query.\n *\n * @param {(keyof T)[]} keys - A list of index header field names.\n * @returns {QueryBuilder} The QueryBuilder instance.\n */\n select(keys: (keyof T)[]): QueryBuilder {\n const newQuery = new QueryBuilder(this.database);\n newQuery.queryObject = {\n ...this.queryObject,\n select: keys,\n };\n return newQuery;\n }\n\n /**\n * Limits the number of records returned by the query.\n *\n * @param {number} limit - The maximum number of records to return.\n * @returns {QueryBuilder} The QueryBuilder instance.\n */\n limit(limit: number): QueryBuilder {\n const newQuery = new QueryBuilder(this.database);\n newQuery.queryObject = {\n ...this.queryObject,\n limit: limit,\n };\n return newQuery;\n }\n}\n", "import { FieldType, OrderBy, Schema } from \"./database\";\n\ntype QueryWhere = {\n valueBuf: ArrayBuffer;\n fieldType: FieldType;\n};\n\nexport function processWhere(value: T[keyof T]): QueryWhere | null {\n let valueBuf: ArrayBuffer;\n\n if (value === null) {\n return {\n fieldType: FieldType.Null,\n valueBuf: new ArrayBuffer(0),\n };\n } else {\n switch (typeof value) {\n case \"bigint\":\n case \"number\":\n valueBuf = new ArrayBuffer(8);\n new DataView(valueBuf).setFloat64(0, Number(value));\n return {\n fieldType: FieldType.Float64,\n valueBuf,\n };\n case \"boolean\":\n return {\n fieldType: FieldType.Boolean,\n valueBuf: new Uint8Array([value ? 1 : 0]).buffer,\n };\n\n case \"string\":\n return {\n fieldType: FieldType.String,\n valueBuf: new TextEncoder().encode(value as string).buffer,\n };\n }\n }\n\n return null;\n}\n\nexport function handleSelect(data: string, select?: (keyof T)[]) {\n let jData = JSON.parse(data);\n if (select && select.length > 0) {\n return select.reduce(\n (acc, field) => {\n if (field in jData) {\n acc[field] = jData[field];\n }\n return acc;\n },\n {} as Pick,\n );\n }\n\n return jData;\n}\n", "import { IndexHeader, IndexMeta } from \"../index-file/meta\";\nimport {\n FieldType,\n OrderBy,\n Query,\n Schema,\n SelectField,\n WhereNode,\n} from \"./database\";\n\n/**\n * containsType checks if the given compositeType includes the specified singleType.\n * It uses a bitwise AND operation to determine if the singleType's bit is set in the compositeType.\n *\n * @param {bigint} compositeType - A bigint representing a composite of multiple types.\n * @param {FieldType} singleType - The specific type to check for within the compositeType.\n * @returns {boolean} - Returns true if singleType is included in compositeType, false otherwise.\n */\nfunction checkType(headerType: number[], queryType: FieldType): boolean {\n return headerType.includes(queryType);\n}\n\n/**\n * validateWhere validates the 'where' clause of the query.\n *\n * @param {WhereNode[] | undefined} where - The 'where' clause to validate.\n * @param {IndexMeta[]} headers - List of headers to check field existence and type compatibility.\n * @throws {Error} - Throws an error if the 'where' clause is missing, invalid, or refers to non-existent fields.\n */\nfunction validateWhere(\n where: WhereNode[] | undefined,\n headers: IndexHeader[],\n): void {\n if (!where || !Array.isArray(where) || where.length === 0) {\n throw new Error(\"Missing 'where' clause.\");\n }\n\n for (const whereNode of where) {\n if (![\"<\", \"<=\", \"==\", \">=\", \">\"].includes(whereNode.operation)) {\n throw new Error(\"Invalid operation in 'where' clause.\");\n }\n\n if (typeof whereNode.key !== \"string\") {\n throw new Error(\"'key' in 'where' clause must be a string.\");\n }\n\n const header = headers.find((h) => h.fieldName === whereNode.key);\n\n if (!header) {\n throw new Error(\n `key: ${whereNode.key} in 'where' clause does not exist in dataset.`,\n );\n }\n\n if (typeof whereNode.value === \"undefined\") {\n throw new Error(\"'value' in 'where' clause is missing.\");\n }\n\n const headerType = header.fieldTypes;\n\n if (whereNode.value === null) {\n if (!checkType(headerType, FieldType.Null)) {\n throw new Error(\n `null type not included in ${whereNode.key}'s header types.`,\n );\n }\n } else {\n switch (typeof whereNode.value) {\n case \"bigint\":\n case \"number\":\n if (\n !checkType(headerType, FieldType.Float64) &&\n !checkType(headerType, FieldType.Uint64) &&\n !checkType(headerType, FieldType.Int64)\n ) {\n throw new Error(\n `number type not included in ${whereNode.key}'s header types.`,\n );\n }\n break;\n\n case \"string\":\n if (!checkType(headerType, FieldType.String)) {\n throw new Error(\n `string type not included in ${whereNode.key}'s header types`,\n );\n }\n break;\n\n case \"boolean\":\n if (!checkType(headerType, FieldType.Boolean)) {\n throw new Error(\n `boolean type not included in ${whereNode.key}'s header types`,\n );\n }\n break;\n\n default:\n throw new Error(\n `unrecognized type: ${typeof whereNode.value} not included in ${whereNode.key}'s header types`,\n );\n }\n }\n }\n}\n\n/**\n * validateOrderBy validates the 'orderBy' clause of the query.\n * Currently supports strictly one 'orderBy' condition that must match the 'where' clause key.\n *\n * @param {OrderBy[] | undefined} orderBy - The 'orderBy' clause to validate.\n * @param {string} whereKey - The key used in the 'where' clause for compatibility.\n * @throws {Error} Throws an error if the 'orderBy' clause is invalid or doesn't match the 'where' clause key.\n */\nfunction validateOrderBy(\n orderBy: OrderBy[] | undefined,\n whereKey: string,\n): void {\n if (orderBy) {\n if (!Array.isArray(orderBy) || orderBy.length === 0) {\n throw new Error(\"Invalid 'orderBy' clause.\");\n }\n\n // Note: currently we only support one orderBy and it must be the where clause. When we add composite indexes and complex querying, refactor.\n const orderByObj = orderBy[0];\n\n if (![\"ASC\", \"DESC\"].includes(orderByObj.direction)) {\n throw new Error(\"Invalid direction in `orderBy`.\");\n }\n\n if (orderByObj.key !== whereKey) {\n throw new Error(\"'key' in `orderBy` must match `key` in `where` clause\");\n }\n }\n}\n\n/**\n * validateSelect validates the 'select' fields of a query.\n *\n * @param {SelectField[] | undefined} select - The 'select' clause to validate.\n * @param {IndexMeta[]} headers - List of headers to check for field existence.\n * @throws {Error} Throws an error if any field in the 'select' clause doesn't exist in headers.\n */\nfunction validateSelect(\n select: SelectField[] | undefined,\n headers: IndexHeader[],\n): void {\n if (select) {\n if (!Array.isArray(select)) {\n throw new Error(`select is not an array: ${select}`);\n }\n\n if (select.length <= 0) {\n throw new Error(`select clause is empty: ${select}`);\n }\n\n let hset = new Set();\n headers.map((h) => hset.add(h.fieldName));\n\n select.map((s) => {\n if (!hset.has(s)) {\n throw new Error(\n `${s as string} is not included in the field name headers`,\n );\n }\n });\n }\n}\n\n/**\n * validateQuery checks the structure and syntax of the query against the provided headers.\n * It ensures that the fields specified in the query are valid and exist in the headers.\n * If any part of the query is invalid (e.g., a field doesn't exist), it throws an error.\n *\n * @param {Query} query - The query object to validate.\n * @param {IndexMeta[]} headers - The headers against which to validate the query fields.\n * @throws {Error} Throws an error if query is invalid.\n */\nexport function validateQuery(\n query: Query,\n headers: IndexHeader[],\n): void {\n // validate the query\n validateWhere(query.where, headers);\n validateOrderBy(query.orderBy, query.where![0].key as string);\n validateSelect(query.select, headers);\n}\n", "import { BPTree, ReferencedValue } from \"../btree/bptree\";\nimport { maxUint64 } from \"../btree/multi\";\nimport { DataFile } from \"../data-file\";\nimport { VersionedIndexFile } from \"../index-file/index-file\";\nimport { IndexHeader, readIndexMeta } from \"../index-file/meta\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { handleSelect, processWhere } from \"./query-logic\";\nimport { validateQuery } from \"./query-validation\";\n\nexport type Schema = {\n [key: string]: {};\n};\n\nexport type WhereNode = {\n operation: \"<\" | \"<=\" | \"==\" | \">=\" | \">\";\n key: keyof T;\n value: T[K];\n};\n\nexport type OrderBy = {\n key: keyof T;\n direction: \"ASC\" | \"DESC\";\n};\n\nexport type SelectField = keyof T;\n\nexport type Query = {\n where?: WhereNode[];\n orderBy?: OrderBy[];\n select?: SelectField[];\n limit?: number;\n};\n\nexport enum FieldType {\n String = 0,\n Int64 = 1,\n Uint64 = 2,\n Float64 = 3,\n Object = 4,\n Array = 5,\n Boolean = 6,\n Null = 7,\n}\n\nexport function fieldTypeToString(f: FieldType): string {\n let str;\n switch (f) {\n case FieldType.String:\n str = \"String\";\n break;\n\n case FieldType.Int64:\n str = \"Int64\";\n break;\n\n case FieldType.Uint64:\n str = \"Uint64\";\n break;\n\n case FieldType.Float64:\n str = \"Float64\";\n break;\n\n case FieldType.Object:\n str = \"Object\";\n break;\n\n case FieldType.Array:\n str = \"Array\";\n break;\n\n case FieldType.Boolean:\n str = \"Boolean\";\n break;\n case FieldType.Null:\n str = \"Null\";\n break;\n }\n return str;\n}\n\nexport class Database {\n private indexHeadersPromise?: Promise;\n\n private constructor(\n private dataFile: DataFile,\n private indexFile: VersionedIndexFile,\n ) {}\n\n static forDataFileAndIndexFile(\n dataFile: DataFile,\n indexFile: VersionedIndexFile,\n ) {\n return new Database(dataFile, indexFile);\n }\n\n async fields() {\n if (!this.indexHeadersPromise) {\n this.indexHeadersPromise = this.indexFile.indexHeaders();\n }\n\n return this.indexHeadersPromise;\n }\n\n async *query(query: Query) {\n if (new Set((query.where ?? []).map((where) => where.key)).size > 1) {\n throw new Error(\"composite indexes not supported... yet\");\n }\n\n const { format } = await this.indexFile.metadata();\n const dfResolver = this.dataFile.getResolver();\n if (!dfResolver) {\n throw new Error(\"data file is undefined\");\n }\n\n const headers = await this.fields();\n\n validateQuery(query, headers);\n\n for (const { key, value, operation } of query.where ?? []) {\n const header = headers.find((header) => header.fieldName === key);\n if (!header) {\n throw new Error(\"field not found\");\n }\n\n const res = processWhere(value);\n if (res === null) {\n throw new Error(`unable to process key with a type ${typeof value}`);\n }\n const { fieldType, valueBuf } = res;\n\n const mps = await this.indexFile.seek(key as string, fieldType);\n const mp = mps[0];\n const { fieldType: mpFieldType } = await readIndexMeta(\n await mp.metadata(),\n );\n\n let ord: \"ASC\" | \"DESC\" = \"ASC\";\n if (query.orderBy && query.orderBy[0]) {\n ord = query.orderBy[0].direction;\n }\n\n const bptree = new BPTree(\n this.indexFile.getResolver(),\n mp,\n dfResolver,\n format,\n mpFieldType,\n );\n\n if (operation === \">\") {\n if (ord === \"ASC\") {\n const valueRef = new ReferencedValue(\n { offset: 0n, length: 0 },\n valueBuf,\n );\n const iter = bptree.iter(valueRef);\n\n while (await iter.next()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) < 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n } else {\n const lastKey = await bptree.last();\n const iter = bptree.iter(lastKey);\n\n while (await iter.prev()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) < 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n yield handleSelect(data, query.select);\n }\n }\n }\n } else if (operation === \">=\") {\n if (ord === \"ASC\") {\n const valueRef = new ReferencedValue(\n { offset: 0n, length: 0 },\n valueBuf,\n );\n const iter = bptree.iter(valueRef);\n\n while (await iter.next()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) <= 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n } else {\n const lastKey = await bptree.last();\n const iter = bptree.iter(lastKey);\n\n while (await iter.prev()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) <= 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n }\n } else if (operation === \"==\") {\n const valueRef = new ReferencedValue(\n { offset: 0n, length: 0 },\n valueBuf,\n );\n const iter = bptree.iter(valueRef);\n\n while (await iter.next()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) === 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n } else if (operation === \"<=\") {\n if (ord === \"DESC\") {\n const valueRef = new ReferencedValue(\n { offset: maxUint64, length: 0 },\n valueBuf,\n );\n const iter = bptree.iter(valueRef);\n while (await iter.prev()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) >= 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n } else {\n const firstKey = await bptree.first();\n const iter = bptree.iter(firstKey);\n\n while (await iter.next()) {\n const currentKey = iter.getKey();\n\n if (ReferencedValue.compareBytes(valueBuf, currentKey.value) >= 0) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n }\n } else if (operation === \"<\") {\n if (ord === \"DESC\") {\n const valueRef = new ReferencedValue(\n { offset: maxUint64, length: 0 },\n valueBuf,\n );\n const iter = bptree.iter(valueRef);\n while (await iter.prev()) {\n const currentKey = iter.getKey();\n\n if (\n ReferencedValue.compareBytes(valueBuf, currentKey.value) === 1\n ) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n } else {\n const firstKey = await bptree.first();\n const iter = bptree.iter(firstKey);\n\n while (await iter.next()) {\n const currentKey = iter.getKey();\n\n if (\n ReferencedValue.compareBytes(valueBuf, currentKey.value) === 1\n ) {\n const mp = iter.getPointer();\n\n const data = await this.dataFile.get(\n Number(mp.offset),\n Number(mp.offset) + mp.length - 1,\n );\n\n yield handleSelect(data, query.select);\n }\n }\n }\n }\n }\n }\n\n where(\n key: keyof T,\n operation: WhereNode[\"operation\"],\n value: T[keyof T],\n ): QueryBuilder {\n return new QueryBuilder(this).where(key, operation, value);\n }\n}\n", "import {\n LinkedMetaPage,\n PAGE_SIZE_BYTES,\n ReadMultiBPTree,\n} from \"../btree/multi\";\nimport { RangeResolver } from \"../resolver\";\nimport {\n FileFormat,\n IndexHeader,\n IndexMeta,\n collectIndexMetas,\n readIndexMeta,\n} from \"./meta\";\nimport { FieldType } from \"../db/database\";\nimport { requestRanges } from \"../range-request\";\nimport { Config } from \"..\";\n\nexport class IndexFile {\n static async forUrl(url: string, config: Config) {\n return await IndexFile.forResolver(\n async (ranges) => await requestRanges(url, ranges, config),\n );\n }\n\n static async forResolver(\n resolver: RangeResolver,\n ): Promise> {\n return new IndexFileV1(resolver);\n }\n}\n\nexport type FileMeta = {\n version: number;\n format: number;\n readOffset: bigint;\n};\n\nexport interface VersionedIndexFile {\n getResolver(): RangeResolver;\n\n tree(): Promise;\n\n metadata(): Promise;\n\n indexHeaders(): Promise;\n\n seek(header: string, fieldType: FieldType): Promise;\n\n fetchMetaPages(): Promise;\n}\n\nexport class IndexFileV1 implements VersionedIndexFile {\n private _tree?: LinkedMetaPage;\n\n private linkedMetaPages: LinkedMetaPage[] = [];\n\n constructor(private resolver: RangeResolver) {}\n\n getResolver(): RangeResolver {\n return this.resolver;\n }\n\n async tree(): Promise {\n if (this._tree) {\n return this._tree;\n }\n\n const tree = ReadMultiBPTree(this.resolver, 0);\n\n this._tree = tree;\n return tree;\n }\n\n async metadata(): Promise {\n const tree = await this.tree();\n\n const buffer = await tree.metadata();\n\n // unmarshall binary for FileMeta\n if (buffer.byteLength < 10) {\n throw new Error(\n `incorrect byte length! Want: 10, got ${buffer.byteLength}`,\n );\n }\n\n const dataView = new DataView(buffer);\n const version = dataView.getUint8(0);\n const formatByte = dataView.getUint8(1);\n\n if (Object.values(FileFormat).indexOf(formatByte) === -1) {\n throw new Error(`unexpected file format. Got: ${formatByte}`);\n }\n\n const readOffset = dataView.getBigUint64(2, true);\n\n return {\n version: version,\n format: formatByte,\n readOffset: readOffset,\n };\n }\n\n async seek(header: string, fieldType: FieldType): Promise {\n if (this.linkedMetaPages.length === 0) {\n await this.fetchMetaPages();\n }\n\n let headerMps = [];\n\n for (let idx = 0; idx <= this.linkedMetaPages.length - 1; idx++) {\n const mp = this.linkedMetaPages[idx];\n const indexMeta = await readIndexMeta(await mp.metadata());\n if (indexMeta.fieldName === header) {\n if (fieldType === FieldType.Float64) {\n // if key is a number or bigint, we cast it as a float64 type\n if (\n indexMeta.fieldType === FieldType.Float64 ||\n indexMeta.fieldType === FieldType.Int64 ||\n indexMeta.fieldType === FieldType.Uint64\n ) {\n headerMps.push(mp);\n }\n } else {\n if (indexMeta.fieldType === fieldType) {\n headerMps.push(mp);\n }\n }\n }\n }\n\n return headerMps;\n }\n\n async fetchMetaPages(): Promise {\n let currMp = await this.tree();\n let offsets = await currMp.nextNOffsets();\n\n while (offsets.length > 0) {\n let ranges = offsets.map((o) => ({\n start: Number(o),\n end: Number(o) + PAGE_SIZE_BYTES - 1,\n }));\n\n let res = await this.resolver(ranges);\n let idx = 0;\n for (const { data } of res) {\n this.linkedMetaPages.push(\n new LinkedMetaPage(this.resolver, offsets[idx], data),\n );\n idx++;\n }\n\n currMp = this.linkedMetaPages[this.linkedMetaPages.length - 1];\n offsets = await currMp.nextNOffsets();\n }\n }\n\n async indexHeaders(): Promise {\n if (this.linkedMetaPages.length === 0) {\n await this.fetchMetaPages();\n }\n\n let indexMetas: IndexMeta[] = [];\n for (const mp of this.linkedMetaPages) {\n const im = await readIndexMeta(await mp.metadata());\n indexMetas.push(im);\n }\n\n return collectIndexMetas(indexMetas);\n }\n}\n", "import { DataFile } from \"./data-file\";\nimport { Database, FieldType, fieldTypeToString } from \"./db/database\";\nimport { IndexFile } from \"./index-file/index-file\";\nimport { RangeResolver } from \"./resolver\";\n\nexport type Config = {\n useMultipartByteRanges?: boolean;\n};\n\nexport async function init(\n dataUrl: string | RangeResolver,\n indexUrl: string | RangeResolver,\n config?: Config,\n) {\n if (!config) {\n config = { useMultipartByteRanges: true };\n }\n\n return Database.forDataFileAndIndexFile(\n typeof dataUrl === \"string\"\n ? DataFile.forUrl(dataUrl, config)\n : DataFile.forResolver(dataUrl),\n typeof indexUrl === \"string\"\n ? await IndexFile.forUrl(indexUrl, config)\n : await IndexFile.forResolver(indexUrl),\n );\n}\n\ninterface GlobalMap {\n Appendable: {\n init: Function;\n FieldType: typeof FieldType;\n fieldTypeToString: Function;\n };\n}\n\ndeclare global {\n var Appendable: GlobalMap[\"Appendable\"];\n}\n\nglobalThis.Appendable = {\n init,\n FieldType,\n fieldTypeToString,\n};\n"], - "mappings": "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", - "names": ["getReader", "stream", "residual", "readDone", "reader", "buf", "n", "result", "parseContentRangeHeader", "header", "tokens", "range", "total", "start", "end", "parseMultipartBody", "contentType", "boundaryToken", "s", "boundary", "headers", "ptr", "length", "extend", "done", "value", "i", "c", "lastByte", "byte", "decoded", "key", "unit", "contentLength", "data", "LengthIntegrityError", "resolveIndividualPromises", "url", "ranges", "individualRangePromises", "start", "end", "expectedLength", "rangeHeader", "res", "totalLength", "LengthIntegrityError", "requestRanges", "config", "useMultipartByteRanges", "rangesHeader", "response", "contentType", "chunks", "chunk", "parseMultipartBody", "data", "headers", "totalLengthStr", "abuf", "requestedRange", "DataFile", "_DataFile", "resolver", "url", "config", "ranges", "requestRanges", "instance", "start", "end", "res", "FileFormat", "readIndexMeta", "buffer", "dataView", "fieldType", "nameLength", "fieldNameBuffer", "collectIndexMetas", "indexMetas", "headersMap", "meta", "updatedTypes", "indexHeaders", "fieldTypes", "fieldName", "pageSizeBytes", "BPTreeNode", "_BPTreeNode", "keys", "leafPointers", "internalPointers", "dataFileResolver", "fileFormat", "pageFieldType", "i", "size", "idx", "k", "buffer", "dataView", "ReferencedValue", "dpRanges", "dpIndexes", "m", "dpOffset", "dpLength", "l", "dp", "value", "res", "index", "dpIndex", "data", "parsedData", "incomingData", "stringData", "jValue", "floatBuf", "mp", "resolver", "dataFilePointer", "bufferData", "node", "TraversalIterator", "tree", "key", "rootResponse", "root", "offset", "path", "i", "delta", "rolloverLeft", "rolloverRight", "node", "BPTree", "tree", "meta", "dataFileResolver", "fileFormat", "pageFieldType", "mp", "root", "ptr", "node", "bytesRead", "BPTreeNode", "error", "key", "TraversalIterator", "rootNode", "currNode", "childPointer", "pointer", "index", "found", "binarySearchReferencedValues", "child", "p", "ReferencedValue", "dataPointer", "value", "aBuffer", "bBuffer", "a", "b", "len", "idx", "compareReferencedValues", "valueComparison", "values", "target", "n", "i", "j", "h", "N", "PAGE_SIZE_BYTES", "maxUint64", "LinkedMetaPage", "resolver", "offset", "data", "view", "pointerOffset", "lengthOffset", "pageData", "metadataLength", "start", "res", "offsets", "idx", "nextOffset", "ReadMultiBPTree", "QueryBuilder", "_QueryBuilder", "database", "key", "operation", "value", "newQuery", "direction", "keys", "limit", "processWhere", "value", "valueBuf", "handleSelect", "data", "select", "jData", "acc", "field", "checkType", "headerType", "queryType", "validateWhere", "where", "headers", "whereNode", "header", "h", "validateOrderBy", "orderBy", "whereKey", "orderByObj", "validateSelect", "select", "hset", "s", "validateQuery", "query", "FieldType", "fieldTypeToString", "f", "str", "Database", "_Database", "dataFile", "indexFile", "query", "where", "format", "dfResolver", "headers", "validateQuery", "key", "value", "operation", "header", "res", "processWhere", "fieldType", "valueBuf", "mp", "mpFieldType", "readIndexMeta", "ord", "bptree", "BPTree", "valueRef", "ReferencedValue", "iter", "currentKey", "data", "handleSelect", "lastKey", "maxUint64", "firstKey", "QueryBuilder", "IndexFile", "_IndexFile", "url", "config", "ranges", "requestRanges", "resolver", "IndexFileV1", "tree", "ReadMultiBPTree", "buffer", "dataView", "version", "formatByte", "FileFormat", "readOffset", "header", "fieldType", "headerMps", "idx", "mp", "indexMeta", "readIndexMeta", "currMp", "offsets", "o", "PAGE_SIZE_BYTES", "res", "data", "LinkedMetaPage", "indexMetas", "im", "collectIndexMetas", "init", "dataUrl", "indexUrl", "config", "Database", "DataFile", "IndexFile", "FieldType", "fieldTypeToString"] -} diff --git a/examples/chat/src/assets/favicon.ico b/examples/chat/src/assets/favicon.ico deleted file mode 100644 index b836b2bc..00000000 Binary files a/examples/chat/src/assets/favicon.ico and /dev/null differ diff --git a/examples/chat/src/chat/channel.tsx b/examples/chat/src/chat/channel.tsx deleted file mode 100644 index 9a4ebefc..00000000 --- a/examples/chat/src/chat/channel.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, type Resource } from "solid-js"; -import { Message } from "../App"; - -type ChannelProps = { - messages: Resource; -}; - -const Channel: Component = ({ messages }) => { - function readTime(unixDate: number): string { - return new Date(unixDate).toLocaleString(); - } - - return ( -
- {messages.loading &&

Loading...

} - {messages.error &&

Error loading messages

} - {messages()?.map((message) => { - return ( -
-

- {message.content} - {readTime(message.timestamp)} -

-
- ); - })} -
- ); -}; - -export default Channel; diff --git a/examples/chat/src/chat/textbar.tsx b/examples/chat/src/chat/textbar.tsx deleted file mode 100644 index 95257524..00000000 --- a/examples/chat/src/chat/textbar.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, createSignal } from "solid-js"; -import { Message, generateUniqueId } from "../App"; - -const Textbar: Component<{ username: string | null }> = ({ username }) => { - function sendMessage() { - if (messageContent().length > 0) { - let message: Message = { - username: username!!, - messageId: generateUniqueId(), - timestamp: Date.now(), - content: messageContent(), - }; - - console.log("send message", message); - // where we would WRITE an append - // Appendable.append(indexFileName: string, message: Message) - - setMessageContent(""); - } - } - - const [messageContent, setMessageContent] = createSignal(""); - - return ( -
-
- { - setMessageContent(ev.target.value); - }} - onKeyDown={(ev) => { - if (ev.key === "Enter") { - ev.preventDefault(); - sendMessage(); - } - }} - /> - - -
-
- ); -}; - -export default Textbar; diff --git a/examples/chat/src/header.tsx b/examples/chat/src/header.tsx deleted file mode 100644 index 5019bcdc..00000000 --- a/examples/chat/src/header.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Component } from "solid-js"; - -const Header: Component<{ username: string | null }> = ({ username }) => { - const headerContent = [ - { - title: "Appendable", - link: "https://github.com/kevmo314/appendable", - }, - { - title: "Source Code", - link: "https://github.com/kevmo314/appendable/tree/main/examples/chat#readme", - }, - ]; - - return ( -
-
- {headerContent.map(({ title, link }) => { - return ( - -

{title}

-
- ); - })} -
- -

{username}

-
- ); -}; - -export default Header; diff --git a/examples/chat/src/index.css b/examples/chat/src/index.css deleted file mode 100644 index b5c61c95..00000000 --- a/examples/chat/src/index.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/examples/chat/src/index.tsx b/examples/chat/src/index.tsx deleted file mode 100644 index 6495505d..00000000 --- a/examples/chat/src/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -/* @refresh reload */ -import { render } from "solid-js/web"; - -import "./index.css"; -import App from "./App"; - -const root = document.getElementById("root"); - -if (import.meta.env.DEV && !(root instanceof HTMLElement)) { - throw new Error( - "Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?", - ); -} - -render(() => , root!); diff --git a/examples/chat/src/user.tsx b/examples/chat/src/user.tsx deleted file mode 100644 index 86dc0cf9..00000000 --- a/examples/chat/src/user.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, Setter, createUniqueId, onMount } from "solid-js"; -import { - adjectives, - uniqueNamesGenerator, - animals, -} from "unique-names-generator"; - -export function setCookie(name: string, value: string, days: number) { - let expires = ""; - if (days) { - const date = new Date(); - date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); - expires = "; expires=" + date.toUTCString(); - } - document.cookie = name + "=" + (value || "") + expires + "; path=/"; -} - -export function getCookie(name: string) { - let nameEQ = name + "="; - let ca = document.cookie.split(";"); - for (let i = 0; i < ca.length; i++) { - let c = ca[i]; - while (c.charAt(0) == " ") c = c.substring(1, c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); - } - return null; -} - -export function eraseCookie(name: string) { - document.cookie = name + "=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"; -} - -const UserModal: Component<{ setUser: Setter }> = ({ - setUser, -}) => { - const username = uniqueNamesGenerator({ - dictionaries: [adjectives, animals], - separator: "-", - seed: createUniqueId(), - }); - - function handleSetUserAndCookie() { - setCookie("user", username, 7); - setUser(username); - } - - onMount(() => { - const handleEscape = (ev: KeyboardEvent) => { - if (ev.key === "Escape") { - handleSetUserAndCookie(); - } - }; - - window.addEventListener("keydown", handleEscape); - - return () => window.removeEventListener("keydown", handleEscape); - }); - - return ( -
-
-

A Chatting Platform without a conventional server with Appendable

-

Username: {username}

-
-
- ); -}; - -export default UserModal; diff --git a/examples/chat/tailwind.config.js b/examples/chat/tailwind.config.js deleted file mode 100644 index 54331dc9..00000000 --- a/examples/chat/tailwind.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ["./src/**/*.{js,ts,jsx,tsx}"], - theme: { - extend: {}, - }, - plugins: [], -}; diff --git a/examples/chat/tsconfig.json b/examples/chat/tsconfig.json deleted file mode 100644 index 249b2732..00000000 --- a/examples/chat/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "jsx": "preserve", - "jsxImportSource": "solid-js", - "types": ["vite/client"], - "noEmit": true, - "isolatedModules": true - } -} diff --git a/examples/chat/vite.config.ts b/examples/chat/vite.config.ts deleted file mode 100644 index 63f15a96..00000000 --- a/examples/chat/vite.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { defineConfig } from "vite"; -import solidPlugin from "vite-plugin-solid"; -// import devtools from 'solid-devtools/vite'; - -export default defineConfig({ - plugins: [ - /* - Uncomment the following line to enable solid-devtools. - For more info see https://github.com/thetarnav/solid-devtools/tree/main/packages/extension#readme - */ - // devtools(), - solidPlugin(), - ], - server: { - port: 3000, - }, - build: { - target: "esnext", - }, -});