diff --git a/android/app/build.gradle b/android/app/build.gradle index 37fe57b..a077394 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -40,6 +40,7 @@ dependencies { androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" implementation project(':capacitor-cordova-android-plugins') + implementation 'com.github.joshjdevl.libsodiumjni:libsodium-jni-aar:2.0.1' } apply from: 'capacitor.build.gradle' diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index 45fe448..93cc75c 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -10,6 +10,7 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { implementation project(':capacitor-community-native-audio') + implementation project(':capacitor-community-sqlite') implementation project(':capacitor-community-text-to-speech') } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0d3e502..915c3df 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - + @@ -13,6 +13,8 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:usesCleartextTraffic="true" + tools:replace="android:allowBackup" android:theme="@style/AppTheme"> =7.0.0" } }, "sha512-wi2l68tU6KDLJWKL6I0lPUKOdB+hNxlvF7RMe/jfkKOMZnd1eUq7kszmbMqyGFZFIxdNG/GMiZrEztZHDypf8A=="], + "@capacitor-community/sqlite": ["@capacitor-community/sqlite@7.0.0", "", { "dependencies": { "jeep-sqlite": "^2.7.2" }, "peerDependencies": { "@capacitor/core": ">=7.0.0" } }, "sha512-GSHxLEiyuhPoWwpMLOwfaOhLpfZglhfI1sqEgA5bSbtIYt1I+iK02b/ymonaghB176NhA5wuGd+spOIaL0kgHw=="], + "@capacitor-community/text-to-speech": ["@capacitor-community/text-to-speech@6.0.0", "", { "peerDependencies": { "@capacitor/core": ">=7.0.0" } }, "sha512-aKQ+S8q0T3Kqr2PdJI4xLksN8FFOqJI7vlX9sqWrPXPBWa8DQUSSV9M8tvjUq6B9+63er/KSe42ZKMVrD5usKw=="], "@capacitor/android": ["@capacitor/android@7.3.0", "", { "peerDependencies": { "@capacitor/core": "^7.3.0" } }, "sha512-TqUm+Z3Uk7/rET+adNDKD63JtA0AN+pMQlFRcLPmZJHFmJl6bUOWWELVL0Ixl5XaweTxofNKeDAjjLRIs+wd3g=="], @@ -298,6 +308,8 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.41.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw=="], + "@stencil/core": ["@stencil/core@4.35.1", "", { "optionalDependencies": { "@rollup/rollup-darwin-arm64": "4.34.9", "@rollup/rollup-darwin-x64": "4.34.9", "@rollup/rollup-linux-arm64-gnu": "4.34.9", "@rollup/rollup-linux-arm64-musl": "4.34.9", "@rollup/rollup-linux-x64-gnu": "4.34.9", "@rollup/rollup-linux-x64-musl": "4.34.9", "@rollup/rollup-win32-arm64-msvc": "4.34.9", "@rollup/rollup-win32-x64-msvc": "4.34.9" }, "bin": { "stencil": "bin/stencil" } }, "sha512-u65m3TbzOtpn679gUV4Yvi8YpInhRJ62js30a7YtXief9Ej/vzrhwDE22U0w4DMWJOYwAsJl133BUaZkWwnmzg=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="], "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.0.3", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.0", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.15", "vitefu": "^1.0.4" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw=="], @@ -338,6 +350,8 @@ "@tsconfig/svelte": ["@tsconfig/svelte@5.0.4", "", {}, "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q=="], + "@types/emscripten": ["@types/emscripten@1.40.1", "", {}, "sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg=="], + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/fs-extra": ["@types/fs-extra@8.1.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ=="], @@ -348,6 +362,8 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/libsodium-wrappers": ["@types/libsodium-wrappers@0.7.14", "", {}, "sha512-5Kv68fXuXK0iDuUir1WPGw2R9fOZUlYlSAa0ztMcL0s0BfIDTqg9GXz8K30VJpPP3sxWhbolnQma2x+/TfkzDQ=="], + "@types/mapbox__point-geometry": ["@types/mapbox__point-geometry@0.1.4", "", {}, "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="], "@types/mapbox__vector-tile": ["@types/mapbox__vector-tile@1.3.4", "", { "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", "@types/pbf": "*" } }, "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg=="], @@ -356,10 +372,14 @@ "@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="], + "@types/pako": ["@types/pako@2.0.3", "", {}, "sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q=="], + "@types/pbf": ["@types/pbf@3.0.5", "", {}, "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="], "@types/slice-ansi": ["@types/slice-ansi@4.0.0", "", {}, "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ=="], + "@types/sql.js": ["@types/sql.js@1.4.9", "", { "dependencies": { "@types/emscripten": "*", "@types/node": "*" } }, "sha512-ep8b36RKHlgWPqjNG9ToUrPiwkhwh0AEzy883mO5Xnd+cL6VBH1EvSjBAAuxLUFF2Vn/moE3Me6v9E1Lo+48GQ=="], + "@types/supercluster": ["@types/supercluster@7.1.3", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA=="], "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.34.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/type-utils": "8.34.1", "@typescript-eslint/utils": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.34.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ=="], @@ -418,6 +438,10 @@ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "browser-fs-access": ["browser-fs-access@0.35.0", "", {}, "sha512-sLoadumpRfsjprP8XzVjpQc0jK8yqHBx0PtUTGYj2fftT+P/t+uyDAQdMgGAPKD011in/O+YYGh7fIs0oG/viw=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], @@ -438,6 +462,8 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="], @@ -560,6 +586,8 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], @@ -584,10 +612,14 @@ "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="], + "jeep-sqlite": ["jeep-sqlite@2.8.0", "", { "dependencies": { "@stencil/core": "^4.20.0", "browser-fs-access": "^0.35.0", "jszip": "^3.10.1", "localforage": "^1.10.0", "sql.js": "^1.11.0" } }, "sha512-FWNUP6OAmrUHwiW7H1xH5YUQ8tN2O4l4psT1sLd7DQtHd5PfrA1nvNdeKPNj+wQBtu7elJa8WoUibTytNTaaCg=="], + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], @@ -602,6 +634,8 @@ "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], + "kdbush": ["kdbush@4.0.2", "", {}, "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], @@ -614,6 +648,12 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "libsodium": ["libsodium@0.7.15", "", {}, "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw=="], + + "libsodium-wrappers": ["libsodium-wrappers@0.7.15", "", { "dependencies": { "libsodium": "^0.7.15" } }, "sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ=="], + + "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], + "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=="], "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], @@ -638,6 +678,8 @@ "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], + "localforage": ["localforage@1.10.0", "", { "dependencies": { "lie": "3.1.1" } }, "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg=="], + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], @@ -698,6 +740,8 @@ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], @@ -738,6 +782,8 @@ "prettier-plugin-svelte": ["prettier-plugin-svelte@3.4.0", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], "protobufjs": ["protobufjs@7.5.3", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], @@ -750,7 +796,7 @@ "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="], - "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=="], + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], @@ -772,12 +818,14 @@ "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], @@ -792,11 +840,13 @@ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + "sql.js": ["sql.js@1.13.0", "", {}, "sha512-RJbVP1HRDlUUXahJ7VMTcu9Rm1Nzw+EBpoPr94vnbD4LwR715F3CcxE2G2k45PewcaZ57pjetYa+LoSJLAASgA=="], + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -920,6 +970,22 @@ "@isaacs/fs-minipass/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "@stencil/core/@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ=="], + + "@stencil/core/@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q=="], + + "@stencil/core/@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw=="], + + "@stencil/core/@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A=="], + + "@stencil/core/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A=="], + + "@stencil/core/@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA=="], + + "@stencil/core/@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q=="], + + "@stencil/core/@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.9", "", { "os": "win32", "cpu": "x64" }, "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw=="], + "@tailwindcss/oxide/tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], @@ -952,6 +1018,10 @@ "global-prefix/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + "jszip/pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "localforage/lie": ["lie@3.1.1", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw=="], + "maplibre-gl/earcut": ["earcut@3.0.1", "", {}, "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -964,6 +1034,8 @@ "tailwind-variants/tailwind-merge": ["tailwind-merge@3.0.2", "", {}, "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw=="], + "through2/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=="], + "vaul-svelte/runed": ["runed@0.23.4", "", { "dependencies": { "esm-env": "^1.0.0" }, "peerDependencies": { "svelte": "^5.7.0" } }, "sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA=="], "vaul-svelte/svelte-toolbelt": ["svelte-toolbelt@0.7.1", "", { "dependencies": { "clsx": "^2.1.1", "runed": "^0.23.2", "style-to-object": "^1.0.8" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ=="], @@ -991,5 +1063,9 @@ "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "global-prefix/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "through2/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "through2/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], } } diff --git a/package.json b/package.json index 3561245..8fdd36b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "@sveltejs/vite-plugin-svelte": "^5.0.3", "@tailwindcss/vite": "^4.0.0", "@tsconfig/svelte": "^5.0.4", + "@types/libsodium-wrappers": "^0.7.14", "@types/node": "^22.15.24", + "@types/pako": "^2.0.3", "bits-ui": "^2.7.0", "clsx": "^2.1.1", "eslint-config-prettier": "^10.1.5", @@ -32,16 +34,22 @@ "type": "module", "dependencies": { "@capacitor-community/native-audio": "^7.0.0", + "@capacitor-community/sqlite": "^7.0.0", "@capacitor-community/text-to-speech": "^6.0.0", "@capacitor/android": "^7.3.0", "@capacitor/cli": "^7.3.0", "@capacitor/core": "^7.3.0", "@diffusionstudio/vits-web": "^1.0.3", "@eslint/js": "^9.29.0", + "@types/sql.js": "^1.4.9", + "buffer": "^6.0.3", "eslint": "^9.29.0", "eslint-plugin-svelte": "^3.9.3", "globals": "^16.2.0", + "libsodium-wrappers": "^0.7.15", "opening_hours": "^3.8.0", + "pako": "^2.1.0", + "sql.js": "^1.13.0", "svelte-maplibre-gl": "^0.1.8", "typescript-eslint": "^8.34.1" } diff --git a/public/sql-wasm.wasm b/public/sql-wasm.wasm new file mode 100644 index 0000000..f2497a7 Binary files /dev/null and b/public/sql-wasm.wasm differ diff --git a/public/style.json b/public/style.json index d5d30db..528d0c6 100644 --- a/public/style.json +++ b/public/style.json @@ -12,9 +12,10 @@ "openmaptiles": { "type": "vector", "tiles": [ - "https://tiles.openfreemap.org/planet/20250528_001001_pt/{z}/{x}/{y}.pbf" + "tiles://planet/{z}/{x}/{y}" ], - "maxzoom": 14 + "maxzoom": 14, + "vector_layers": [{"id":"aerodrome_label","fields":{"class":"String","ele":"Number","ele_ft":"Number","iata":"String","icao":"String","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String"},"minzoom":8,"maxzoom":14},{"id":"aeroway","fields":{"class":"String","ref":"String"},"minzoom":10,"maxzoom":14},{"id":"boundary","fields":{"adm0_l":"String","adm0_r":"String","admin_level":"Number","claimed_by":"String","class":"String","disputed":"Number","disputed_name":"String","maritime":"Number","name":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ka":"String","name:kk":"String","name:ko":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:nonlatin":"String","name:oc":"String","name:pl":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sv":"String","name:ta":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name_de":"String","name_en":"String","name_int":"String"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","hide_3d":"Boolean","render_height":"Number","render_min_height":"Number"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"class":"String","subclass":"String"},"minzoom":0,"maxzoom":14},{"id":"landuse","fields":{"class":"String"},"minzoom":4,"maxzoom":14},{"id":"mountain_peak","fields":{"class":"String","customary_ft":"Number","ele":"Number","ele_ft":"Number","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String","rank":"Number"},"minzoom":7,"maxzoom":14},{"id":"park","fields":{"class":"String","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String","rank":"Number"},"minzoom":4,"maxzoom":14},{"id":"place","fields":{"capital":"Number","class":"String","iso_a2":"String","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String","rank":"Number"},"minzoom":0,"maxzoom":14},{"id":"poi","fields":{"agg_stop":"Number","class":"String","indoor":"Number","layer":"Number","level":"Number","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String","rank":"Number","subclass":"String"},"minzoom":11,"maxzoom":14},{"id":"transportation","fields":{"access":"String","bicycle":"String","brunnel":"String","class":"String","expressway":"Number","foot":"String","horse":"String","indoor":"Number","layer":"Number","level":"Number","mtb_scale":"String","network":"String","oneway":"Number","ramp":"Number","service":"String","subclass":"String","surface":"String","toll":"Number"},"minzoom":4,"maxzoom":14},{"id":"transportation_name","fields":{"class":"String","indoor":"Number","layer":"Number","level":"Number","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String","network":"String","ref":"String","ref_length":"Number","route_10_colour":"String","route_10_name":"String","route_10_network":"String","route_10_ref":"String","route_11_colour":"String","route_11_name":"String","route_11_network":"String","route_11_ref":"String","route_12_colour":"String","route_12_name":"String","route_12_network":"String","route_12_ref":"String","route_13_colour":"String","route_13_name":"String","route_13_network":"String","route_13_ref":"String","route_14_colour":"String","route_14_name":"String","route_14_network":"String","route_14_ref":"String","route_15_colour":"String","route_15_name":"String","route_15_network":"String","route_15_ref":"String","route_16_colour":"String","route_16_name":"String","route_16_network":"String","route_16_ref":"String","route_17_name":"String","route_17_network":"String","route_17_ref":"String","route_18_name":"String","route_18_network":"String","route_18_ref":"String","route_19_name":"String","route_19_network":"String","route_1_colour":"String","route_1_name":"String","route_1_network":"String","route_1_ref":"String","route_20_name":"String","route_20_network":"String","route_21_name":"String","route_21_network":"String","route_2_colour":"String","route_2_name":"String","route_2_network":"String","route_2_ref":"String","route_3_colour":"String","route_3_name":"String","route_3_network":"String","route_3_ref":"String","route_4_colour":"String","route_4_name":"String","route_4_network":"String","route_4_ref":"String","route_5_colour":"String","route_5_name":"String","route_5_network":"String","route_5_ref":"String","route_6_colour":"String","route_6_name":"String","route_6_network":"String","route_6_ref":"String","route_7_colour":"String","route_7_name":"String","route_7_network":"String","route_7_ref":"String","route_8_colour":"String","route_8_name":"String","route_8_network":"String","route_8_ref":"String","route_9_colour":"String","route_9_name":"String","route_9_network":"String","route_9_ref":"String","subclass":"String"},"minzoom":6,"maxzoom":14},{"id":"water","fields":{"brunnel":"String","class":"String","id":"Number","intermittent":"Number"},"minzoom":0,"maxzoom":14},{"id":"water_name","fields":{"class":"String","intermittent":"Number","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String"},"minzoom":0,"maxzoom":14},{"id":"waterway","fields":{"brunnel":"String","class":"String","intermittent":"Number","name":"String","name:am":"String","name:ar":"String","name:az":"String","name:be":"String","name:bg":"String","name:bn":"String","name:br":"String","name:bs":"String","name:ca":"String","name:co":"String","name:cs":"String","name:cy":"String","name:da":"String","name:de":"String","name:el":"String","name:en":"String","name:eo":"String","name:es":"String","name:et":"String","name:eu":"String","name:fa":"String","name:fi":"String","name:fr":"String","name:fy":"String","name:ga":"String","name:gd":"String","name:he":"String","name:hi":"String","name:hr":"String","name:hu":"String","name:hy":"String","name:id":"String","name:is":"String","name:it":"String","name:ja":"String","name:ja-Hira":"String","name:ja-Latn":"String","name:ja_kana":"String","name:ja_rm":"String","name:ka":"String","name:kk":"String","name:kn":"String","name:ko":"String","name:ko-Latn":"String","name:ku":"String","name:la":"String","name:latin":"String","name:lb":"String","name:lt":"String","name:lv":"String","name:mk":"String","name:ml":"String","name:mt":"String","name:nl":"String","name:no":"String","name:nonlatin":"String","name:oc":"String","name:pa":"String","name:pl":"String","name:pnb":"String","name:pt":"String","name:rm":"String","name:ro":"String","name:ru":"String","name:sk":"String","name:sl":"String","name:sq":"String","name:sr":"String","name:sr-Latn":"String","name:sv":"String","name:ta":"String","name:te":"String","name:th":"String","name:tr":"String","name:uk":"String","name:ur":"String","name:vi":"String","name:zh":"String","name:zh-Hans":"String","name:zh-Hant":"String","name_de":"String","name_en":"String","name_int":"String"},"minzoom":3,"maxzoom":14}] } }, "sprite": "https://tiles.openfreemap.org/sprites/ofm_f384/ofm", diff --git a/src/lib/components/lnv/Map.svelte b/src/lib/components/lnv/Map.svelte index 1f4e449..522b7d0 100644 --- a/src/lib/components/lnv/Map.svelte +++ b/src/lib/components/lnv/Map.svelte @@ -14,6 +14,7 @@ routing, } from "$lib/services/navigation/routing.svelte"; import { location } from "./location.svelte"; + import { protocol } from "$lib/services/OfflineTiles"; onMount(() => { window.addEventListener("resize", map.updateMapPadding); @@ -27,6 +28,10 @@ + + { map.updateMapPadding(); location.locked = true; + // @ts-expect-error - not typed + window.map = map.value; }} onclick={(e) => { if (view.current.type == "main" || view.current.type == "info") { diff --git a/src/lib/components/lnv/Sidebar.svelte b/src/lib/components/lnv/Sidebar.svelte index a7a4c5e..5fd6336 100644 --- a/src/lib/components/lnv/Sidebar.svelte +++ b/src/lib/components/lnv/Sidebar.svelte @@ -28,6 +28,7 @@ import { routing } from "$lib/services/navigation/routing.svelte"; import InRouteSidebar from "./sidebar/InRouteSidebar.svelte"; import say from "$lib/services/navigation/TTS"; + import { test } from "$lib/services/OfflineTiles"; // eslint-disable-next-line @typescript-eslint/no-explicit-any const views: Record> = { @@ -207,6 +208,16 @@ > Test TTS + diff --git a/src/lib/services/OfflineTiles.ts b/src/lib/services/OfflineTiles.ts new file mode 100644 index 0000000..0ee1d9a --- /dev/null +++ b/src/lib/services/OfflineTiles.ts @@ -0,0 +1,139 @@ +import { CapacitorSQLite, SQLiteConnection, SQLiteDBConnection } from "@capacitor-community/sqlite"; +import initSqlJs from "sql.js"; +import { Buffer } from "buffer"; +import { Capacitor } from "@capacitor/core"; +import { ungzip } from "pako"; + +let sqlite: SQLiteConnection; +let db: SQLiteDBConnection; + +export async function downloadMBTiles(url: string): Promise { + return fetch(url) + .then(res => res.arrayBuffer()) + .then(ab => new Uint8Array(ab)) +} + +export async function copyMBTiles(data: Uint8Array) { + if (!db) { + await initDB(); + } + const SQL = await initSqlJs(); + const mdb = new SQL.Database(data); + const res = mdb.exec("SELECT * FROM tiles"); + //// const chunkSize = 10; // Adjust chunk size as needed + //// const values = res[0].values; + //// for (let i = 0; i < values.length; i += chunkSize) { + //// const chunk = values.slice(i, i + chunkSize); + //// const statements = chunk.map(row => { + //// const [z, x, y, data] = row; + //// return { + //// statement: `INSERT OR REPLACE INTO tiles (z, x, y, data) VALUES (?, ?, ?, ?)`, + //// values: [z, x, y, Buffer.from(data as Uint8Array)] + //// }; + //// }); + //// await db.executeSet(statements); + //// console.log(`Inserted chunk ${i / chunkSize + 1} of ${Math.ceil(values.length / chunkSize)}: z=${chunk[0][0]}, x=${chunk[0][1]}, y=${chunk[0][2]}`); + //// } + const total = res[0].values.length; + for (const [idx, row] of res[0].values.entries()) { + const [z, x, y, data] = row; + await db.run(`INSERT OR REPLACE INTO tiles (z, x, y, data) VALUES (?, ?, ?, ?)`, [ + z, + x, + y, + Buffer.from(data as Uint8Array) // Convert Uint8Array to Buffer + ]); + console.log(`Inserted tile z=${z}, x=${x}, y=${y}. Item ${idx + 1} of ${total}`); + } + console.log(`Copied ${res[0].values.length} tiles from MBTiles data`); +} + +export async function test(url: string) { + const res = await downloadMBTiles(url); + console.log("Downloaded MBTiles data"); + await copyMBTiles(res); +} + +export async function initDB() { + if(!Capacitor.isNativePlatform()) { + throw new Error("initDB is only available on native platforms"); + } + console.log("Initializing SQLite database for tiles"); + sqlite = new SQLiteConnection(CapacitorSQLite); + db = await sqlite.createConnection("tiles", false, "no-encryption", 1, false); + await db.open(); + await db.execute(`CREATE TABLE IF NOT EXISTS tiles ( + z INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + data BLOB NOT NULL, + PRIMARY KEY (z, x, y) + )`); + await db.execute(`CREATE INDEX IF NOT EXISTS idx_tiles_zxy ON tiles (z, x, y)`); +} + +async function deleteDB() { + if(!Capacitor.isNativePlatform()) { + throw new Error("deleteDB is only available on native platforms"); + } + await db.execute(`DROP TABLE IF EXISTS tiles`); + await initDB(); +} + +// @ts-expect-error aaaaa +window.deleteDB = deleteDB; + +// @ts-expect-error aaaaa +window.initDB = initDB; + +export async function getTile(z: number, x: number, y: number): Promise { + const res = await db.query(`SELECT data FROM tiles WHERE z = ? AND x = ? AND y = ?`, [z, x, y]); + if (!res.values || res.values.length === 0) { + return null; + } + console.log(res); + return await decompressGzip(res.values[0].data as Uint8Array); +} + +// @ts-expect-error aaaaa +window.getTile = getTile; + +async function decompressGzip(blob: Uint8Array): Promise { + // const ds = new DecompressionStream("gzip"); + // const decompressedStream = new Blob([blob]).stream().pipeThrough(ds); + // return new Uint8Array(await new Response(decompressedStream).arrayBuffer()); + return ungzip(blob); +} + + +export async function protocol(params: { url: string }): Promise<{ data: Uint8Array }> { + console.log("Protocol called with params:", params); + const url = new URL(params.url); + const pathname = url.pathname.replace(/^\//, ""); // Remove leading slash + const z = parseInt(pathname.split("/")[0]); + const x = parseInt(pathname.split("/")[1]); + const y = parseInt(pathname.split("/")[2]); + if(!Capacitor.isNativePlatform()) { + const t = await fetch(`https://tiles.openfreemap.org/planet/20250528_001001_pt/${z}/${x}/${y}.pbf`); + if (t.status == 200) { + const buffer = await t.arrayBuffer(); + return { data: new Uint8Array(buffer) }; + } else { + throw new Error(`Tile fetch error: ${t.statusText}`); + } + } + if(!db) { + await initDB(); + } + const tmsY = (1 << z) - 1 - y; // Invert y for TMS + console.log(`Fetching tile: z=${z}, x=${x}, y=${y}, tmsY=${tmsY}`); + const data = await getTile(z, x, tmsY); + if (!data) { + console.warn(`Tile not found: z=${z}, x=${x}, y=${y}`); + return { + data: new Uint8Array() // Return empty array if tile not found + } + } + // return { data: await fetch("/0.pbf").then(res => res.arrayBuffer()).then(ab => new Uint8Array(ab)) }; + return { data }; +}