diff --git a/bun.lock b/bun.lock index 43341ab..afdec97 100644 --- a/bun.lock +++ b/bun.lock @@ -14,11 +14,14 @@ "@solid-primitives/scheduled": "^1.5.1", "@solid-primitives/storage": "^4.3.2", "@solid-primitives/virtual": "^0.2.1", + "@solid-primitives/websocket": "^1.3.1", "@solidjs/router": "^0.15.3", "@sqlite.org/sqlite-wasm": "^3.49.2-build1", "@tailwindcss/vite": "^4.1.8", "comlink": "^4.4.2", "drizzle-orm": "^0.44.1", + "ky": "^1.8.1", + "madge": "^8.0.0", "solid-js": "^1.9.5", "sqlite-parser": "^1.0.1", "tailwindcss": "^4.1.8", @@ -87,6 +90,8 @@ "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], + "@dependents/detective-less": ["@dependents/detective-less@5.0.1", "", { "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" } }, "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ=="], + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], @@ -191,6 +196,12 @@ "@neon-rs/load": ["@neon-rs/load@0.0.4", "", {}, "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], "@rollup/plugin-virtual": ["@rollup/plugin-virtual@3.0.2", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A=="], @@ -257,6 +268,8 @@ "@solid-primitives/virtual": ["@solid-primitives/virtual@0.2.1", "", { "dependencies": { "@solid-primitives/utils": "^6.3.1" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-8Rq0Vtxt/oIiHT2+jMJAjIAJ5xKwN5h/YbjAz5r7jhfoMfldHrbYM239g4i/Hkp6JK/yyhOhL2JhQyGf7YESzw=="], + "@solid-primitives/websocket": ["@solid-primitives/websocket@1.3.1", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-F06tA2FKa5VsnS4E4WEc3jHpsJfXRlMTGOtolugTzCqV3JmJTyvk9UVg1oz6PgGHKGi1CQ91OP8iW34myyJgaQ=="], + "@solidjs/router": ["@solidjs/router@0.15.3", "", { "peerDependencies": { "solid-js": "^1.8.6" } }, "sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw=="], "@sqlite.org/sqlite-wasm": ["@sqlite.org/sqlite-wasm@3.49.2-build1", "", { "bin": { "sqlite-wasm": "bin/index.js" } }, "sha512-yQSfIBn4alEXNcRj8o47rI4pID0JrsavyskzaH4PCq77PVpc05WUeIgqFOT86fa62KpMM9/qaRH8dtpia3UxGQ=="], @@ -321,6 +334,14 @@ "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], + "@ts-graphviz/adapter": ["@ts-graphviz/adapter@2.0.6", "", { "dependencies": { "@ts-graphviz/common": "^2.1.5" } }, "sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q=="], + + "@ts-graphviz/ast": ["@ts-graphviz/ast@2.0.7", "", { "dependencies": { "@ts-graphviz/common": "^2.1.5" } }, "sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw=="], + + "@ts-graphviz/common": ["@ts-graphviz/common@2.1.5", "", {}, "sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg=="], + + "@ts-graphviz/core": ["@ts-graphviz/core@2.0.7", "", { "dependencies": { "@ts-graphviz/ast": "^2.0.7", "@ts-graphviz/common": "^2.1.5" } }, "sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg=="], + "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -339,6 +360,16 @@ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.34.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.34.0", "@typescript-eslint/types": "^8.34.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.34.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.34.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.34.0", "@typescript-eslint/tsconfig-utils": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.0", "", { "dependencies": { "@typescript-eslint/types": "8.34.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA=="], + "@vitest/browser": ["@vitest/browser@3.1.4", "", { "dependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.6.1", "@vitest/mocker": "3.1.4", "@vitest/utils": "3.1.4", "magic-string": "^0.30.17", "sirv": "^3.0.1", "tinyrainbow": "^2.0.0", "ws": "^8.18.1" }, "peerDependencies": { "playwright": "*", "vitest": "3.1.4", "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" }, "optionalPeers": ["playwright", "webdriverio"] }, "sha512-2L4vR/tuUZBxKU72Qe+unIp1P8lZ0T5nlqPegkXxyZFR5gWqItV8VPPR261GOzl49Zw2AhzMABzMMHJagQ0a2g=="], "@vitest/expect": ["@vitest/expect@3.1.4", "", { "dependencies": { "@vitest/spy": "3.1.4", "@vitest/utils": "3.1.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA=="], @@ -355,22 +386,50 @@ "@vitest/utils": ["@vitest/utils@3.1.4", "", { "dependencies": { "@vitest/pretty-format": "3.1.4", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" } }, "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg=="], + "@vue/compiler-core": ["@vue/compiler-core@3.5.16", "", { "dependencies": { "@babel/parser": "^7.27.2", "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ=="], + + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.16", "", { "dependencies": { "@vue/compiler-core": "3.5.16", "@vue/shared": "3.5.16" } }, "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.16", "", { "dependencies": { "@babel/parser": "^7.27.2", "@vue/compiler-core": "3.5.16", "@vue/compiler-dom": "3.5.16", "@vue/compiler-ssr": "3.5.16", "@vue/shared": "3.5.16", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.3", "source-map-js": "^1.2.1" } }, "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw=="], + + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.16", "", { "dependencies": { "@vue/compiler-dom": "3.5.16", "@vue/shared": "3.5.16" } }, "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A=="], + + "@vue/shared": ["@vue/shared@3.5.16", "", {}, "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg=="], + "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "app-module-path": ["app-module-path@2.2.0", "", {}, "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ=="], + "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "ast-module-types": ["ast-module-types@6.0.1", "", {}, "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA=="], + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.39.8", "", { "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", "parse5": "^7.1.2", "validate-html-nesting": "^1.2.1" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ=="], "babel-preset-solid": ["babel-preset-solid@1.9.6", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.39.8" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "browserslist": ["browserslist@4.25.0", "", { "dependencies": { "caniuse-lite": "^1.0.30001718", "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA=="], + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -385,12 +444,24 @@ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "comlink": ["comlink@4.4.2", "", {}, "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g=="], + "commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cssstyle": ["cssstyle@4.3.1", "", { "dependencies": { "@asamuzakjp/css-color": "^3.1.2", "rrweb-cssom": "^0.8.0" } }, "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q=="], @@ -407,10 +478,34 @@ "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "dependency-tree": ["dependency-tree@11.1.1", "", { "dependencies": { "commander": "^12.1.0", "filing-cabinet": "^5.0.3", "precinct": "^12.2.0", "typescript": "^5.7.3" }, "bin": { "dependency-tree": "bin/cli.js" } }, "sha512-pnkCd8VGOq70EVaEQxDC9mZCjCwYj4yG4j8h+PEJswuWp+rdE6p8zbtVvWk+yPwaVimOjlhNi782U9K5KOU9MQ=="], + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + "detective-amd": ["detective-amd@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "escodegen": "^2.1.0", "get-amd-module-type": "^6.0.1", "node-source-walk": "^7.0.1" }, "bin": { "detective-amd": "bin/cli.js" } }, "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g=="], + + "detective-cjs": ["detective-cjs@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" } }, "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw=="], + + "detective-es6": ["detective-es6@5.0.1", "", { "dependencies": { "node-source-walk": "^7.0.1" } }, "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew=="], + + "detective-postcss": ["detective-postcss@7.0.1", "", { "dependencies": { "is-url": "^1.2.4", "postcss-values-parser": "^6.0.2" }, "peerDependencies": { "postcss": "^8.4.47" } }, "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ=="], + + "detective-sass": ["detective-sass@6.0.1", "", { "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" } }, "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw=="], + + "detective-scss": ["detective-scss@5.0.1", "", { "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" } }, "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg=="], + + "detective-stylus": ["detective-stylus@5.0.1", "", {}, "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA=="], + + "detective-typescript": ["detective-typescript@14.0.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "^8.23.0", "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" }, "peerDependencies": { "typescript": "^5.4.4" } }, "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw=="], + + "detective-vue2": ["detective-vue2@2.2.0", "", { "dependencies": { "@dependents/detective-less": "^5.0.1", "@vue/compiler-sfc": "^3.5.13", "detective-es6": "^5.0.1", "detective-sass": "^6.0.1", "detective-scss": "^5.0.1", "detective-stylus": "^5.0.1", "detective-typescript": "^14.0.0" }, "peerDependencies": { "typescript": "^5.4.4" } }, "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA=="], + "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], "drizzle-kit": ["drizzle-kit@0.31.1", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.2", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-PUjYKWtzOzPtdtQlTHQG3qfv4Y0XT8+Eas6UbxCmxTj7qgMf+39dDujf1BP1I+qqZtw9uzwTh8jYtkMuCq+B0Q=="], @@ -431,28 +526,62 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + "fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fdir": ["fdir@6.4.5", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw=="], "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + "filing-cabinet": ["filing-cabinet@5.0.3", "", { "dependencies": { "app-module-path": "^2.2.0", "commander": "^12.1.0", "enhanced-resolve": "^5.18.0", "module-definition": "^6.0.1", "module-lookup-amd": "^9.0.3", "resolve": "^1.22.10", "resolve-dependency-path": "^4.0.1", "sass-lookup": "^6.1.0", "stylus-lookup": "^6.1.0", "tsconfig-paths": "^4.2.0", "typescript": "^5.7.3" }, "bin": { "filing-cabinet": "bin/cli.js" } }, "sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-amd-module-type": ["get-amd-module-type@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" } }, "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ=="], + + "get-own-enumerable-property-symbols": ["get-own-enumerable-property-symbols@3.0.2", "", {}, "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="], + "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "gonzales-pe": ["gonzales-pe@4.3.0", "", { "dependencies": { "minimist": "^1.2.5" }, "bin": { "gonzales": "bin/gonzales.js" } }, "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="], "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], @@ -463,8 +592,36 @@ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-obj": ["is-obj@1.0.1", "", {}, "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="], + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + "is-regexp": ["is-regexp@1.0.0", "", {}, "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA=="], + + "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + + "is-url": ["is-url@1.2.4", "", {}, "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="], + + "is-url-superb": ["is-url-superb@4.0.0", "", {}, "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA=="], + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], @@ -479,6 +636,8 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "ky": ["ky@1.8.1", "", {}, "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="], + "libsql": ["libsql@0.5.12", "", { "dependencies": { "@neon-rs/load": "^0.0.4", "detect-libc": "2.0.2" }, "optionalDependencies": { "@libsql/darwin-arm64": "0.5.12", "@libsql/darwin-x64": "0.5.12", "@libsql/linux-arm-gnueabihf": "0.5.12", "@libsql/linux-arm-musleabihf": "0.5.12", "@libsql/linux-arm64-gnu": "0.5.12", "@libsql/linux-arm64-musl": "0.5.12", "@libsql/linux-x64-gnu": "0.5.12", "@libsql/linux-x64-musl": "0.5.12", "@libsql/win32-x64-msvc": "0.5.12" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "arm", "x64", "arm64", ] }, "sha512-TikiQZ1j4TwFEqVdJdTM9ZTti28is/ytGEvn0S2MocOj69UKQetWACe/qd8KAD5VeNnQSVd6Nlm2AJx0DFW9Ag=="], "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], @@ -503,22 +662,40 @@ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + "madge": ["madge@8.0.0", "", { "dependencies": { "chalk": "^4.1.2", "commander": "^7.2.0", "commondir": "^1.0.1", "debug": "^4.3.4", "dependency-tree": "^11.0.0", "ora": "^5.4.1", "pluralize": "^8.0.0", "pretty-ms": "^7.0.1", "rc": "^1.2.8", "stream-to-array": "^2.3.0", "ts-graphviz": "^2.1.2", "walkdir": "^0.4.1" }, "peerDependencies": { "typescript": "^5.4.4" }, "optionalPeers": ["typescript"], "bin": { "madge": "bin/cli.js" } }, "sha512-9sSsi3TBPhmkTCIpVQF0SPiChj1L7Rq9kU2KDG1o6v2XH9cCw086MopjVCD+vuoL5v8S77DTbVopTO8OUiQpIw=="], + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + "module-definition": ["module-definition@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" }, "bin": { "module-definition": "bin/cli.js" } }, "sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g=="], + + "module-lookup-amd": ["module-lookup-amd@9.0.4", "", { "dependencies": { "commander": "^12.1.0", "glob": "^7.2.3", "requirejs": "^2.3.7", "requirejs-config-file": "^4.0.0" }, "bin": { "lookup-amd": "bin/cli.js" } }, "sha512-DWJEuLVvjxh5b8wrvJC5wr2a7qo7pOWXIgdCBNazU416kcIyzO4drxvlqKhsHzYwxcC4cWuhoK+MiWCKCGnv7A=="], + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -531,10 +708,24 @@ "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + "node-source-walk": ["node-source-walk@7.0.1", "", { "dependencies": { "@babel/parser": "^7.26.7" } }, "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg=="], + "nwsapi": ["nwsapi@2.2.20", "", {}, "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA=="], + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], + + "parse-ms": ["parse-ms@2.1.0", "", {}, "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="], + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], @@ -547,24 +738,58 @@ "playwright-core": ["playwright-core@1.52.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg=="], + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + "postcss": ["postcss@8.5.4", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w=="], + "postcss-values-parser": ["postcss-values-parser@6.0.2", "", { "dependencies": { "color-name": "^1.1.4", "is-url-superb": "^4.0.0", "quote-unquote": "^1.0.0" }, "peerDependencies": { "postcss": "^8.2.9" } }, "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw=="], + + "precinct": ["precinct@12.2.0", "", { "dependencies": { "@dependents/detective-less": "^5.0.1", "commander": "^12.1.0", "detective-amd": "^6.0.1", "detective-cjs": "^6.0.1", "detective-es6": "^5.0.1", "detective-postcss": "^7.0.1", "detective-sass": "^6.0.1", "detective-scss": "^5.0.1", "detective-stylus": "^5.0.1", "detective-typescript": "^14.0.0", "detective-vue2": "^2.2.0", "module-definition": "^6.0.1", "node-source-walk": "^7.0.1", "postcss": "^8.5.1", "typescript": "^5.7.3" }, "bin": { "precinct": "bin/cli.js" } }, "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w=="], + "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + "pretty-ms": ["pretty-ms@7.0.1", "", { "dependencies": { "parse-ms": "^2.1.0" } }, "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q=="], + "promise-limit": ["promise-limit@2.7.0", "", {}, "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quote-unquote": ["quote-unquote@1.0.0", "", {}, "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "requirejs": ["requirejs@2.3.7", "", { "bin": { "r.js": "bin/r.js", "r_js": "bin/r.js" } }, "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw=="], + + "requirejs-config-file": ["requirejs-config-file@4.0.0", "", { "dependencies": { "esprima": "^4.0.0", "stringify-object": "^3.2.1" } }, "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-dependency-path": ["resolve-dependency-path@4.0.1", "", {}, "sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + "rollup": ["rollup@4.41.1", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.41.1", "@rollup/rollup-android-arm64": "4.41.1", "@rollup/rollup-darwin-arm64": "4.41.1", "@rollup/rollup-darwin-x64": "4.41.1", "@rollup/rollup-freebsd-arm64": "4.41.1", "@rollup/rollup-freebsd-x64": "4.41.1", "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", "@rollup/rollup-linux-arm-musleabihf": "4.41.1", "@rollup/rollup-linux-arm64-gnu": "4.41.1", "@rollup/rollup-linux-arm64-musl": "4.41.1", "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", "@rollup/rollup-linux-riscv64-gnu": "4.41.1", "@rollup/rollup-linux-riscv64-musl": "4.41.1", "@rollup/rollup-linux-s390x-gnu": "4.41.1", "@rollup/rollup-linux-x64-gnu": "4.41.1", "@rollup/rollup-linux-x64-musl": "4.41.1", "@rollup/rollup-win32-arm64-msvc": "4.41.1", "@rollup/rollup-win32-ia32-msvc": "4.41.1", "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw=="], "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "sass-lookup": ["sass-lookup@6.1.0", "", { "dependencies": { "commander": "^12.1.0", "enhanced-resolve": "^5.18.0" }, "bin": { "sass-lookup": "bin/cli.js" } }, "sha512-Zx+lVyoWqXZxHuYWlTA17Z5sczJ6braNT2C7rmClw+c4E7r/n911Zwss3h1uHI9reR5AgHZyNHF7c2+VIp5AUA=="], + "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -575,6 +800,8 @@ "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], "solid-js": ["solid-js@1.9.7", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", "seroval-plugins": "~1.3.0" } }, "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw=="], @@ -593,8 +820,24 @@ "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + "stream-to-array": ["stream-to-array@2.3.0", "", { "dependencies": { "any-promise": "^1.1.0" } }, "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "stringify-object": ["stringify-object@3.3.0", "", { "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" } }, "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "stylus-lookup": ["stylus-lookup@6.1.0", "", { "dependencies": { "commander": "^12.1.0" }, "bin": { "stylus-lookup": "bin/cli.js" } }, "sha512-5QSwgxAzXPMN+yugy61C60PhoANdItfdjSEZR8siFwz7yL9jTmV0UBKDCfn3K8GkGB4g0Y9py7vTCX8rFu4/pQ=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], "tailwindcss": ["tailwindcss@4.1.8", "", {}, "sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og=="], @@ -619,18 +862,28 @@ "tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], "tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="], "tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "ts-graphviz": ["ts-graphviz@2.1.6", "", { "dependencies": { "@ts-graphviz/adapter": "^2.0.6", "@ts-graphviz/ast": "^2.0.7", "@ts-graphviz/common": "^2.1.5", "@ts-graphviz/core": "^2.0.7" } }, "sha512-XyLVuhBVvdJTJr2FJJV2L1pc4MwSjMhcunRVgDE9k4wbb2ee7ORYnPewxMWUav12vxyfUM686MSGsqnVRIInuw=="], + + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], "validate-html-nesting": ["validate-html-nesting@1.2.2", "", {}, "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg=="], @@ -649,6 +902,10 @@ "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], + "walkdir": ["walkdir@0.4.1", "", {}, "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="], + + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], @@ -661,6 +918,8 @@ "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], @@ -693,15 +952,37 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + "dependency-tree/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "filing-cabinet/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "libsql/detect-libc": ["detect-libc@2.0.2", "", {}, "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "module-lookup-amd/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + "precinct/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "sass-lookup/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "stylus-lookup/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], @@ -765,6 +1046,8 @@ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], diff --git a/drizzle/0000_bitter_wallflower.sql b/drizzle/0000_dark_earthquake.sql similarity index 100% rename from drizzle/0000_bitter_wallflower.sql rename to drizzle/0000_dark_earthquake.sql diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index 2dbf44e..6d733f6 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "10c6b36e-5eb7-4ecf-ad47-a0fe883a8ade", + "id": "371fbe16-12a2-4f5d-ae54-cd465106824b", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "cells": { diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 4ebb985..3527ef7 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "6", - "when": 1749396093238, - "tag": "0000_bitter_wallflower", + "when": 1749995282393, + "tag": "0000_dark_earthquake", "breakpoints": true } ] diff --git a/index.html b/index.html index 7021737..a174b88 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,16 @@ - + - - - - - Vite + Solid + TS - - -
- - + + + + + Reactive SQLite Demo + + +
+ + diff --git a/local.db b/local.db index 0189e4a..b2209d2 100644 Binary files a/local.db and b/local.db differ diff --git a/package.json b/package.json index 76e9e9a..64a556d 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,14 @@ "@solid-primitives/scheduled": "^1.5.1", "@solid-primitives/storage": "^4.3.2", "@solid-primitives/virtual": "^0.2.1", + "@solid-primitives/websocket": "^1.3.1", "@solidjs/router": "^0.15.3", "@sqlite.org/sqlite-wasm": "^3.49.2-build1", "@tailwindcss/vite": "^4.1.8", "comlink": "^4.4.2", "drizzle-orm": "^0.44.1", + "ky": "^1.8.1", + "madge": "^8.0.0", "solid-js": "^1.9.5", "sqlite-parser": "^1.0.1", "tailwindcss": "^4.1.8", diff --git a/src/components/ChangeLog.tsx b/src/components/ChangeLog.tsx index 5ad25e1..ea7fc31 100644 --- a/src/components/ChangeLog.tsx +++ b/src/components/ChangeLog.tsx @@ -1,5 +1,3 @@ -'use client' - import { createVirtualList } from '@solid-primitives/virtual' import { sql } from 'drizzle-orm' import { createSignal, For, onMount, Show, type Component } from 'solid-js' diff --git a/src/components/Data.tsx b/src/components/Data.tsx index 2833601..6ce529e 100644 --- a/src/components/Data.tsx +++ b/src/components/Data.tsx @@ -140,7 +140,7 @@ export const Data = () => {

{post.title}

{post.body}

- Author ID: {post.authorId} | Post ID: {post.id} + Author ID: {post.author_id} | Post ID: {post.id}

)} diff --git a/src/components/GameOfLifeCanvas.tsx b/src/components/GameOfLifeCanvas.tsx index 0c1c7a6..548e2b9 100644 --- a/src/components/GameOfLifeCanvas.tsx +++ b/src/components/GameOfLifeCanvas.tsx @@ -1,5 +1,3 @@ -'use client' - import { and, eq, sql } from 'drizzle-orm' import { createEffect, @@ -17,14 +15,14 @@ import Button from './ui/Button' import { isDarkMode } from '../routes/Home' export function GameOfLifeCanvas() { - const gridSize = { width: 42, height: 5 } + const gridSize = { width: 50, height: 10 } + const cellSize = 20 const [cells, lastChanges, loading] = useCells({ ...gridSize }) const { db } = useDb() const [running, setRunning] = createSignal(false) let timeoutId: ReturnType let canvasRef!: HTMLCanvasElement - const cellSize = 20 const aliveColor = createMemo(() => isDarkMode() ? 'rgb(219, 39, 119)' : 'rgb(236, 72, 153)' ) @@ -74,7 +72,7 @@ export function GameOfLifeCanvas() { } } await database.batch(updates) - timeoutId = setTimeout(runLoop, 300) + timeoutId = setTimeout(runLoop, 1) } function runLoop() { @@ -217,14 +215,14 @@ export function GameOfLifeCanvas() { diff --git a/src/components/Users/AddUser.tsx b/src/components/Users/AddUser.tsx index 0450178..e25ff04 100644 --- a/src/components/Users/AddUser.tsx +++ b/src/components/Users/AddUser.tsx @@ -1,5 +1,3 @@ -'use client' - import { createSignal, type Component } from 'solid-js' import Button from '../ui/Button' diff --git a/src/components/Users/ManageUsers.tsx b/src/components/Users/ManageUsers.tsx index 41292de..38554c3 100644 --- a/src/components/Users/ManageUsers.tsx +++ b/src/components/Users/ManageUsers.tsx @@ -35,14 +35,15 @@ export const ManageUsers: Component = () => { setError(null) setSuccess(null) try { - await (await db).insert(schema.users).values({ + const database = await db + await database.insert(schema.users).values({ name: name.trim(), email: email.trim(), bio: bio.trim(), location: location.trim(), picture: getRandomRobot(users.length + 1), - isActive: true, - createdAt: new Date().toISOString() + is_active: true, + created_at: new Date().toISOString() }) setSuccess('User added successfully.') diff --git a/src/components/Users/UserTable.tsx b/src/components/Users/UserTable.tsx index acc8e60..df3432a 100644 --- a/src/components/Users/UserTable.tsx +++ b/src/components/Users/UserTable.tsx @@ -1,5 +1,3 @@ -'use client' - import { eq } from 'drizzle-orm' import { createSignal, For, type Component } from 'solid-js' import { useDb } from '../../context/DbProvider' @@ -300,12 +298,12 @@ export const UsersTable: Component<{ - {user.isActive ? 'Active' : 'Inactive'} + {user.is_active ? 'Active' : 'Inactive'} diff --git a/src/consts/defaultCells.ts b/src/consts/defaultCells.ts deleted file mode 100644 index fe17307..0000000 --- a/src/consts/defaultCells.ts +++ /dev/null @@ -1,1294 +0,0 @@ -export const defaultCells = [ - { - x: 0, - y: 0, - alive: false - }, - { - x: 0, - y: 1, - alive: false - }, - { - x: 0, - y: 2, - alive: false - }, - { - x: 0, - y: 3, - alive: false - }, - { - x: 0, - y: 4, - alive: false - }, - { - x: 1, - y: 0, - alive: false - }, - { - x: 1, - y: 1, - alive: false - }, - { - x: 1, - y: 2, - alive: true - }, - { - x: 1, - y: 3, - alive: false - }, - { - x: 1, - y: 4, - alive: false - }, - { - x: 2, - y: 0, - alive: false - }, - { - x: 2, - y: 1, - alive: false - }, - { - x: 2, - y: 2, - alive: true - }, - { - x: 2, - y: 3, - alive: false - }, - { - x: 2, - y: 4, - alive: false - }, - { - x: 3, - y: 0, - alive: false - }, - { - x: 3, - y: 1, - alive: false - }, - { - x: 3, - y: 2, - alive: true - }, - { - x: 3, - y: 3, - alive: false - }, - { - x: 3, - y: 4, - alive: false - }, - { - x: 4, - y: 0, - alive: false - }, - { - x: 4, - y: 1, - alive: false - }, - { - x: 4, - y: 2, - alive: false - }, - { - x: 4, - y: 3, - alive: false - }, - { - x: 4, - y: 4, - alive: false - }, - { - x: 5, - y: 0, - alive: false - }, - { - x: 5, - y: 1, - alive: false - }, - { - x: 5, - y: 2, - alive: true - }, - { - x: 5, - y: 3, - alive: false - }, - { - x: 5, - y: 4, - alive: false - }, - { - x: 6, - y: 0, - alive: false - }, - { - x: 6, - y: 1, - alive: false - }, - { - x: 6, - y: 2, - alive: true - }, - { - x: 6, - y: 3, - alive: false - }, - { - x: 6, - y: 4, - alive: false - }, - { - x: 7, - y: 0, - alive: false - }, - { - x: 7, - y: 1, - alive: false - }, - { - x: 7, - y: 2, - alive: true - }, - { - x: 7, - y: 3, - alive: false - }, - { - x: 7, - y: 4, - alive: false - }, - { - x: 8, - y: 0, - alive: false - }, - { - x: 8, - y: 1, - alive: false - }, - { - x: 8, - y: 2, - alive: false - }, - { - x: 8, - y: 3, - alive: false - }, - { - x: 8, - y: 4, - alive: false - }, - { - x: 9, - y: 0, - alive: false - }, - { - x: 9, - y: 1, - alive: false - }, - { - x: 9, - y: 2, - alive: true - }, - { - x: 9, - y: 3, - alive: false - }, - { - x: 9, - y: 4, - alive: false - }, - { - x: 10, - y: 0, - alive: false - }, - { - x: 10, - y: 1, - alive: false - }, - { - x: 10, - y: 2, - alive: true - }, - { - x: 10, - y: 3, - alive: false - }, - { - x: 10, - y: 4, - alive: false - }, - { - x: 11, - y: 0, - alive: false - }, - { - x: 11, - y: 1, - alive: false - }, - { - x: 11, - y: 2, - alive: true - }, - { - x: 11, - y: 3, - alive: false - }, - { - x: 11, - y: 4, - alive: false - }, - { - x: 12, - y: 0, - alive: false - }, - { - x: 12, - y: 1, - alive: false - }, - { - x: 12, - y: 2, - alive: false - }, - { - x: 12, - y: 3, - alive: false - }, - { - x: 12, - y: 4, - alive: false - }, - { - x: 13, - y: 0, - alive: false - }, - { - x: 13, - y: 1, - alive: false - }, - { - x: 13, - y: 2, - alive: true - }, - { - x: 13, - y: 3, - alive: false - }, - { - x: 13, - y: 4, - alive: false - }, - { - x: 14, - y: 0, - alive: false - }, - { - x: 14, - y: 1, - alive: false - }, - { - x: 14, - y: 2, - alive: true - }, - { - x: 14, - y: 3, - alive: false - }, - { - x: 14, - y: 4, - alive: false - }, - { - x: 15, - y: 0, - alive: false - }, - { - x: 15, - y: 1, - alive: false - }, - { - x: 15, - y: 2, - alive: true - }, - { - x: 15, - y: 3, - alive: false - }, - { - x: 15, - y: 4, - alive: false - }, - { - x: 16, - y: 0, - alive: false - }, - { - x: 16, - y: 1, - alive: false - }, - { - x: 16, - y: 2, - alive: false - }, - { - x: 16, - y: 3, - alive: false - }, - { - x: 16, - y: 4, - alive: false - }, - { - x: 17, - y: 0, - alive: false - }, - { - x: 17, - y: 1, - alive: false - }, - { - x: 17, - y: 2, - alive: true - }, - { - x: 17, - y: 3, - alive: false - }, - { - x: 17, - y: 4, - alive: false - }, - { - x: 18, - y: 0, - alive: false - }, - { - x: 18, - y: 1, - alive: false - }, - { - x: 18, - y: 2, - alive: true - }, - { - x: 18, - y: 3, - alive: false - }, - { - x: 18, - y: 4, - alive: false - }, - { - x: 19, - y: 0, - alive: false - }, - { - x: 19, - y: 1, - alive: false - }, - { - x: 19, - y: 2, - alive: true - }, - { - x: 19, - y: 3, - alive: false - }, - { - x: 19, - y: 4, - alive: false - }, - { - x: 20, - y: 0, - alive: false - }, - { - x: 20, - y: 1, - alive: false - }, - { - x: 20, - y: 2, - alive: false - }, - { - x: 20, - y: 3, - alive: false - }, - { - x: 20, - y: 4, - alive: false - }, - { - x: 21, - y: 0, - alive: false - }, - { - x: 21, - y: 1, - alive: false - }, - { - x: 21, - y: 2, - alive: true - }, - { - x: 21, - y: 3, - alive: false - }, - { - x: 21, - y: 4, - alive: false - }, - { - x: 22, - y: 0, - alive: false - }, - { - x: 22, - y: 1, - alive: false - }, - { - x: 22, - y: 2, - alive: true - }, - { - x: 22, - y: 3, - alive: false - }, - { - x: 22, - y: 4, - alive: false - }, - { - x: 23, - y: 0, - alive: false - }, - { - x: 23, - y: 1, - alive: false - }, - { - x: 23, - y: 2, - alive: true - }, - { - x: 23, - y: 3, - alive: false - }, - { - x: 23, - y: 4, - alive: false - }, - { - x: 24, - y: 0, - alive: false - }, - { - x: 24, - y: 1, - alive: false - }, - { - x: 24, - y: 2, - alive: false - }, - { - x: 24, - y: 3, - alive: false - }, - { - x: 24, - y: 4, - alive: false - }, - { - x: 25, - y: 0, - alive: false - }, - { - x: 25, - y: 1, - alive: false - }, - { - x: 25, - y: 2, - alive: true - }, - { - x: 25, - y: 3, - alive: false - }, - { - x: 25, - y: 4, - alive: false - }, - { - x: 26, - y: 0, - alive: false - }, - { - x: 26, - y: 1, - alive: false - }, - { - x: 26, - y: 2, - alive: true - }, - { - x: 26, - y: 3, - alive: false - }, - { - x: 26, - y: 4, - alive: false - }, - { - x: 27, - y: 0, - alive: false - }, - { - x: 27, - y: 1, - alive: false - }, - { - x: 27, - y: 2, - alive: true - }, - { - x: 27, - y: 3, - alive: false - }, - { - x: 27, - y: 4, - alive: false - }, - { - x: 28, - y: 0, - alive: false - }, - { - x: 28, - y: 1, - alive: false - }, - { - x: 28, - y: 2, - alive: false - }, - { - x: 28, - y: 3, - alive: false - }, - { - x: 28, - y: 4, - alive: false - }, - { - x: 29, - y: 0, - alive: false - }, - { - x: 29, - y: 1, - alive: false - }, - { - x: 29, - y: 2, - alive: true - }, - { - x: 29, - y: 3, - alive: false - }, - { - x: 29, - y: 4, - alive: false - }, - { - x: 30, - y: 0, - alive: false - }, - { - x: 30, - y: 1, - alive: false - }, - { - x: 30, - y: 2, - alive: true - }, - { - x: 30, - y: 3, - alive: false - }, - { - x: 30, - y: 4, - alive: false - }, - { - x: 31, - y: 0, - alive: false - }, - { - x: 31, - y: 1, - alive: false - }, - { - x: 31, - y: 2, - alive: true - }, - { - x: 31, - y: 3, - alive: false - }, - { - x: 31, - y: 4, - alive: false - }, - { - x: 32, - y: 0, - alive: false - }, - { - x: 32, - y: 1, - alive: false - }, - { - x: 32, - y: 2, - alive: false - }, - { - x: 32, - y: 3, - alive: false - }, - { - x: 32, - y: 4, - alive: false - }, - { - x: 33, - y: 0, - alive: false - }, - { - x: 33, - y: 1, - alive: false - }, - { - x: 33, - y: 2, - alive: true - }, - { - x: 33, - y: 3, - alive: false - }, - { - x: 33, - y: 4, - alive: false - }, - { - x: 34, - y: 0, - alive: false - }, - { - x: 34, - y: 1, - alive: false - }, - { - x: 34, - y: 2, - alive: true - }, - { - x: 34, - y: 3, - alive: false - }, - { - x: 34, - y: 4, - alive: false - }, - { - x: 35, - y: 0, - alive: false - }, - { - x: 35, - y: 1, - alive: false - }, - { - x: 35, - y: 2, - alive: true - }, - { - x: 35, - y: 3, - alive: false - }, - { - x: 35, - y: 4, - alive: false - }, - { - x: 36, - y: 0, - alive: false - }, - { - x: 36, - y: 1, - alive: false - }, - { - x: 36, - y: 2, - alive: false - }, - { - x: 36, - y: 3, - alive: false - }, - { - x: 36, - y: 4, - alive: false - }, - { - x: 37, - y: 0, - alive: false - }, - { - x: 37, - y: 1, - alive: false - }, - { - x: 37, - y: 2, - alive: true - }, - { - x: 37, - y: 3, - alive: false - }, - { - x: 37, - y: 4, - alive: false - }, - { - x: 38, - y: 0, - alive: false - }, - { - x: 38, - y: 1, - alive: false - }, - { - x: 38, - y: 2, - alive: true - }, - { - x: 38, - y: 3, - alive: false - }, - { - x: 38, - y: 4, - alive: false - }, - { - x: 39, - y: 0, - alive: false - }, - { - x: 39, - y: 1, - alive: false - }, - { - x: 39, - y: 2, - alive: true - }, - { - x: 39, - y: 3, - alive: false - }, - { - x: 39, - y: 4, - alive: false - }, - { - x: 40, - y: 0, - alive: false - }, - { - x: 40, - y: 1, - alive: false - }, - { - x: 40, - y: 2, - alive: false - }, - { - x: 40, - y: 3, - alive: false - }, - { - x: 40, - y: 4, - alive: false - }, - { - x: 41, - y: 0, - alive: false - }, - { - x: 41, - y: 1, - alive: false - }, - { - x: 41, - y: 2, - alive: true - }, - { - x: 41, - y: 3, - alive: false - }, - { - x: 41, - y: 4, - alive: false - }, - { - x: 42, - y: 0, - alive: false - }, - { - x: 42, - y: 1, - alive: false - }, - { - x: 42, - y: 2, - alive: true - }, - { - x: 42, - y: 3, - alive: false - }, - { - x: 42, - y: 4, - alive: false - }, - { - x: 43, - y: 0, - alive: false - }, - { - x: 43, - y: 1, - alive: false - }, - { - x: 43, - y: 2, - alive: true - }, - { - x: 43, - y: 3, - alive: false - }, - { - x: 43, - y: 4, - alive: false - }, - { - x: 44, - y: 0, - alive: false - }, - { - x: 44, - y: 1, - alive: false - }, - { - x: 44, - y: 2, - alive: false - }, - { - x: 44, - y: 3, - alive: false - }, - { - x: 44, - y: 4, - alive: false - } -] -export const defaultAlive = [ - { - x: 1, - y: 2, - alive: true - }, - { - x: 2, - y: 2, - alive: true - }, - { - x: 3, - y: 2, - alive: true - }, - { - x: 5, - y: 2, - alive: true - }, - { - x: 6, - y: 2, - alive: true - }, - { - x: 7, - y: 2, - alive: true - }, - { - x: 9, - y: 2, - alive: true - }, - { - x: 10, - y: 2, - alive: true - }, - { - x: 11, - y: 2, - alive: true - }, - { - x: 13, - y: 2, - alive: true - }, - { - x: 14, - y: 2, - alive: true - }, - { - x: 15, - y: 2, - alive: true - }, - { - x: 17, - y: 2, - alive: true - }, - { - x: 18, - y: 2, - alive: true - }, - { - x: 19, - y: 2, - alive: true - }, - { - x: 21, - y: 2, - alive: true - }, - { - x: 22, - y: 2, - alive: true - }, - { - x: 23, - y: 2, - alive: true - }, - { - x: 25, - y: 2, - alive: true - }, - { - x: 26, - y: 2, - alive: true - }, - { - x: 27, - y: 2, - alive: true - }, - { - x: 29, - y: 2, - alive: true - }, - { - x: 30, - y: 2, - alive: true - }, - { - x: 31, - y: 2, - alive: true - }, - { - x: 33, - y: 2, - alive: true - }, - { - x: 34, - y: 2, - alive: true - }, - { - x: 35, - y: 2, - alive: true - }, - { - x: 37, - y: 2, - alive: true - }, - { - x: 38, - y: 2, - alive: true - }, - { - x: 39, - y: 2, - alive: true - }, - { - x: 41, - y: 2, - alive: true - }, - { - x: 42, - y: 2, - alive: true - }, - { - x: 43, - y: 2, - alive: true - } -] diff --git a/src/consts/demoData.ts b/src/consts/demoData.ts index d2477e6..0672c3e 100644 --- a/src/consts/demoData.ts +++ b/src/consts/demoData.ts @@ -8,7 +8,7 @@ interface DemoUser { picture?: string bio?: string location?: string - isActive?: boolean + is_active?: boolean } interface DemoPost { @@ -113,7 +113,7 @@ export async function seedDemoData(db: SqliteRemoteDatabase) { picture: getRandomRobot(demoUsers.indexOf(u) + 1), bio: u.bio, location: u.location, - isActive: Math.random() < 0.5 + is_active: Math.random() < 0.5 })) ) .onConflictDoNothing() @@ -125,12 +125,12 @@ export async function seedDemoData(db: SqliteRemoteDatabase) { }) const postsToInsert = demoPosts.map(p => { - const authorId = emailToIdMap[p.authorEmail] - if (!authorId) { + const author_id = emailToIdMap[p.authorEmail] + if (author_id === undefined) { throw new Error(`No user found for email ${p.authorEmail}`) } return { - authorId, + author_id, title: p.title, body: p.body } diff --git a/src/consts/migrations-data.ts b/src/consts/migrations-data.ts deleted file mode 100644 index 9d3f3ac..0000000 --- a/src/consts/migrations-data.ts +++ /dev/null @@ -1,130 +0,0 @@ -export interface MigrationStatement { - version: number - id: string - sql: string[] -} - -export const migrationStatements: MigrationStatement[] = [ - { - "version": 0, - "id": "parallel_silhouette", - "sql": [ - "CREATE TABLE `migrations` (\n\t`name` text PRIMARY KEY NOT NULL,\n\t`applied_at` text DEFAULT (current_timestamp) NOT NULL\n);", - "CREATE TABLE `posts` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`author_id` integer NOT NULL,\n\t`title` text NOT NULL,\n\t`body` text NOT NULL,\n\t`created_at` text DEFAULT 'CURRENT_TIMESTAMP' NOT NULL,\n\t`updated_at` text DEFAULT 'CURRENT_TIMESTAMP' NOT NULL,\n\tFOREIGN KEY (`author_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade\n);", - "CREATE TABLE `users` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL,\n\t`picture` text,\n\t`bio` text,\n\t`location` text,\n\t`created_at` text DEFAULT 'CURRENT_TIMESTAMP' NOT NULL,\n\t`is_active` integer DEFAULT true\n);", - "CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);" - ] - }, - { - "version": 1, - "id": "misty_thing", - "sql": [ - "CREATE TABLE `change_log` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`tbl_name` text NOT NULL,\n\t`op_type` text NOT NULL,\n\t`pk_json` text NOT NULL,\n\t`changed_at` text DEFAULT (current_timestamp) NOT NULL\n);" - ] - }, - { - "version": 2, - "id": "brave_deathbird", - "sql": [ - "ALTER TABLE `change_log` ADD `row_json` text NOT NULL;" - ] - }, - { - "version": 3, - "id": "brainy_unus", - "sql": [ - "PRAGMA foreign_keys=OFF;", - "CREATE TABLE `__new_posts` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`author_id` integer NOT NULL,\n\t`title` text NOT NULL,\n\t`body` text NOT NULL,\n\t`created_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL,\n\t`updated_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL,\n\tFOREIGN KEY (`author_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade\n);", - "INSERT INTO `__new_posts`(\"id\", \"author_id\", \"title\", \"body\", \"created_at\", \"updated_at\") SELECT \"id\", \"author_id\", \"title\", \"body\", \"created_at\", \"updated_at\" FROM `posts`;", - "DROP TABLE `posts`;", - "ALTER TABLE `__new_posts` RENAME TO `posts`;", - "PRAGMA foreign_keys=ON;", - "CREATE TABLE `__new_users` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL,\n\t`picture` text,\n\t`bio` text,\n\t`location` text,\n\t`created_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL,\n\t`is_active` integer DEFAULT true\n);", - "INSERT INTO `__new_users`(\"id\", \"name\", \"email\", \"picture\", \"bio\", \"location\", \"created_at\", \"is_active\") SELECT \"id\", \"name\", \"email\", \"picture\", \"bio\", \"location\", \"created_at\", \"is_active\" FROM `users`;", - "DROP TABLE `users`;", - "ALTER TABLE `__new_users` RENAME TO `users`;", - "CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);" - ] - }, - { - "version": 4, - "id": "eager_boomerang", - "sql": [ - "PRAGMA foreign_keys=OFF;", - "CREATE TABLE `__new_change_log` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`tbl_name` text NOT NULL,\n\t`op_type` text NOT NULL,\n\t`pk_json` text NOT NULL,\n\t`row_json` text NOT NULL,\n\t`changed_at` text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) NOT NULL\n);", - "INSERT INTO `__new_change_log`(\"id\", \"tbl_name\", \"op_type\", \"pk_json\", \"row_json\", \"changed_at\") SELECT \"id\", \"tbl_name\", \"op_type\", \"pk_json\", \"row_json\", \"changed_at\" FROM `change_log`;", - "DROP TABLE `change_log`;", - "ALTER TABLE `__new_change_log` RENAME TO `change_log`;", - "PRAGMA foreign_keys=ON;" - ] - }, - { - "version": 5, - "id": "handy_morph", - "sql": [ - "CREATE TABLE `cells` (\n\t`x` integer,\n\t`y` integer,\n\t`alive` integer DEFAULT false,\n\tPRIMARY KEY(`x`, `y`)\n);" - ] - }, - { - "version": 6, - "id": "condemned_selene", - "sql": [ - "PRAGMA foreign_keys=OFF;", - "CREATE TABLE `__new_cells` (\n\t`x` integer NOT NULL,\n\t`y` integer NOT NULL,\n\t`alive` integer DEFAULT false NOT NULL,\n\tPRIMARY KEY(`x`, `y`)\n);", - "INSERT INTO `__new_cells`(\"x\", \"y\", \"alive\") SELECT \"x\", \"y\", \"alive\" FROM `cells`;", - "DROP TABLE `cells`;", - "ALTER TABLE `__new_cells` RENAME TO `cells`;", - "PRAGMA foreign_keys=ON;" - ] - }, - { - "version": 7, - "id": "military_retro_girl", - "sql": [ - "PRAGMA foreign_keys=OFF;", - "CREATE TABLE `__new_change_log` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`tbl_name` text NOT NULL,\n\t`op_type` text NOT NULL,\n\t`pk_json` text NOT NULL,\n\t`row_json` text NOT NULL,\n\t`changed_at` text\n);", - "INSERT INTO `__new_change_log`(\"id\", \"tbl_name\", \"op_type\", \"pk_json\", \"row_json\", \"changed_at\") SELECT \"id\", \"tbl_name\", \"op_type\", \"pk_json\", \"row_json\", \"changed_at\" FROM `change_log`;", - "DROP TABLE `change_log`;", - "ALTER TABLE `__new_change_log` RENAME TO `change_log`;", - "PRAGMA foreign_keys=ON;", - "CREATE TABLE `__new_migrations` (\n\t`name` text PRIMARY KEY NOT NULL,\n\t`applied_at` text\n);", - "INSERT INTO `__new_migrations`(\"name\", \"applied_at\") SELECT \"name\", \"applied_at\" FROM `migrations`;", - "DROP TABLE `migrations`;", - "ALTER TABLE `__new_migrations` RENAME TO `migrations`;", - "CREATE TABLE `__new_posts` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`author_id` integer NOT NULL,\n\t`title` text NOT NULL,\n\t`body` text NOT NULL,\n\t`created_at` text,\n\t`updated_at` text,\n\tFOREIGN KEY (`author_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade\n);", - "INSERT INTO `__new_posts`(\"id\", \"author_id\", \"title\", \"body\", \"created_at\", \"updated_at\") SELECT \"id\", \"author_id\", \"title\", \"body\", \"created_at\", \"updated_at\" FROM `posts`;", - "DROP TABLE `posts`;", - "ALTER TABLE `__new_posts` RENAME TO `posts`;", - "CREATE TABLE `__new_users` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL,\n\t`picture` text,\n\t`bio` text,\n\t`location` text,\n\t`created_at` text,\n\t`is_active` integer DEFAULT true\n);", - "INSERT INTO `__new_users`(\"id\", \"name\", \"email\", \"picture\", \"bio\", \"location\", \"created_at\", \"is_active\") SELECT \"id\", \"name\", \"email\", \"picture\", \"bio\", \"location\", \"created_at\", \"is_active\" FROM `users`;", - "DROP TABLE `users`;", - "ALTER TABLE `__new_users` RENAME TO `users`;", - "CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);" - ] - }, - { - "version": 8, - "id": "open_vindicator", - "sql": [ - "PRAGMA foreign_keys=OFF;", - "CREATE TABLE `__new_change_log` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`tbl_name` text NOT NULL,\n\t`op_type` text NOT NULL,\n\t`pk_json` text NOT NULL,\n\t`row_json` text NOT NULL,\n\t`changed_at` text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) NOT NULL\n);", - "INSERT INTO `__new_change_log`(\"id\", \"tbl_name\", \"op_type\", \"pk_json\", \"row_json\", \"changed_at\") SELECT \"id\", \"tbl_name\", \"op_type\", \"pk_json\", \"row_json\", \"changed_at\" FROM `change_log`;", - "DROP TABLE `change_log`;", - "ALTER TABLE `__new_change_log` RENAME TO `change_log`;", - "PRAGMA foreign_keys=ON;", - "CREATE TABLE `__new_migrations` (\n\t`name` text PRIMARY KEY NOT NULL,\n\t`applied_at` text DEFAULT (current_timestamp) NOT NULL\n);", - "INSERT INTO `__new_migrations`(\"name\", \"applied_at\") SELECT \"name\", \"applied_at\" FROM `migrations`;", - "DROP TABLE `migrations`;", - "ALTER TABLE `__new_migrations` RENAME TO `migrations`;", - "CREATE TABLE `__new_posts` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`author_id` integer NOT NULL,\n\t`title` text NOT NULL,\n\t`body` text NOT NULL,\n\t`created_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL,\n\t`updated_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL,\n\tFOREIGN KEY (`author_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade\n);", - "INSERT INTO `__new_posts`(\"id\", \"author_id\", \"title\", \"body\", \"created_at\", \"updated_at\") SELECT \"id\", \"author_id\", \"title\", \"body\", \"created_at\", \"updated_at\" FROM `posts`;", - "DROP TABLE `posts`;", - "ALTER TABLE `__new_posts` RENAME TO `posts`;", - "CREATE TABLE `__new_users` (\n\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t`name` text NOT NULL,\n\t`email` text NOT NULL,\n\t`picture` text,\n\t`bio` text,\n\t`location` text,\n\t`created_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL,\n\t`is_active` integer DEFAULT true\n);", - "INSERT INTO `__new_users`(\"id\", \"name\", \"email\", \"picture\", \"bio\", \"location\", \"created_at\", \"is_active\") SELECT \"id\", \"name\", \"email\", \"picture\", \"bio\", \"location\", \"created_at\", \"is_active\" FROM `users`;", - "DROP TABLE `users`;", - "ALTER TABLE `__new_users` RENAME TO `users`;", - "CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);" - ] - } -] diff --git a/src/hooks/useChangelog.tsx b/src/hooks/useChangelog.tsx index 03469b4..0648162 100644 --- a/src/hooks/useChangelog.tsx +++ b/src/hooks/useChangelog.tsx @@ -8,9 +8,10 @@ import { desc } from 'drizzle-orm' export const useChangelog = () => { const { api, db } = useDb() const logs = createMutable([]) - const N = 1000 + let unsubscribe: (() => void) | undefined + onMount(async () => { const database = await db @@ -23,19 +24,19 @@ export const useChangelog = () => { logs.splice(0, logs.length, ...recent) - const unsubscribe = await api.subscribeToChangeLog( + unsubscribe = await api.subscribeToChangeLog( Comlink.proxy((incoming: ChangeLog[]) => { const toAdd = incoming.length > N ? incoming.slice(-N) : incoming - batch(() => { logs.unshift(...toAdd.reverse()) - if (logs.length > N) logs.splice(N) }) }) ) + }) - onCleanup(unsubscribe) + onCleanup(() => { + unsubscribe?.() }) return logs diff --git a/src/hooks/useLiveUsers.ts b/src/hooks/useLiveUsers.ts index 590206e..11a070b 100644 --- a/src/hooks/useLiveUsers.ts +++ b/src/hooks/useLiveUsers.ts @@ -1,22 +1,23 @@ import * as Comlink from 'comlink' -import { createEffect, on, onMount } from 'solid-js' +import { createEffect, onCleanup, onMount } from 'solid-js' import { createStore, produce, reconcile } from 'solid-js/store' import { seedDemoData } from '../consts/demoData' import { useDb } from '../context/DbProvider' import type { User } from '../sqlite/schema' import * as schema from '../sqlite/schema' -import { trackDeep } from '@solid-primitives/deep' export const useUsers = () => { const { db, api } = useDb() const [users, setUsers] = createStore([]) + let unsubscribe: (() => void) | undefined + onMount(async () => { const database = await db const initialUsers = await database.select().from(schema.users).all() setUsers(initialUsers) - api.subscribeToTable( + unsubscribe = await api.subscribeToTable( 'users', Comlink.proxy(changes => { for (const change of changes) { @@ -48,17 +49,17 @@ export const useUsers = () => { ) }) - api.clientReady.then(() => { - createEffect(async () => { - if (users.length === 0) { - const database = await db - await seedDemoData(database) - const initialUsers = await database.select().from(schema.users).all() + createEffect(async () => { + if (users.length === 0) { + const database = await db + await seedDemoData(database) + const initialUsers = await database.select().from(schema.users).all() - setUsers(initialUsers) - } - }) + setUsers(initialUsers) + } + }) + onCleanup(() => { + unsubscribe?.() }) - return users } diff --git a/src/routes/Home.tsx b/src/routes/Home.tsx index f2d1944..1167f7c 100644 --- a/src/routes/Home.tsx +++ b/src/routes/Home.tsx @@ -1,16 +1,16 @@ -'use client' - +import { makePersisted } from '@solid-primitives/storage' import { type Component, createEffect, createSignal, + onMount, type Signal } from 'solid-js' -import { GameOfLifeCanvas } from '../components/GameOfLifeCanvas' import { ChangeLogTable } from '../components/ChangeLog' +import { GameOfLifeCanvas } from '../components/GameOfLifeCanvas' import { ManageUsers } from '../components/Users/ManageUsers' import { MoonIcon, SunIcon } from '../components/icons/ThemeIcons' -import { makePersisted } from '@solid-primitives/storage' +import { useDb } from '../context/DbProvider' export const [isDarkMode, setIsDarkMode] = makePersisted( createSignal(window.matchMedia('(prefers-color-scheme: dark)').matches) ) @@ -18,11 +18,26 @@ const Home: Component = () => { createEffect(() => { document.documentElement.classList.toggle('dark', isDarkMode()) }) - + const { api, db } = useDb() const toggleDarkMode = () => { setIsDarkMode(prev => !prev) } + onMount(async () => { + // const database = await db + // await setupWebsocket(database) + // const sendToServer = async (incoming: ChangeLog[]) => { + // const res = await ky + // .post('http://localhost:3000/', { + // timeout: 10_000, + // json: incoming + // }) + // .json() + // console.log(res) + // } + // const onChange = createBatchFlusher(sendToServer, 500) + // await api.subscribeToChangeLog(Comlink.proxy(onChange)) + }) return (
diff --git a/src/sqlite/client.ts b/src/sqlite/client.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/sqlite/index.ts b/src/sqlite/index.ts index 87abfbc..6f28df4 100644 --- a/src/sqlite/index.ts +++ b/src/sqlite/index.ts @@ -1,8 +1,7 @@ import sqlite3InitModule, { Database, type SAHPoolUtil, - type Sqlite3Static, - type WasmPointer + type Sqlite3Static } from '@libsql/libsql-wasm-experimental' import * as Comlink from 'comlink' import { desc, gt } from 'drizzle-orm' @@ -33,6 +32,7 @@ const subscribers = new Map< const changeLogSubscribers = new Set() let logCursor = 0 const path = 'file:local.db' + const initClient = async () => { try { sqlite3 = await sqlite3InitModule({}) @@ -40,8 +40,8 @@ const initClient = async () => { name: path, initialCapacity: 10 }) + await poolUtil.wipeFiles() ;[client, db] = createClient({ url: path, poolUtil }, sqlite3) - await client.execute(`PRAGMA foreign_keys = ON;`) await runMigrations(client) @@ -242,7 +242,7 @@ const opCounts: Record<'INSERT' | 'UPDATE' | 'DELETE', number> = { } let lastWindow = performance.now() -const windowSize = 1000 // ms +const windowSize = 1000 const notifyChangeLogSubscribers = (changes: schema.ChangeLog[]) => { for (const { op_type } of changes) { @@ -274,43 +274,13 @@ const notifyChangeLogSubscribers = (changes: schema.ChangeLog[]) => { } } -const changeLogQueue: schema.ChangeLog[] = [] -let flushTimer: ReturnType | null = null -const FLUSH_DELAY_MS = 10 - -function flushChangeLogs() { - const batch = changeLogQueue.splice(0, changeLogQueue.length) - if (batch.length === 0) return - - notifyChangeLogSubscribers(batch) - dispatchChangeNotificationBatched(batch) -} - -const notifyBuffered = () => { +const notifyBatched = () => { const { rows } = getNewChangeLogsSync(logCursor) if (rows.length === 0) return log( `Worker: Fetched ${rows.length} change logs since last cursor ${logCursor}` ) - changeLogQueue.push(...rows) - const lastLog = rows[rows.length] - logCursor = rows[0].id - if (!flushTimer) { - flushTimer = setTimeout(() => { - flushChangeLogs() - flushTimer = null - }, FLUSH_DELAY_MS) - } -} - -const notifyBatched = () => { - const { rows } = getNewChangeLogsSync(logCursor) - if (rows.length === 0) return - // log( - // `Worker: Fetched ${rows.length} change logs since last cursor ${logCursor}` - // ) - logCursor = rows[0].id notifyChangeLogSubscribers(rows) dispatchChangeNotificationBatched(rows) @@ -328,81 +298,16 @@ const notify = () => { } } -const setupChangeNotificationSystem = (sqlite3: Sqlite3Static) => { - const changeLogBuffer: Array<{ - operation: 'INSERT' | 'UPDATE' | 'DELETE' - dbName: string - tableName: string - rowid: string - }> = [] - - const OpNames: Record = { - 9: 'DELETE', - 18: 'INSERT', - 23: 'UPDATE' - } - - sqlite3.capi.sqlite3_update_hook( - db.pointer! as WasmPointer, - ( - _userCtx: number, - op: 9 | 18 | 23, - dbName: string, - tableName: string, - rowid: BigInt - ) => { - changeLogBuffer.push({ - operation: OpNames[op], - dbName, - tableName, - rowid: rowid.toString() - }) - }, - 0 as WasmPointer - ) - - sqlite3.capi.sqlite3_commit_hook( - db.pointer! as WasmPointer, - (_cbArg: WasmPointer) => { - if (changeLogBuffer.length === 0) { - log('No changes in transaction buffer') - } else { - for (const rec of changeLogBuffer) { - log( - `→ ${rec.operation} on ${rec.dbName}.${ - rec.tableName - } (rowid=${rec.rowid.toString()})` - ) - } - - const { rows } = getNewChangeLogsSync(logCursor) - log( - `Worker: Fetched ${rows.length} change logs since last cursor ${logCursor}` - ) - if (rows.length === 0) return 0 - notifyChangeLogSubscribers(rows) - logCursor = rows[0].id - for (const rec of rows) { - dispatchChangeNotification(rec) - } - } - - changeLogBuffer.length = 0 - return 0 - }, - 0 as WasmPointer - ) -} - const onClientReady = async () => { log('Worker: Client is ready!') - + const all = await drizzleClient + .select({ id: schema.changeLog.id }) + .from(schema.changeLog) const [row] = await drizzleClient .select({ id: schema.changeLog.id }) .from(schema.changeLog) .orderBy(desc(schema.changeLog.id)) .limit(1) - logCursor = row ? row.id - 1000 : 0 const { rows } = await getNewChangeLogs(logCursor) notifyChangeLogSubscribers(rows) @@ -457,7 +362,6 @@ const getNewChangeLogsSync = (lastSeenLogId: number) => { ORDER BY id DESC`, [lastSeenLogId] ) - const rows = result.rows as any as schema.ChangeLog[] return { rows } @@ -578,18 +482,11 @@ function logFileSystemSupport() { ] checks.forEach(({ name, supported }) => { - console.log(`${name}: ${supported ? '✅ supported' : '❌ not supported'}`) + log(`${name}: ${supported ? '✅ supported' : '❌ not supported'}`) }) } -// Example usage: - logFileSystemSupport() -// onconnect = function (event) { -// console.log('connect!') -// const port = event.ports[0] - -// } const portApi = { ...api diff --git a/src/sqlite/schema.ts b/src/sqlite/schema.ts index 6c27ef1..532cfe3 100644 --- a/src/sqlite/schema.ts +++ b/src/sqlite/schema.ts @@ -1,4 +1,4 @@ -import { sql, relations } from 'drizzle-orm' +import { relations, sql } from 'drizzle-orm' import { integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core' export const users = sqliteTable('users', { @@ -10,10 +10,10 @@ export const users = sqliteTable('users', { picture: text('picture'), bio: text('bio'), location: text('location'), - createdAt: text('created_at') + created_at: text('created_at') .notNull() .default(sql`(CURRENT_TIMESTAMP)`), - isActive: integer('is_active', { mode: 'boolean' }).default(true) + is_active: integer('is_active', { mode: 'boolean' }).default(true) }) export type User = typeof users.$inferSelect export type NewUser = typeof users.$inferInsert @@ -22,31 +22,47 @@ export const posts = sqliteTable('posts', { id: integer('id', { mode: 'number' }) .primaryKey({ autoIncrement: true }) .notNull(), - authorId: integer('author_id', { mode: 'number' }) + author_id: integer('author_id', { mode: 'number' }) .notNull() .references(() => users.id, { onDelete: 'cascade' }), title: text('title').notNull(), body: text('body').notNull(), - createdAt: text('created_at') + created_at: text('created_at') .notNull() .default(sql`(CURRENT_TIMESTAMP)`), - updatedAt: text('updated_at') + updated_at: text('updated_at') .notNull() .default(sql`(CURRENT_TIMESTAMP)`) }) export type Post = typeof posts.$inferSelect export type NewPost = typeof posts.$inferInsert -// export const usersRelations = relations(users, ({ many }) => ({ -// posts: many(posts) -// })) +export const usersRelations = relations(users, ({ many }) => ({ + posts: many(posts) +})) -// export const postsRelations = relations(posts, ({ one }) => ({ -// author: one(users, { -// fields: [posts.authorId], -// references: [users.id] -// }) -// })) +export const postsRelations = relations(posts, ({ one }) => ({ + author: one(users, { + fields: [posts.author_id], + references: [users.id] + }) +})) + +export const cells = sqliteTable( + 'cells', + { + x: integer('x', { mode: 'number' }).notNull(), + y: integer('y', { mode: 'number' }).notNull(), + alive: integer('alive', { mode: 'boolean' }).default(false).notNull() + }, + table => [primaryKey({ columns: [table.x, table.y] })] +) +export type Cells = typeof cells.$inferSelect +export type NewCells = typeof cells.$inferInsert + +/* + SYSTEM TABLES +*/ export const migrations = sqliteTable('migrations', { name: text('name').notNull().primaryKey(), @@ -57,12 +73,15 @@ export const migrations = sqliteTable('migrations', { export type Migration = typeof migrations.$inferSelect export type NewMigration = typeof migrations.$inferInsert +export const OPERATIONS = ['INSERT', 'DELETE', 'UPDATE'] as const +export type Operation = (typeof OPERATIONS)[number] + export const changeLog = sqliteTable('change_log', { id: integer('id', { mode: 'number' }) .primaryKey({ autoIncrement: true }) .notNull(), tbl_name: text('tbl_name').notNull(), - op_type: text('op_type').notNull(), + op_type: text('op_type', { enum: OPERATIONS }).notNull(), pk_json: text('pk_json').notNull(), row_json: text('row_json').notNull(), changed_at: text('changed_at') @@ -71,13 +90,3 @@ export const changeLog = sqliteTable('change_log', { }) export type ChangeLog = typeof changeLog.$inferSelect export type NewChangeLog = typeof changeLog.$inferInsert - -export const cells = sqliteTable( - 'cells', - { - x: integer('x', { mode: 'number' }).notNull(), - y: integer('y', { mode: 'number' }).notNull(), - alive: integer('alive', { mode: 'boolean' }).default(false).notNull() - }, - table => [primaryKey({ columns: [table.x, table.y] })] -) diff --git a/src/sqlite/triggers.ts b/src/sqlite/triggers.ts index 762fd0c..6982afb 100644 --- a/src/sqlite/triggers.ts +++ b/src/sqlite/triggers.ts @@ -1,15 +1,19 @@ import type { Client } from '@libsql/client' +import { + type SQLiteTable, + type TableConfig, + getTableConfig +} from 'drizzle-orm/sqlite-core' import * as schema from '../sqlite/schema' -import { type SQLiteTable, getTableConfig } from 'drizzle-orm/sqlite-core' -function isSqliteTable(t: any): t is SQLiteTable { +function isSqliteTable(t: any): t is SQLiteTable { return t && typeof t.getSQL === 'function' && Boolean(t.getSQL()) } export async function generateAllTriggers(client: Client) { - const tables = Object.values(schema).filter(isSqliteTable) - + const tables = Object.values(schema) for (const tbl of tables) { + if (!isSqliteTable(tbl)) continue const { name: tblName, columns, primaryKeys } = getTableConfig(tbl) if (tblName === 'change_log') continue diff --git a/src/sqlite/viewDbWorker.ts b/src/sqlite/viewDbWorker.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/sync/cursor.ts b/src/sync/cursor.ts new file mode 100644 index 0000000..126673b --- /dev/null +++ b/src/sync/cursor.ts @@ -0,0 +1,12 @@ +import { desc } from 'drizzle-orm' +import type { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy' +import * as schema from '../sqlite/schema.ts' + +export const getLatestId = async (db: SqliteRemoteDatabase) => { + const res = await db + .select({ id: schema.changeLog.id }) + .from(schema.changeLog) + .orderBy(desc(schema.changeLog.id)) + .limit(1) + return res?.[0]?.id ?? 0 +} diff --git a/src/sync/socket.ts b/src/sync/socket.ts new file mode 100644 index 0000000..c3761d4 --- /dev/null +++ b/src/sync/socket.ts @@ -0,0 +1,29 @@ +import type { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy' +import { getLatestId } from './cursor' +import * as schema from '../sqlite/schema' + +export async function setupWebsocket(db: SqliteRemoteDatabase) { + const ws = new WebSocket('ws://localhost:3000/ws') + + ws.addEventListener('open', async () => { + ws.send(JSON.stringify({ type: 'ping', cursor: await getLatestId(db) })) + }) + + ws.addEventListener('message', async ({ data }) => { + const { type, cursor } = JSON.parse(data) + + if (type === 'pong') { + console.log('Server at', cursor, "I'm at", await getLatestId(db)) + } + + if (type === 'request_data') { + ws.send( + JSON.stringify({ + type: 'data', + cursor: await getLatestId(db), + payload: {} + }) + ) + } + }) +} diff --git a/src/utils/createBatchFlusher.tsx b/src/utils/createBatchFlusher.tsx new file mode 100644 index 0000000..cefd3fc --- /dev/null +++ b/src/utils/createBatchFlusher.tsx @@ -0,0 +1,67 @@ +export function createBatchFlusher( + sendFn: (items: T[]) => Promise, + maxDelay = 5000 +): (items: T[]) => void { + let buffer: T[] = [] + let timer: ReturnType | null = null + let inFlight = false + let pending = false + + async function flush() { + if (inFlight) { + pending = true + return + } + + if (buffer.length === 0) { + timer = null + return + } + + inFlight = true + const itemsToSend = buffer + buffer = [] + timer = null + + try { + await sendFn(itemsToSend) + } catch (error) { + console.error('Batch flush failed, retrying:', error) + + buffer = itemsToSend.concat(buffer) + if (!timer) timer = setTimeout(flush, maxDelay) + } finally { + inFlight = false + + if (pending) { + pending = false + flush() + } + } + } + + return (items: T[]) => { + if (items.length === 0) return + buffer.push(...items) + if (!timer) { + timer = setTimeout(flush, maxDelay) + } + } +} + +export function chainify( + fn: (...args: Args) => R | Promise +): (...args: Args) => Promise { + let last: Promise = Promise.resolve() + + return (...args: Args): Promise => { + const result = last.then( + () => fn(...args), + () => fn(...args) + ) as Promise + + last = result.catch(e => console.log('error during func chain', e)) + + return result + } +}