diff --git a/package-lock.json b/package-lock.json index fc88e67e41..32b176ff53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4 +1,3 @@ -{ "name": "mapcomplete", "version": "0.51.0", "lockfileVersion": 2, @@ -67,7 +66,7 @@ "marked": "^12.0.2", "monaco-editor": "^0.46.0", "mvt-to-geojson": "^0.0.6", - "name-suggestion-index": "^6.0.20250302", + "name-suggestion-index": "^6.0.20250413", "npm": "^11.1.0", "opening_hours": "^3.6.0", "osm-auth": "^2.6.0", @@ -20056,9 +20055,9 @@ } }, "node_modules/name-suggestion-index": { - "version": "6.0.20250302", - "resolved": "https://registry.npmjs.org/name-suggestion-index/-/name-suggestion-index-6.0.20250302.tgz", - "integrity": "sha512-9tdHRaHBXhFTXCt0FGWhOuIRWx8GalsbTD2GIL9B8XmFah8q6hk99yjMMnRkRAedarvJpYHaUCSbkaH6QQpplA==", + "version": "6.0.20250413", + "resolved": "https://registry.npmjs.org/name-suggestion-index/-/name-suggestion-index-6.0.20250413.tgz", + "integrity": "sha512-rJ+6A2pp/NQ9gidWs72XuVBlfzynF4IaoeOFhKX19fCQbVNHiWbxlTSxQ852pQoisJXDSW5kgzakoKz7uxo9BA==", "license": "BSD-3-Clause", "dependencies": { "diacritics": "^1.3.0", @@ -44340,9 +44339,9 @@ } }, "name-suggestion-index": { - "version": "6.0.20250302", - "resolved": "https://registry.npmjs.org/name-suggestion-index/-/name-suggestion-index-6.0.20250302.tgz", - "integrity": "sha512-9tdHRaHBXhFTXCt0FGWhOuIRWx8GalsbTD2GIL9B8XmFah8q6hk99yjMMnRkRAedarvJpYHaUCSbkaH6QQpplA==", + "version": "6.0.20250413", + "resolved": "https://registry.npmjs.org/name-suggestion-index/-/name-suggestion-index-6.0.20250413.tgz", + "integrity": "sha512-rJ+6A2pp/NQ9gidWs72XuVBlfzynF4IaoeOFhKX19fCQbVNHiWbxlTSxQ852pQoisJXDSW5kgzakoKz7uxo9BA==", "requires": { "diacritics": "^1.3.0", "run-s": "^0.0.0", diff --git a/package.json b/package.json index 637590a7be..c74f16fd7d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,8 @@ "summary_server": "https://cache.mapcomplete.org/", "geoip_server": "https://ipinfo.mapcomplete.org/", "error_server": "https://report.mapcomplete.org/report", + "#nsi_logos_server": "The location where a running instance of MapComplete will fetch the NSI-logos. This is by default the host itself, but not in e.g. the android app", + "nsi_logos_server": "https://mapcomplete.org/assets/data/nsi/", "api_keys": { "#": "Various API-keys for various services. Feel free to reuse those in another MapComplete-hosted version", "#fork": "Not bound to a domain; can be reused", @@ -111,7 +113,7 @@ "generate": "npm run generate:licenses && npm run generate:images && npm run generate:charging-stations && npm run generate:translations && npm run refresh:layeroverview && npm run generate:service-worker", "generate:charging-stations": "cd ./assets/layers/charging_station && vite-node csvToJson.ts && cd -", "clean:tests": "find . -type f -name \"*.doctest.ts\" | xargs -r rm", - "clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|privacy\\|test\\|studio\\|theme\\|style_test\\|statistics\\|status\\|leaderboard\\|inspector\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm)", + "clean": "echo '{\n \"#\": \"Settings in this file override the `config`-section of `package.json`\"\n}' > config.json && rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|privacy\\|test\\|studio\\|theme\\|style_test\\|statistics\\|status\\|leaderboard\\|inspector\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm)", "generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot", "scrapeWebsites": "vite-node scripts/importscripts/compareWebsiteData.ts -- ~/Downloads/ShopsWithWebsiteNodes.csv ~/data/scraped_websites/", "### 0": "VELOPARK", @@ -229,7 +231,7 @@ "marked": "^12.0.2", "monaco-editor": "^0.46.0", "mvt-to-geojson": "^0.0.6", - "name-suggestion-index": "^6.0.20250302", + "name-suggestion-index": "^6.0.20250413", "npm": "^11.1.0", "opening_hours": "^3.6.0", "osm-auth": "^2.6.0", diff --git a/scripts/downloadEli.ts b/scripts/downloadEli.ts index 8780d5d816..5686fdccf6 100644 --- a/scripts/downloadEli.ts +++ b/scripts/downloadEli.ts @@ -126,7 +126,7 @@ class DownloadEli extends Script { fs.writeFileSync(targetGlobal, JSON.stringify(contentsGlobal, null, " "), { encoding: "utf8", }) - console.log("Written", keptGlobalLayers.length + ", entries to the global ELI") + console.log("Written", keptGlobalLayers.length + ", entries to the global ELI ("+targetGlobal+")") } } diff --git a/scripts/nsiLogos.ts b/scripts/nsiLogos.ts index ae893e8130..8af027ca52 100644 --- a/scripts/nsiLogos.ts +++ b/scripts/nsiLogos.ts @@ -211,7 +211,7 @@ class NsiLogos extends Script { const config: LayerConfigJson = { id: "nsi_" + type, description: { - en: "Exposes part of the NSI to reuse in other themes, e.g. for rendering", + en: "Exposes part of the NSI to reuse in other themes, e.g. for rendering. Automatically generated and never directly loaded in a theme", }, source: "special:library", pointRendering: null, diff --git a/scripts/prepareAndroid.sh b/scripts/prepareAndroid.sh index 63104df4f0..ee6c5ca293 100755 --- a/scripts/prepareAndroid.sh +++ b/scripts/prepareAndroid.sh @@ -8,7 +8,18 @@ then npm run generate:layeroverview npm run generate:layouts fi -vite-node scripts/nsiLogos.ts -- patch +echo ''' +{ + "nsi_logos_server": "https://mapcomplete.org/assets/data/nsi/logos/" +} +''' > config.json +cat config.json | jq +if [ $? -ne 0 ] +then + echo "config.json file is invalid, exiting now" + tput bel + exit 0 +fi npm run build echo ''' import type { CapacitorConfig } from "@capacitor/cli"; @@ -22,6 +33,7 @@ const config: CapacitorConfig = { export default config; ''' > capacitor.config.ts + # copy distribution files rm -rf dist-full mkdir dist-full @@ -51,6 +63,11 @@ cp -r dist/assets/svg dist-full/assets/ cp -r dist/assets/templates dist-full/assets/ cp -r dist/assets/generated/themes/ dist-full/assets/generated/ cp -r dist/assets/themes dist-full/assets/ +cp dist/assets/*.js.map dist-full/assets/ +rm -rf dist-full/assets/data/nsi +rm /home/pietervdvn/git/MapComplete/dist-full/assets/layers/nsi_brand/nsi_brand.json +rm /home/pietervdvn/git/MapComplete/dist-full/assets/layers/nsi_operator/nsi_operator.json + # mkdir dist-full/assets/generated nvm use @@ -59,7 +76,8 @@ nvm use npx capacitor-assets generate npx cap sync -cd android +npm run clean + echo "All done! Don't forget to click 'gradle sync files' in Android Studio" tput bel tput bel diff --git a/src/Logic/Web/NameSuggestionIndex.ts b/src/Logic/Web/NameSuggestionIndex.ts index a85af4bc96..10229e8daf 100644 --- a/src/Logic/Web/NameSuggestionIndex.ts +++ b/src/Logic/Web/NameSuggestionIndex.ts @@ -8,6 +8,7 @@ import { TypedTranslation } from "../../UI/i18n/Translation" import { RegexTag } from "../Tags/RegexTag" import { TagConfigJson } from "../../Models/ThemeConfig/Json/TagConfigJson" import { TagUtils } from "../Tags/TagUtils" +import Constants from "../../Models/Constants" /** * Main name suggestion index file @@ -69,8 +70,10 @@ export default class NameSuggestionIndex { private loco: LocationConflation // Some additional boundaries private _supportedTypes: string[] + private _serverLocation: string - constructor( + private constructor( + serverLocation: string, nsiFile: Readonly, nsiWdFile: Readonly< Record< @@ -82,6 +85,7 @@ export default class NameSuggestionIndex { >, features: Readonly ) { + this._serverLocation = serverLocation this.nsiFile = nsiFile this.nsiWdFile = nsiWdFile this.loco = new LocationConflation(features) @@ -101,6 +105,7 @@ export default class NameSuggestionIndex { ].map((url) => Utils.downloadJsonCached(url, 1000 * 60 * 60 * 24 * 30)) ) NameSuggestionIndex.inited = new NameSuggestionIndex( + Constants.nsiLogosEndpoint, nsi, nsiWd["wikidata"], features @@ -129,12 +134,13 @@ export default class NameSuggestionIndex { * @param countries * @private */ - private static async fetchFrequenciesFor(type: string, countries: string[]) { + private async fetchFrequenciesFor(type: string, countries: string[]) { + const server = this._serverLocation let stats = await Promise.all( countries.map((c) => { try { return Utils.downloadJsonCached>( - `./assets/data/nsi/stats/${type}.${c.toUpperCase()}.json`, + `${server}/stats/${type}.${c.toUpperCase()}.json`, 24 * 60 * 60 * 1000 ) } catch (e) { @@ -194,7 +200,7 @@ export default class NameSuggestionIndex { const mappings: (Mapping & { frequency: number })[] = [] const frequencies = country !== undefined - ? await NameSuggestionIndex.fetchFrequenciesFor(type, country) + ? await this.fetchFrequenciesFor(type, country) : {} for (const key in tags) { if (key.startsWith("_")) { @@ -398,11 +404,12 @@ export default class NameSuggestionIndex { } public getIconUrl(nsiItem: NSIItem): string | undefined { - if (!nsiItem.ext) { + const baseUrl = this._serverLocation + if (!nsiItem.ext || baseUrl === null) { // No extension -> there is no logo return undefined } - return "./assets/data/nsi/logos/" + nsiItem.id + "." + nsiItem.ext + return baseUrl +"/logos/"+ nsiItem.id + "." + nsiItem.ext } private static readonly brandPrefix = ["name", "alt_name", "operator", "brand"] as const diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts index 801d9c2189..43b87ba60e 100644 --- a/src/Models/Constants.ts +++ b/src/Models/Constants.ts @@ -139,6 +139,7 @@ export default class Constants { public static osmAuthConfig: AuthConfig = Constants.config.oauth_credentials public static nominatimEndpoint: string = Constants.config.nominatimEndpoint public static photonEndpoint: string = Constants.config.photonEndpoint + public static nsiLogosEndpoint: string = Constants.config.nsi_logos_server ?? null public static weblate: string = "https://translate.mapcomplete.org/" public static linkedDataProxy: string = Constants.config["jsonld-proxy"]