diff --git a/package.json b/package.json index 87c40a50..fbfc8e5d 100644 --- a/package.json +++ b/package.json @@ -10,30 +10,40 @@ "build:clean:blockstore": "pnpm --filter @fireproof/encrypted-blockstore build:clean", "build:clean:core": "pnpm --filter @fireproof/core build:clean", "build:clean:react": "pnpm --filter use-fireproof build:clean", + "build:clean:solid": "pnpm --filter @fireproof/solid-js build:clean", "build:core": "pnpm --filter @fireproof/core build", "build:react": "pnpm --filter use-fireproof build", "build:scripts": "pnpm -r build:scripts", "build:scripts:blockstore": "pnpm --filter @fireproof/encrypted-blockstore build:scripts", "build:watch:react": "pnpm --parallel build:watch:react", + "build:solid": "pnpm --filter @fireproof/solid-js build", + "build:watch:solid": "pnpm --parallel build:watch:solid", "clean": "rm -rf node_modules && pnpm -r clean", "clean:all": "pnpm build:clean && pnpm clean", "clean:blockstore": "pnpm --filter @fireproof/encrypted-blockstore clean", "clean:core": "pnpm --filter @fireproof/core clean", "clean:react": "pnpm --filter use-fireproof clean", + "clean:solid": "pnpm --filter @fireproof/solid-js clean", "format:check": "pnpm -r format:check", "format:check:react": "pnpm --filter use-fireproof format:check", "format:fix": "pnpm -r format:fix", "format:fix:react": "pnpm --filter use-fireproof format:fix", + "format:fix:solid": "pnpm --filter @fireproof/solid-js format:fix", "lint:check": "pnpm -r lint:check", "lint:check:react": "pnpm --filter use-fireproof lint:check", + "lint:check:solid": "pnpm --filter @fireproof/solid-js lint:check", "lint:fix": "pnpm -r lint:fix", "lint:fix:react": "pnpm --filter use-fireproof lint:fix", + "lint:fix:solid": "pnpm --filter @fireproof/solid-js lint:fix", "start:react": "pnpm --filter @fireproof-example/react start", "test": "pnpm -r test", "test:blockstore": "pnpm --filter @fireproof/encrypted-blockstore test", "test:core": "pnpm --filter @fireproof/core test", "test:cov": "pnpm -r test:cov", - "test:react": "pnpm --filter use-fireproof test" + "test:cov:react": "pnpm --filter use-fireproof test:cov", + "test:cov:solid": "pnpm --filter @fireproof/solid-js test:cov", + "test:react": "pnpm --filter use-fireproof test", + "test:solid": "pnpm --filter @fireproof/solid-js test" }, "keywords": [ "database", diff --git a/packages/encrypted-blockstore/package.json b/packages/encrypted-blockstore/package.json index 1fb7b7e9..7567c6f8 100644 --- a/packages/encrypted-blockstore/package.json +++ b/packages/encrypted-blockstore/package.json @@ -67,7 +67,8 @@ "build:types": "tsc --declaration --outDir dist/types && node ./scripts/types.js", "build:version": "node -p \"'export const PACKAGE_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "build:watch": "tsup --watch", - "build:watch:nodemon": "nodemon -w src -w test -e ts,js --exec \"npm run build\"", + "build:watch:node": "nodemon -w src -w test -e ts,js --exec \"npm run build\"", + "build:watch:solid": "pnpm build:watch", "build:watch:react": "pnpm build:watch", "clean": "rm -rf node_modules", "cp:artifacts": "cp dist/lib/index.global.js ../fireproof/test/www/encrypted-blockstore.iife.js", diff --git a/packages/encrypted-blockstore/tsup.config.ts b/packages/encrypted-blockstore/tsup.config.ts index 940a4487..6dffd3fb 100644 --- a/packages/encrypted-blockstore/tsup.config.ts +++ b/packages/encrypted-blockstore/tsup.config.ts @@ -118,4 +118,7 @@ const TEST_BUNDLES: readonly Options[] = [ }, ] -export default defineConfig([ ...LIBRARY_BUNDLES, ...TEST_BUNDLES ]); +export default defineConfig((options) => [ + ...LIBRARY_BUNDLES, + ...(options.watch ? [] : TEST_BUNDLES) +]); diff --git a/packages/fireproof/package.json b/packages/fireproof/package.json index 3af80751..41a04fea 100644 --- a/packages/fireproof/package.json +++ b/packages/fireproof/package.json @@ -46,6 +46,7 @@ "build:types": "tsc --declaration --outDir dist/types && node ./scripts/types.js", "build:version": "node -p \"'export const PACKAGE_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "build:watch": "tsup --watch", + "build:watch:solid": "pnpm build:watch", "build:watch:react": "pnpm build:watch", "clean": "rm -rf node_modules", "cp:artifacts": "cp dist/browser/fireproof.global.js test/www/fireproof.iife.js", diff --git a/packages/fireproof/tsup.config.ts b/packages/fireproof/tsup.config.ts index 183c0ffc..c82ddbf7 100644 --- a/packages/fireproof/tsup.config.ts +++ b/packages/fireproof/tsup.config.ts @@ -126,4 +126,7 @@ const TEST_BUNDLES: readonly Options[] = [ }, ] -export default defineConfig([ ...LIBRARY_BUNDLES, ...TEST_BUNDLES ]); +export default defineConfig((options) => [ + ...LIBRARY_BUNDLES, + ...(options.watch ? [] : TEST_BUNDLES) +]); diff --git a/packages/solid-js/.eslintrc.json b/packages/solid-js/.eslintrc.json new file mode 100644 index 00000000..72739ed4 --- /dev/null +++ b/packages/solid-js/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": ["simple-import-sort", "solid"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:solid/typescript" + ], + "env": { + "browser": true, + "node": true, + "es6": true, + "jest": true + }, + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "@typescript-eslint/no-unused-vars": ["error", { "varsIgnorePattern": "^_" }], + "no-unused-vars": "off", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error" + }, + "ignorePatterns": ["dist", "node_modules"] +} diff --git a/packages/solid-js/.prettierignore b/packages/solid-js/.prettierignore new file mode 100644 index 00000000..18f2b36d --- /dev/null +++ b/packages/solid-js/.prettierignore @@ -0,0 +1,3 @@ +coverage +dist +node_modules diff --git a/packages/solid-js/package.json b/packages/solid-js/package.json new file mode 100644 index 00000000..6a824525 --- /dev/null +++ b/packages/solid-js/package.json @@ -0,0 +1,106 @@ +{ + "name": "@fireproof/solid-js", + "version": "0.1.0", + "description": "Convenience hooks for using Fireproof in SolidJS applications", + "type": "module", + "module": "./dist/server.js", + "main": "./dist/server.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "browser": { + "./dist/server.js": "./dist/index.js" + }, + "exports": { + "worker": { + "solid": "./dist/server.jsx", + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/server.js" + } + }, + "browser": { + "solid": "./dist/index.jsx", + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "deno": { + "solid": "./dist/server.jsx", + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/server.js" + } + }, + "node": { + "solid": "./dist/server.jsx", + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/server.js" + } + }, + "solid": "./dist/index.jsx", + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "typesVersions": {}, + "author": "Daniel Sanchez", + "license": "Apache-2.0 OR MIT", + "homepage": "https://use-fireproof.com", + "repository": { + "type": "git", + "url": "git+https://github.com/fireproof-storage/fireproof.git" + }, + "bugs": { + "url": "https://github.com/fireproof-storage/fireproof/issues" + }, + "scripts": { + "prepublishOnly": "cp ../../README.md . && pnpm build", + "postpublish": "rm README.md", + "build": "tsup", + "build:clean": "rm -rf dist", + "build:watch:solid": "tsup --watch", + "clean": "rm -rf node_modules", + "format:check": "prettier . --check", + "format:fix": "prettier . --write", + "lint:check": "eslint . --ext .ts,.tsx", + "lint:fix": "eslint . --ext .ts,.tsx --fix", + "test": "vitest run", + "test:cov": "vitest run --coverage" + }, + "dependencies": { + "@fireproof/core": "workspace:^", + "deepmerge-ts": "^5.1.0" + }, + "peerDependencies": { + "solid-js": ">=1.8.0" + }, + "devDependencies": { + "@solidjs/router": "^0.10.5", + "@vitest/coverage-istanbul": "^1.1.0", + "buffer": "^6.0.3", + "esbuild": "^0.19.10", + "eslint": "^8.56.0", + "eslint-plugin-simple-import-sort": "^10.0.0", + "eslint-plugin-solid": "^0.13.0", + "fake-indexeddb": "^5.0.1", + "prettier": "^3.1.1", + "solid-js": "^1.8.7", + "tsup-preset-solid": "^2.2.0", + "typescript": "^5.3.3", + "vite": "^5.0.12", + "vite-plugin-solid": "^2.9.1", + "vitest": "^1.2.2" + }, + "keywords": [ + "solid", + "database", + "json", + "live", + "sync" + ] +} diff --git a/packages/solid-js/prettier.config.js b/packages/solid-js/prettier.config.js new file mode 100644 index 00000000..2b4d1217 --- /dev/null +++ b/packages/solid-js/prettier.config.js @@ -0,0 +1,14 @@ +/** @type {import("prettier").Config} */ +const config = { + arrowParens: "always", + bracketSpacing: true, + endOfLine: "lf", + printWidth: 120, + semi: true, + singleQuote: false, + tabWidth: 2, + trailingComma: "es5", + useTabs: false, +}; + +export default config; diff --git a/packages/solid-js/setupTests.ts b/packages/solid-js/setupTests.ts new file mode 100644 index 00000000..6c56ce9f --- /dev/null +++ b/packages/solid-js/setupTests.ts @@ -0,0 +1,7 @@ +import "fake-indexeddb/auto"; + +import { Buffer } from "buffer"; +import { TextEncoder } from "util"; + +global.TextEncoder = TextEncoder; +global.Buffer = Buffer; diff --git a/packages/solid-js/src/__tests__/createFireproof.test.tsx b/packages/solid-js/src/__tests__/createFireproof.test.tsx new file mode 100644 index 00000000..6ce3442b --- /dev/null +++ b/packages/solid-js/src/__tests__/createFireproof.test.tsx @@ -0,0 +1,114 @@ +import { createRoot } from "solid-js"; +import { describe, expect, test } from "vitest"; + +import { createFireproof } from "../createFireproof"; + +type TestDoc = { text: string; completed: boolean }; + +const sleepHalfSecond = (ms: number = 500) => new Promise((resolve) => setTimeout(resolve, ms)); + +describe("HOOK: createFireproof", () => { + test("can perform all expected actions", async () => { + await createRoot(async (dispose) => { + const { database, createDocument, createLiveQuery } = createFireproof("TestDB"); + const [doc, setDoc, saveDoc] = createDocument(() => ({ text: "", completed: false })); + const query = createLiveQuery("_id"); + await sleepHalfSecond(); // wait for the initial createDocument effect to finish + + // 1. Can initialize a document + expect(doc()).toEqual({ text: "", completed: false }); + + // 2. Can update the document + setDoc({ text: "hello", completed: true }); + expect(doc()).toEqual({ text: "hello", completed: true }); + expect((await database().allDocs()).rows).toEqual([]); + expect(query().docs).toEqual([]); + + // 3. Can save the document to the database + const { id } = await saveDoc(); + expect(await database().get(id)).toEqual({ _id: id, text: "hello", completed: true }); + expect(doc()).toEqual({ _id: id, text: "hello", completed: true }); + + await sleepHalfSecond(); + expect(query().docs).toEqual([ + { + _id: id, + text: "hello", + completed: true, + }, + ]); + + // 4. Can locally update the same document (retaining _id info post first save) + setDoc({ text: "world", completed: false }); + expect(doc()).toEqual({ _id: id, text: "world", completed: false }); + expect(await database().get(id)).toEqual({ _id: id, text: "hello", completed: true }); + expect(query().docs).toEqual([ + { + _id: id, + text: "hello", + completed: true, + }, + ]); + + // 5. Can update the stored document + await saveDoc(); + expect(await database().get(id)).toEqual({ _id: id, text: "world", completed: false }); + expect(doc()).toEqual({ _id: id, text: "world", completed: false }); + + await sleepHalfSecond(); + expect(query().docs).toEqual([ + { + _id: id, + text: "world", + completed: false, + }, + ]); + + // 6. Can start anew with another document + setDoc(); + expect(doc()).toEqual({ text: "", completed: false }); + + // 7. Can update the new document + setDoc({ text: "foo", completed: true }); + expect(doc()).toEqual({ text: "foo", completed: true }); + + // 8. Can save the new document + const { id: id2 } = await saveDoc(); + expect(doc()).toEqual({ _id: id2, text: "foo", completed: true }); + expect(await database().get(id2)).toEqual({ _id: id2, text: "foo", completed: true }); + + await sleepHalfSecond(); + expect(query().docs).toEqual([ + { + _id: id, + text: "world", + completed: false, + }, + { + _id: id2, + text: "foo", + completed: true, + }, + ]); + + // Test cleanup to not keep data in the database across tests + await database().del(id); + await database().del(id2); + + expect( + await database() + .get(id) + .catch(() => null) + ).toBeNull(); + + expect( + await database() + .get(id2) + .catch(() => null) + ).toBeNull(); + + expect(query().docs).toEqual([]); + dispose(); + }); + }); +}); diff --git a/packages/solid-js/src/createFireproof.tsx b/packages/solid-js/src/createFireproof.tsx new file mode 100644 index 00000000..ee340906 --- /dev/null +++ b/packages/solid-js/src/createFireproof.tsx @@ -0,0 +1,196 @@ +import type { ConfigOpts, DbResponse, Doc, DocRecord, IndexRow, MapFn, QueryOpts } from "@fireproof/core"; +import { Database, fireproof } from "@fireproof/core"; +import { deepmerge } from "deepmerge-ts"; +import { Accessor, createEffect, createMemo, createSignal, onCleanup } from "solid-js"; + +export type LiveQueryResult> = { + readonly docs: Doc[]; + readonly rows: IndexRow[]; +}; + +export type CreateLiveQuery = >( + mapFn: string | MapFn, + query?: QueryOpts, + initialRows?: IndexRow[] +) => Accessor>; + +type UpdateDocFnOptions = { + readonly replace?: boolean; +}; + +type UpdateDocFn> = (newDoc?: Partial>, options?: UpdateDocFnOptions) => void; + +type StoreDocFn> = (existingDoc?: Doc) => Promise; + +export type CreateDocumentResult> = [Accessor>, UpdateDocFn, StoreDocFn]; + +export type CreateDocument = >(initialDocFn: Accessor>) => CreateDocumentResult; + +export type CreateFireproof = { + /** The Fireproof database */ + readonly database: Accessor; + /** + * ## Summary + * + * Creates a new Fireproof document into your custom-named Fireproof database. The creation occurs when you do not + * pass in an `_id` as part of your initial document -- the database will assign a new one when you call the provided + * `save` handler. The hook also provides generics support so you can inline your custom type into the invocation to + * receive type-safety and auto-complete support in your IDE. + * + * ## Usage + * + * ```tsx + * const [todo, setTodo, saveTodo] = createDocument(() => ({ + * text: '', + * date: Date.now(), + * completed: false + * })) + * + * const [doc, setDoc, saveDoc] = createDocument(() => ({ + * _id: `${props.customerId}-profile`, // you can imagine `customerId` as a prop passed in + * name: "", + * company: "", + * startedAt: Date.now() + * })) + * ``` + * + * ## Overview + * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically + * when you use the `createLiveQuery` and `createDocument` APIs. By default, Fireproof stores data in the browser's + * local storage. + */ + readonly createDocument: CreateDocument; + /** + * ## Summary + * Access to live query results, enabling real-time updates in your app. + * + * ## Usage + * + * ```tsx + * const result = createLiveQuery("date"); // using string key + * const result = createLiveQuery('date', { limit: 10, descending: true }) // key + options + * const result = createLiveQuery("date"); // using generics + * const result = createLiveQuery((doc) => doc.date)); // using map function + * ``` + * + * ## Overview + * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically + * when you use the `createLiveQuery` and `createDocument` APIs. By default, Fireproof stores data in the browser's + * local storage. + */ + readonly createLiveQuery: CreateLiveQuery; +}; + +/** + * + * ## Summary + * + * Create a Fireproof database and the utility hooks to work against it. If no name is + * provided, then it will default to `FireproofDB`. + * + * ## Usage + * ```tsx + * const { database, createLiveQuery, createDocument } = createFireproof(); + * const { database, createLiveQuery, createDocument } = createFireproof("AwesomeDB"); + * const { database, createLiveQuery, createDocument } = createFireproof("AwesomeDB", { ...options }); + * + * // As global databases -- can put these in a file and import them where you need them + * export const FireproofDB = createFireproof(); + * export const AwesomeDB = createFireproof("AwesomeDB"); + * ``` + * + */ +export function createFireproof(dbName?: string, config: ConfigOpts = {}): CreateFireproof { + // The database connection is cached, so subsequent calls to fireproof with the same name will + // return the same database object. This makes it safe to invoke the getter function many times + // without needing to wrap it with createMemo. An added perk of not needing createMemo is this + // allows use of this hook at the global scope without needing to wrap it with createRoot from SolidJS. + const database = () => fireproof(dbName || "FireproofDB", config); + + function createDocument>(initialDocFn: Accessor>): CreateDocumentResult { + const [doc, setDoc] = createSignal(initialDocFn()); + const initialDocId = () => initialDocFn()._id; + + // Memoize the docId to re-run dependent effects ONLY when the _id value actually changes + const docId = createMemo(() => doc()._id); + + const updateDoc: UpdateDocFn = (newDoc, options = { replace: false }) => { + setDoc( + !newDoc + ? initialDocFn + : (prevDoc) => (options.replace ? (newDoc as Doc) : (deepmerge(prevDoc, newDoc) as Doc)) + ); + }; + + const saveDoc: StoreDocFn = async (existingDoc) => { + const response = await database().put(existingDoc ?? doc()); + if (!existingDoc && !doc()._id) setDoc((d) => ({ ...d, _id: response.id })); + return response; + }; + + const refreshDoc = async (db: Database, docId = "") => { + // TODO: Add option for MVCC (Multi-version concurrency control) checks + // https://use-fireproof.com/docs/database-api/documents/#multi-version-concurrency-control-mvcc-available-in-alpha-coming-soon-in-beta + const storedDoc = await db.get(docId).catch(initialDocFn); + setDoc(() => storedDoc); + }; + + createEffect(() => { + const subscriptionId = docId(); + if (!subscriptionId) return; + + const db = database(); + + const unsubscribe = db.subscribe(async (updatedDocs) => { + if (updatedDocs.find((c) => c._id === subscriptionId)) { + await refreshDoc(db, subscriptionId); + } + }); + + onCleanup(() => { + unsubscribe(); + }); + }); + + createEffect(() => { + void refreshDoc(database(), initialDocId()); + }); + + return [doc, updateDoc, saveDoc]; + } + + function createLiveQuery>( + strOrFn: string | MapFn, + query = {}, + initialRows: IndexRow[] = [] + ) { + // TODO: Explore using a store instead of a signal for more efficient updates + const [result, setResult] = createSignal({ + docs: initialRows.map((r) => r.doc as Doc), + rows: initialRows, + }); + + const refreshRows = async (db: Database) => { + const res = await db.query(strOrFn, query); + setResult({ ...res, docs: res.rows.map((r) => r.doc as Doc) }); + }; + + createEffect(() => { + const db = database(); + + void refreshRows(db); + + const unsubscribe = db.subscribe(async () => { + await refreshRows(db); + }); + + onCleanup(() => { + unsubscribe(); + }); + }); + + return result; + } + + return { database, createDocument, createLiveQuery }; +} diff --git a/packages/solid-js/src/index.tsx b/packages/solid-js/src/index.tsx new file mode 100644 index 00000000..4dba36ea --- /dev/null +++ b/packages/solid-js/src/index.tsx @@ -0,0 +1,2 @@ +export { type CreateDocument, type CreateFireproof, createFireproof, type CreateLiveQuery } from "./createFireproof"; +export * from "@fireproof/core"; diff --git a/packages/solid-js/tsconfig.json b/packages/solid-js/tsconfig.json new file mode 100644 index 00000000..54fc4a13 --- /dev/null +++ b/packages/solid-js/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "rootDir": "src", + + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "outDir": "dist", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + + /* Linting */ + "strict": true, + "sourceMap": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "allowJs": true, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": false, + "strictNullChecks": true, + "esModuleInterop": true, + }, + "include": ["src"], + "exclude": ["node_modules", "dist"], +} diff --git a/packages/solid-js/tsup.config.ts b/packages/solid-js/tsup.config.ts new file mode 100644 index 00000000..55ecfb1d --- /dev/null +++ b/packages/solid-js/tsup.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from "tsup"; +import * as preset from "tsup-preset-solid"; + +const generateSolidPresetOptions = (watching: boolean): preset.PresetOptions => ({ + entries: [ + { + // entries with '.tsx' extension will have `solid` export condition generated + entry: "src/index.tsx", + dev_entry: false, + server_entry: true, + }, + ], + drop_console: !watching, // remove all `console.*` calls and `debugger` statements in prod builds + cjs: false, +}); + +export default defineConfig((config) => { + const watching = !!config.watch; + const solidPresetOptions = generateSolidPresetOptions(watching); + const parsedOptions = preset.parsePresetOptions(solidPresetOptions, watching); + + if (!watching) { + const packageFields = preset.generatePackageExports(parsedOptions); + // console.log(`\npackage.json: \n${JSON.stringify(packageFields, null, 2)}\n\n`); + /* will update ./package.json with the correct export fields */ + preset.writePackageJson(packageFields); + } + + const tsupOptions = preset + .generateTsupOptions(parsedOptions) + .map((tsupOption) => ({ name: "solid-js", ...tsupOption })); + + return tsupOptions; +}); diff --git a/packages/solid-js/vite.config.ts b/packages/solid-js/vite.config.ts new file mode 100644 index 00000000..383e5c6e --- /dev/null +++ b/packages/solid-js/vite.config.ts @@ -0,0 +1,18 @@ +/// +/// + +import { defineConfig } from "vite"; +import solidPlugin from "vite-plugin-solid"; + +export default defineConfig({ + plugins: [solidPlugin()], + test: { + globals: true, + environment: "jsdom", + setupFiles: ["./setupTests.ts"], + isolate: false, + coverage: { + provider: "istanbul", + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a0efe3a..69dcb41e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -715,6 +715,61 @@ importers: specifier: ^1.2.1 version: 1.2.1(jsdom@23.2.0) + packages/solid-js: + dependencies: + '@fireproof/core': + specifier: workspace:^ + version: link:../fireproof + deepmerge-ts: + specifier: ^5.1.0 + version: 5.1.0 + devDependencies: + '@solidjs/router': + specifier: ^0.10.5 + version: 0.10.10(solid-js@1.8.12) + '@vitest/coverage-istanbul': + specifier: ^1.1.0 + version: 1.2.1(vitest@1.2.2) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + esbuild: + specifier: ^0.19.10 + version: 0.19.11 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + eslint-plugin-simple-import-sort: + specifier: ^10.0.0 + version: 10.0.0(eslint@8.56.0) + eslint-plugin-solid: + specifier: ^0.13.0 + version: 0.13.1(eslint@8.56.0)(typescript@5.3.3) + fake-indexeddb: + specifier: ^5.0.1 + version: 5.0.2 + prettier: + specifier: ^3.1.1 + version: 3.2.4 + solid-js: + specifier: ^1.8.7 + version: 1.8.12 + tsup-preset-solid: + specifier: ^2.2.0 + version: 2.2.0(esbuild@0.19.11)(solid-js@1.8.12)(tsup@8.0.1) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + vite: + specifier: ^5.0.12 + version: 5.0.12 + vite-plugin-solid: + specifier: ^2.9.1 + version: 2.9.1(solid-js@1.8.12)(vite@5.0.12) + vitest: + specifier: ^1.2.2 + version: 1.2.2 + packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -797,6 +852,13 @@ packages: jsesc: 2.5.2 dev: true + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} @@ -808,6 +870,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-class-features-plugin@7.23.9(@babel/core@7.23.7): + resolution: {integrity: sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -828,6 +908,20 @@ packages: '@babel/types': 7.23.6 dev: true + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} @@ -849,11 +943,30 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} @@ -861,6 +974,13 @@ packages: '@babel/types': 7.23.6 dev: true + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -911,6 +1031,38 @@ packages: '@babel/types': 7.23.6 dev: true + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} @@ -931,6 +1083,33 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) + dev: true + /@babel/runtime@7.23.8: resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} engines: {node: '>=6.9.0'} @@ -2209,6 +2388,14 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true + /@solidjs/router@0.10.10(solid-js@1.8.12): + resolution: {integrity: sha512-nGl7gMgsojuaupI5MAK2cFtkndmWWSAPhill/8La3IjujY3vMBamcQFymBsA2ejzxEYJjkOlEQHYgp2jNFkwuQ==} + peerDependencies: + solid-js: ^1.8.6 + dependencies: + solid-js: 1.8.12 + dev: true + /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -2799,6 +2986,25 @@ packages: - supports-color dev: true + /@vitest/coverage-istanbul@1.2.1(vitest@1.2.2): + resolution: {integrity: sha512-j8M4R3XbQ7cmLqJd7mfxCpEc0bQ7S6o5VIEt7c0Auri2lT1hkd89Sa/mOYDnuGasTNawamW+0d9vDRK/5uhVXw==} + peerDependencies: + vitest: ^1.0.0 + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + magicast: 0.3.3 + picocolors: 1.0.0 + test-exclude: 6.0.0 + vitest: 1.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@vitest/expect@1.2.1: resolution: {integrity: sha512-/bqGXcHfyKgFWYwIgFr1QYDaR9e64pRKxgBNWNXPefPFRhgm+K3+a/dS0cUGEreWngets3dlr8w8SBRw2fCfFQ==} dependencies: @@ -2807,6 +3013,14 @@ packages: chai: 4.4.1 dev: true + /@vitest/expect@1.2.2: + resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} + dependencies: + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 + chai: 4.4.1 + dev: true + /@vitest/runner@1.2.1: resolution: {integrity: sha512-zc2dP5LQpzNzbpaBt7OeYAvmIsRS1KpZQw4G3WM/yqSV1cQKNKwLGmnm79GyZZjMhQGlRcSFMImLjZaUQvNVZQ==} dependencies: @@ -2815,6 +3029,14 @@ packages: pathe: 1.1.2 dev: true + /@vitest/runner@1.2.2: + resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} + dependencies: + '@vitest/utils': 1.2.2 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + /@vitest/snapshot@1.2.1: resolution: {integrity: sha512-Tmp/IcYEemKaqAYCS08sh0vORLJkMr0NRV76Gl8sHGxXT5151cITJCET20063wk0Yr/1koQ6dnmP6eEqezmd/Q==} dependencies: @@ -2823,12 +3045,26 @@ packages: pretty-format: 29.7.0 dev: true + /@vitest/snapshot@1.2.2: + resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} + dependencies: + magic-string: 0.30.5 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + /@vitest/spy@1.2.1: resolution: {integrity: sha512-vG3a/b7INKH7L49Lbp0IWrG6sw9j4waWAucwnksPB1r1FTJgV7nkBByd9ufzu6VWya/QTvQW4V9FShZbZIB2UQ==} dependencies: tinyspy: 2.2.0 dev: true + /@vitest/spy@1.2.2: + resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} + dependencies: + tinyspy: 2.2.0 + dev: true + /@vitest/utils@1.2.1: resolution: {integrity: sha512-bsH6WVZYe/J2v3+81M5LDU8kW76xWObKIURpPrOXm2pjBniBu2MERI/XP60GpS4PHU3jyK50LUutOwrx4CyHUg==} dependencies: @@ -2838,6 +3074,15 @@ packages: pretty-format: 29.7.0 dev: true + /@vitest/utils@1.2.2: + resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /@w3ui/keyring-core@2.2.1: resolution: {integrity: sha512-y98m6OAEYAM8juE/Shbj1T2D1dtoKtNB3HtxPsdVDtgDGFj1O+Vy+BNNN2j2R/5SvFiyKoBIHoHeDjFMNdOIyw==} dependencies: @@ -3562,6 +3807,28 @@ packages: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} dev: true + /babel-plugin-jsx-dom-expressions@0.37.16(@babel/core@7.23.7): + resolution: {integrity: sha512-ItMD16axbk+FqVb9vIbc7AOpNowy46VaSUHaMYPn+erPGpMCxsahQ1Iv+qhPMthjxtn5ROVMZ5AJtQvzjxjiNA==} + peerDependencies: + '@babel/core': ^7.20.12 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/types': 7.23.6 + html-entities: 2.3.3 + validate-html-nesting: 1.2.2 + dev: true + + /babel-preset-solid@1.8.12(@babel/core@7.23.7): + resolution: {integrity: sha512-Fx1dYokeRwouWqjLkdobA6qvTAPxFSEU2c5PlkfJjlNyONlSMJQPaX0Bae5pc+5/LNteb9BseOp4UHwQu6VC9Q==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + babel-plugin-jsx-dom-expressions: 0.37.16(@babel/core@7.23.7) + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3740,7 +4007,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -4334,6 +4600,11 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + engines: {node: '>=16.0.0'} + dev: false + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -4694,6 +4965,21 @@ packages: resolution: {integrity: sha512-eJy9B8yDW5X/J48eWtR1uVmv+DKfHvYYnrrcqQoe/nUkVHVOTZlJnSevkYyGOz6hI90t036Y5QIPDrGzmppxfg==} dev: true + /esbuild-plugin-solid@0.5.0(esbuild@0.19.11)(solid-js@1.8.12): + resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} + peerDependencies: + esbuild: '>=0.12' + solid-js: '>= 1.0' + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + babel-preset-solid: 1.8.12(@babel/core@7.23.7) + esbuild: 0.19.11 + solid-js: 1.8.12 + transitivePeerDependencies: + - supports-color + dev: true + /esbuild-plugin-tsc@0.4.0(typescript@5.3.3): resolution: {integrity: sha512-q9gWIovt1nkwchMLc2zhyksaiHOv3kDK4b0AUol8lkMCRhJ1zavgfb2fad6BKp7FT9rh/OHmEBXVjczLoi/0yw==} peerDependencies: @@ -5016,6 +5302,23 @@ packages: eslint: 8.56.0 dev: true + /eslint-plugin-solid@0.13.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-PdNrAylFzeh/SbnLc2pQ432l+bXFGzXj/qNqkh5QNVZCoWIdSs0CJA2D7hqW0DloztwUrzkVZCDWFWc3iRAm/Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + is-html: 2.0.0 + kebab-case: 1.0.2 + known-css-properties: 0.24.0 + style-to-object: 0.3.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -5256,6 +5559,11 @@ packages: - supports-color dev: true + /fake-indexeddb@5.0.2: + resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} + engines: {node: '>=18'} + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5695,10 +6003,19 @@ packages: whatwg-encoding: 3.1.1 dev: true + /html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: true + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + /http-proxy-agent@7.0.0: resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} engines: {node: '>= 14'} @@ -5807,6 +6124,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + /inquirer@9.2.12: resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} @@ -6029,6 +6350,13 @@ packages: is-extglob: 2.1.1 dev: true + /is-html@2.0.0: + resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} + engines: {node: '>=8'} + dependencies: + html-tags: 3.3.1 + dev: true + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -6182,6 +6510,11 @@ packages: get-intrinsic: 1.2.2 dev: true + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -6504,6 +6837,10 @@ packages: object.values: 1.1.7 dev: true + /kebab-case@1.0.2: + resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + dev: true + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -6515,6 +6852,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /known-css-properties@0.24.0: + resolution: {integrity: sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==} + dev: true + /kysely@0.23.5: resolution: {integrity: sha512-TH+b56pVXQq0tsyooYLeNfV11j6ih7D50dyN8tkM0e7ndiUH28Nziojiog3qRFlmEj9XePYdZUrNJ2079Qjdow==} engines: {node: '>=14.0.0'} @@ -6724,6 +7065,13 @@ packages: timers-ext: 0.1.7 dev: false + /merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + /merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -8195,6 +8543,20 @@ packages: randombytes: 2.1.0 dev: true + /seroval-plugins@1.0.4(seroval@1.0.4): + resolution: {integrity: sha512-DQ2IK6oQVvy8k+c2V5x5YCtUa/GGGsUwUBNN9UqohrZ0rWdUapBFpNMYP1bCyRHoxOJjdKGl+dieacFIpU/i1A==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + dependencies: + seroval: 1.0.4 + dev: true + + /seroval@1.0.4: + resolution: {integrity: sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==} + engines: {node: '>=10'} + dev: true + /servor@4.0.2: resolution: {integrity: sha512-MlmQ5Ntv4jDYUN060x/KEmN7emvIqKMZ9OkM+nY8Bf2+KkyLmGsTqWLyAN2cZr5oESAcH00UanUyyrlS1LRjFw==} hasBin: true @@ -8309,6 +8671,25 @@ packages: smart-buffer: 4.2.0 dev: true + /solid-js@1.8.12: + resolution: {integrity: sha512-sLE/i6M9FSWlov3a2pTC5ISzanH2aKwqXTZj+bbFt4SUrVb4iGEa7fpILBMOxsQjkv3eXqEk6JVLlogOdTe0UQ==} + dependencies: + csstype: 3.1.3 + seroval: 1.0.4 + seroval-plugins: 1.0.4(seroval@1.0.4) + dev: true + + /solid-refresh@0.6.3(solid-js@1.8.12): + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + dependencies: + '@babel/generator': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/types': 7.23.6 + solid-js: 1.8.12 + dev: true + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -8513,6 +8894,12 @@ packages: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} dev: false + /style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + dependencies: + inline-style-parser: 0.1.1 + dev: true + /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -8804,6 +9191,19 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsup-preset-solid@2.2.0(esbuild@0.19.11)(solid-js@1.8.12)(tsup@8.0.1): + resolution: {integrity: sha512-sPAzeArmYkVAZNRN+m4tkiojdd0GzW/lCwd4+TQDKMENe8wr2uAuro1s0Z59ASmdBbkXoxLgCiNcuQMyiidMZg==} + peerDependencies: + tsup: ^8.0.0 + dependencies: + esbuild-plugin-solid: 0.5.0(esbuild@0.19.11)(solid-js@1.8.12) + tsup: 8.0.1 + transitivePeerDependencies: + - esbuild + - solid-js + - supports-color + dev: true + /tsup@8.0.1: resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} engines: {node: '>=18'} @@ -9059,6 +9459,10 @@ packages: convert-source-map: 2.0.0 dev: true + /validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + dev: true + /varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} dev: false @@ -9084,6 +9488,27 @@ packages: - terser dev: true + /vite-node@1.2.2: + resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.0.12 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-plugin-node-polyfills@0.7.0(vite@4.5.1): resolution: {integrity: sha512-DKBSGDOx3R8pUIsQFRZAWNYp0vIffJOT0NkuByX4WIQq80nJ2eamAph5T9zG91liO1Fyl1lo7/Onh6xoQO52XQ==} peerDependencies: @@ -9096,6 +9521,28 @@ packages: - rollup dev: true + /vite-plugin-solid@2.9.1(solid-js@1.8.12)(vite@5.0.12): + resolution: {integrity: sha512-RC4hj+lbvljw57BbMGDApvEOPEh14lwrr/GeXRLNQLcR1qnOdzOwwTSFy13Gj/6FNIZpBEl0bWPU+VYFawrqUw==} + 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 + dependencies: + '@babel/core': 7.23.7 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.8.12(@babel/core@7.23.7) + merge-anything: 5.1.7 + solid-js: 1.8.12 + solid-refresh: 0.6.3(solid-js@1.8.12) + vite: 5.0.12 + vitefu: 0.2.5(vite@5.0.12) + transitivePeerDependencies: + - supports-color + dev: true + /vite@4.5.1: resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -9166,6 +9613,17 @@ packages: fsevents: 2.3.3 dev: true + /vitefu@0.2.5(vite@5.0.12): + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 5.0.12 + dev: true + /vitest@1.2.1(jsdom@23.2.0): resolution: {integrity: sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -9223,6 +9681,62 @@ packages: - terser dev: true + /vitest@1.2.2: + resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.2.2 + '@vitest/runner': 1.2.2 + '@vitest/snapshot': 1.2.2 + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.5 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.0.12 + vite-node: 1.2.2 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} dev: true