diff --git a/.reuse/dep5 b/.reuse/dep5 index f30224f2..7519084a 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -3,7 +3,7 @@ Upstream-Name: odh-mentor-otp Upstream-Contact: NOI Techpark <digital@noi.bz.it> Source: https://github.com/noi-techpark/odh-mentor-otp -Files: .github/* infrastructure .pre-commit-config.yaml .gitignore .dockerignore AUTHOR.txt *.json dotenv.example osm.url *.jar */.nvmrc *.geojson docs/images/* gbfs/bikestations_meran.csv */dotenv.example gtfs2bbox/tests/* journey/yarn.lock journey/src/fonts/* journey/src/images/* vms/README vms/.gitignore journey/src/otp-ui/icons/openmove/README vms/signs/* journey/src/otp-ui/icons/.eslintrc journey/src/otp-ui/icons/*.svg otp-react-redux-config/config.yml +Files: .github/* infrastructure .pre-commit-config.yaml .gitignore .gitmodules .dockerignore AUTHOR.txt *.json dotenv.example osm.url *.jar */.nvmrc *.geojson docs/images/* gbfs/bikestations_meran.csv */dotenv.example gtfs2bbox/tests/* journey/yarn.lock journey/src/fonts/* journey/src/images/* vms/README vms/.gitignore journey/src/otp-ui/icons/openmove/README vms/signs/* journey/src/otp-ui/icons/.eslintrc journey/src/otp-ui/icons/*.svg otp-react-redux-config/config.yml Copyright: (c) NOI Techpark <digital@noi.bz.it> License: CC0-1.0 @@ -19,3 +19,7 @@ License: BSD-2-Clause Files: journey/src/styles/cookieconsent/cookieconsent.css journey/src/util/cookieconsent.js Copyright: (c) 2020-2023 Orest Bida License: MIT + +Files: web-demo/.gitignore web-demo/.babelrc +Copyright: (c) 2017 Conveyal +License: MIT diff --git a/pelias/.gitignore b/pelias/.gitignore new file mode 100644 index 00000000..b4589ec4 --- /dev/null +++ b/pelias/.gitignore @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +# +# SPDX-License-Identifier: MIT + +./data \ No newline at end of file diff --git a/pelias/README.md b/pelias/README.md new file mode 100644 index 00000000..611be0c1 --- /dev/null +++ b/pelias/README.md @@ -0,0 +1,66 @@ +<!-- +SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> + +SPDX-License-Identifier: MIT +--> + +# Italian area + +This project is configured to download/prepare/build a complete Pelias installation for South-Tyrol. + +# Setup + +Please refer to the instructions at <https://github.com/pelias/docker> in order to install and configure your docker environment. + +The minimum configuration required in order to run this project are [installing prerequisites](https://github.com/pelias/docker#prerequisites), [install the pelias command](https://github.com/pelias/docker#installing-the-pelias-command) and [configure the environment](https://github.com/pelias/docker#configure-environment) + +You also need `curl`, `jq` and `node` to import OpenTripPlanner stops and NOI Datahub Activities and Accomodations POI. + +Please ensure that's all working fine before continuing. + +# Run a Build + +To run a complete build, execute the following commands: + +## Pull relevant images and create elasticsearch shard (see pelias.json configuration) +```bash +pelias compose pull +pelias elastic start +pelias elastic wait +pelias elastic create +``` + +## Download all the relevant information + +```bash +pelias download all +pelias prepare all +./importers/download_and_prepare_stops.sh +./importers/download_and_prepare_poi.sh +``` + +## Import all the data in the service +```bash +pelias import all +``` + +## Frequently update stops and POI +```bash +./importers/download_and_prepare_stops.sh +./importers/download_and_prepare_poi.sh +./importers/delete_old_poi_and_stops.sh +pelias import csv +``` + +# Starting the service +The API service can then be started with the following command + +```bash +pelias compose up -d +``` + +# Make an Example Query + +You can now make queries against your new Pelias build: + +<http://localhost:4000/v1/search?text=Morena> diff --git a/pelias/docker-compose.yml b/pelias/docker-compose.yml new file mode 100644 index 00000000..8aa2b503 --- /dev/null +++ b/pelias/docker-compose.yml @@ -0,0 +1,116 @@ +# SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +# +# SPDX-License-Identifier: MIT + +version: '3' +networks: + default: + driver: bridge +services: + libpostal: + image: pelias/libpostal-service + container_name: pelias_libpostal + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:4400:4400" ] + schema: + image: pelias/schema:master + container_name: pelias_schema + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + api: + image: pelias/api:master + container_name: pelias_api + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4000" ] + ports: [ "0.0.0.0:4000:4000" ] + volumes: + - "./pelias.json:/code/pelias.json" + placeholder: + image: pelias/placeholder:master + container_name: pelias_placeholder + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4100" ] + ports: [ "127.0.0.1:4100:4100" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + whosonfirst: + image: pelias/whosonfirst:master + container_name: pelias_whosonfirst + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openstreetmap: + image: pelias/openstreetmap:master + container_name: pelias_openstreetmap + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + openaddresses: + image: pelias/openaddresses:master + container_name: pelias_openaddresses + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + csv-importer: + image: pelias/csv-importer:master + container_name: pelias_csv_importer + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + - "./blacklist/:/data/blacklist" + polylines: + image: pelias/polylines:master + container_name: pelias_polylines + user: "${DOCKER_USER}" + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + interpolation: + image: pelias/interpolation:master + container_name: pelias_interpolation + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4300" ] + ports: [ "127.0.0.1:4300:4300" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + pip: + image: pelias/pip-service:master + container_name: pelias_pip-service + user: "${DOCKER_USER}" + restart: always + environment: [ "PORT=4200" ] + ports: [ "127.0.0.1:4200:4200" ] + volumes: + - "./pelias.json:/code/pelias.json" + - "${DATA_DIR}:/data" + elasticsearch: + image: pelias/elasticsearch:7.16.1 + container_name: pelias_elasticsearch + user: "${DOCKER_USER}" + restart: always + ports: [ "127.0.0.1:9200:9200", "127.0.0.1:9300:9300" ] + volumes: + - "./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro" + - "${DATA_DIR}/elasticsearch:/usr/share/elasticsearch/data" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: [ "IPC_LOCK" ] + security_opt: + - seccomp=unconfined diff --git a/pelias/elasticsearch.yml b/pelias/elasticsearch.yml new file mode 100644 index 00000000..be1c1f2b --- /dev/null +++ b/pelias/elasticsearch.yml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +# +# SPDX-License-Identifier: MIT + +network.host: 0.0.0.0 +bootstrap.memory_lock: true +indices.breaker.fielddata.limit: 85% +indices.fielddata.cache.size: 75% \ No newline at end of file diff --git a/pelias/importers/delete_old_poi_and_stops.sh b/pelias/importers/delete_old_poi_and_stops.sh new file mode 100755 index 00000000..d1e54e4a --- /dev/null +++ b/pelias/importers/delete_old_poi_and_stops.sh @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +# +# SPDX-License-Identifier: MIT + +function delete_old_stops { + curl -X POST "localhost:9200/pelias/_delete_by_query?pretty" -H 'Content-Type: application/json' -d' + { + "query": { + "match": { + "source": "otp" + } + } + } + ' +} +function delete_old_poi { + curl -X POST "localhost:9200/pelias/_delete_by_query?pretty" -H 'Content-Type: application/json' -d' + { + "query": { + "match": { + "source": "noi-datahub-poi" + } + } + } + ' +} +function delete_old_accomodation { + curl -X POST "localhost:9200/pelias/_delete_by_query?pretty" -H 'Content-Type: application/json' -d' + { + "query": { + "match": { + "source": "noi-datahub-accomodation" + } + } + } + ' +} + +delete_old_stops +delete_old_poi +delete_old_accomodation \ No newline at end of file diff --git a/pelias/importers/download_and_prepare_poi.sh b/pelias/importers/download_and_prepare_poi.sh new file mode 100644 index 00000000..df412dc7 --- /dev/null +++ b/pelias/importers/download_and_prepare_poi.sh @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +# +# SPDX-License-Identifier: MIT + +curl "https://tourism.api.opendatahub.com/v1/ODHActivityPoi?pagesize=50000" > ./data/csv-importer/touristic-poi-all.json +curl "https://tourism.api.opendatahub.com/v1/STA/ODHActivityPoi?language=en&referer=SuedtirolMobilWeb&fields=Id%2CDetail.en.Title%2CContactInfos.en.City&pagesize=20000" > ./data/csv-importer/touristic-poi-filtered-set.json + +curl "https://tourism.api.opendatahub.com/v1/Accommodation?pagesize=20000" > ./data/csv-importer/accomodation-poi-all.json +curl "https://tourism.api.opendatahub.com/v1/STA/Accommodation?language=en&referer=SuedtirolMobilWeb&fields=Id%2CAccoDetail.en.Name%2CAccoDetail.en.City&pagesize=10000" > ./data/csv-importer/accomodation-poi-filtered-set.json + +node ./importers/process-touristic-poi.js + +TOURISTIC_CSV=./data/csv-importer/touristic-poi.csv +TOURISTIC_JSON_FILE=./data/csv-importer/touristic-poi.json +ACCOMODATION_CSV=./data/csv-importer/accomodation-poi.csv +ACCOMODATION_JSON_FILE=./data/csv-importer/accomodation-poi.json + +# transform JSON data to CSV with jq +echo "source,layer,id,lat,lon,name,name_de,name_en,name_fr,name_it,category_json,addendum_json_poi" > $TOURISTIC_CSV +cat $TOURISTIC_JSON_FILE | jq --raw-output ".[] | [ + \"noi-datahub-poi\",\"venue\",\ + .Id,\ + .GpsPoints.position.Latitude,.GpsPoints.position.Longitude,\ + .Detail.it.Title,.Detail.de.Title,.Detail.en.Title,.Detail.fr.Title,.Detail.it.Title,\ + ([.Tags[] | \"touristic:\"+ (.Id | gsub(\" \"; \"_\"))] | tostring), \ + (.|tostring) \ + ] | @csv" >> $TOURISTIC_CSV; + +echo "source,layer,id,lat,lon,name,name_de,name_en,name_fr,name_it,category_json,addendum_json_accomodation" > $ACCOMODATION_CSV +cat $ACCOMODATION_JSON_FILE | jq --raw-output ".[] | [ + \"noi-datahub-accomodation\",\"venue\",\ + .Id,\ + .Latitude,.Longitude,\ + .AccoDetail.it.Name,.AccoDetail.de.Name,.AccoDetail.en.Name,.AccoDetail.fr.Name,.AccoDetail.it.Name,\ + ([(.AccoType,.AccoCategory) | \"accomodation:\"+ (.Id | gsub(\" \"; \"_\"))] | tostring), \ + (.|tostring) \ + ] | @csv" >> $ACCOMODATION_CSV; diff --git a/pelias/importers/download_and_prepare_stops.sh b/pelias/importers/download_and_prepare_stops.sh new file mode 100644 index 00000000..44564740 --- /dev/null +++ b/pelias/importers/download_and_prepare_stops.sh @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +# +# SPDX-License-Identifier: MIT + +STOP_JSON_FILE=./data/csv-importer/stops.json +STOP_CSV=./data/csv-importer/stops.csv + + +# fetch JSON data from OpenTripPlanner +node ./importers/fetch-poi.js + +# transform JSON data to CSV with jq +echo "source,layer,id,name,lat,lon,popularity,categories,addendum_json_stop" > $STOP_CSV +cat $STOP_JSON_FILE | jq --raw-output '.[] | ["otp","stops",.gtfsId,.name,.lat,.lon,.popularity,(.categories|tostring),(.|tostring)] | @csv' >> $STOP_CSV diff --git a/pelias/importers/fetch-poi.js b/pelias/importers/fetch-poi.js new file mode 100644 index 00000000..17eccbcf --- /dev/null +++ b/pelias/importers/fetch-poi.js @@ -0,0 +1,158 @@ +// SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +// +// SPDX-License-Identifier: MIT + +let fs = require('fs'); + +// Retrieve all stops and additional information +let GraphqlOtp = require('./graphql_otp.js'); + +// Config +const DATA_DIR = __dirname + "/../data/csv-importer"; +const EXPORT_STOPS = DATA_DIR + "/stops.json"; +const EXPORT_PARKINGS = DATA_DIR + "/parkings.json"; +const EXPORT_RENTAL_VEHICLES = DATA_DIR + "/rental_vehicles.json"; +const EXPORT_RENTAL_STATIONS = DATA_DIR + "/rental_stations.json"; + +// Create folder if not exists +if (!fs.existsSync(DATA_DIR)){ + fs.mkdirSync(DATA_DIR); +} + +// Query stops from OTP graphql endpoint +GraphqlOtp.query('https://otp.opendatahub.testingmachine.eu/otp/gtfs/v1', GraphqlOtp.queries.getAllPoi) + .then((data) => { + let stops = data.data.stops; + let stations = data.data.stations; + let vehicleParkings = data.data.vehicleParkings; + let rentalVehicles = data.data.rentalVehicles; + let vehicleRentalStations = data.data.vehicleRentalStations; + processStops(stops, stations); + processVehicleParkings(vehicleParkings); + processRentalVehicles(rentalVehicles); + processVehicleRentalStations(vehicleRentalStations); + }); + + +function processStops(stops, stations) { + // Index stations by id + let stationsIndex = {}; + stations.forEach((st) => { + stationsIndex[st.gtfsId] = st; + }); + + // Filter stop without routes + var stops = stops.filter((st) => { + return st.routes.length > 0; + }) + // Recompute vehicle mode based on routes + .map((st) => { + let vehicleModes = st.routes.map((r) => r.mode); + // Make it unique + vehicleModes = [...new Set(vehicleModes)]; + return { + ...st, + vehicleMode: vehicleModes, + }; + // Extract platform into stations + }).filter((st) => { + if(st.parentStation) { + let parentStation = stationsIndex[st.parentStation.gtfsId]; + if(!parentStation.childs) { + parentStation.childs = []; + } + parentStation.childs.push(st); + return false; + } + return true; + }); + + // filter stations with no childs + stations = stations.filter((st) => { + return st.childs && st.childs.length > 0; + }); + + // broadcast vehicles from childs to parent station + stations.forEach((st) => { + if(st.childs) { + let vehicleMode = []; + let routes = []; + st.childs.forEach((child) => { + vehicleMode = vehicleMode.concat(child.vehicleMode); + routes = routes.concat(child.routes); + }); + vehicleMode = [...new Set(vehicleMode)]; + routes = [...new Set(routes)]; + st.vehicleMode = vehicleMode; + st.routes = routes; + } + }); + + let poi = stops.concat(stations); + + /* Modes + "[\"AIRPLANE\"]" + "[\"BUS\",\"FUNICULAR\"]" + "[\"BUS\",\"GONDOLA\",\"RAIL\"]" + "[\"BUS\",\"GONDOLA\"]" + "[\"BUS\",\"RAIL\"]" + "[\"BUS\"]" + "[\"FUNICULAR\"]" + "[\"GONDOLA\"]" + "[\"RAIL\",\"BUS\"]" + "[\"RAIL\"]" +*/ + + // Compute popularity based on number of routes / different vehicle modes + // Target is between 1'000 and 3'000 for small/medium stops and 3'000-10'000 for big stations + poi.forEach((p) => { + let popularity = 0; + + if(p.vehicleMode.includes("AIRPLANE")) { + popularity += 1500; + } + if(p.vehicleMode.includes("RAIL")) { + popularity += 1000; + } + if(p.vehicleMode.includes("BUS")) { + popularity += 500; + } + if(p.vehicleMode.includes("TRAM")) { + popularity += 500; + } + if(p.vehicleMode.includes("GONDOLA")) { + popularity += 500; + } + if(p.vehicleMode.includes("FUNICULAR")) { + popularity += 500; + } + + popularity += p.routes.length * 250; + + p.popularity = popularity + }); + + // Compute categories based on vehicleMode + poi.forEach((p) => { + p.categories = ["public_transport", "public_transport:stop"]; + p.vehicleMode.forEach((vm) => { + p.categories.push("public_transport:stop:" + vm.toLowerCase()); + }); + }); + + // Save the processed points + fs.writeFileSync(EXPORT_STOPS, JSON.stringify(poi, null, 2)); + +} + +function processVehicleParkings(vehicleParkings) { + fs.writeFileSync(EXPORT_PARKINGS, JSON.stringify(vehicleParkings, null, 2)); +} + +function processRentalVehicles(rentalVehicles) { + // NONE for now +} + +function processVehicleRentalStations(vehicleRentalStations) { + fs.writeFileSync(EXPORT_RENTAL_STATIONS, JSON.stringify(vehicleRentalStations, null, 2)); +} \ No newline at end of file diff --git a/pelias/importers/graphql_otp.js b/pelias/importers/graphql_otp.js new file mode 100644 index 00000000..c29ecc5f --- /dev/null +++ b/pelias/importers/graphql_otp.js @@ -0,0 +1,113 @@ +// SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +// +// SPDX-License-Identifier: MIT + +let getAllPoi = `query GetAllPoi { + vehicleParkings { + vehicleParkingId + name + bicyclePlaces + carPlaces + lat + lon + note + tags + } + rentalVehicles { + vehicleId + name + lat + lon + rentalNetwork { + networkId + url + } + vehicleType { + formFactor + propulsionType + } + } + vehicleRentalStations { + stationId + name + lat + lon + availableSpaces { + byType { + count + vehicleType { + formFactor + propulsionType + } + } + total + } + availableVehicles { + byType { + count + vehicleType { + formFactor + propulsionType + } + } + total + + } + capacity + rentalNetwork { + networkId + url + } + } + stations { + gtfsId + lat + lon + name + } + stops { + gtfsId + code + desc + lat + lon + name + parentStation { + gtfsId + name + } + vehicleType + vehicleMode + platformCode + __typename + url + routes { + gtfsId + mode + shortName + longName + agency { + name + url + gtfsId + } + } + } +}`; + +exports.query = function(endpoint, query) { + return fetch( + endpoint, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({query}), + } + ).then((response) => response.json()) +} + +exports.queries = { + getAllPoi: getAllPoi +} \ No newline at end of file diff --git a/pelias/importers/process-touristic-poi.js b/pelias/importers/process-touristic-poi.js new file mode 100644 index 00000000..1c458c6d --- /dev/null +++ b/pelias/importers/process-touristic-poi.js @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> +// +// SPDX-License-Identifier: MIT + +const fs = require('fs'); + +const DATA_DIR = __dirname + "/../data/csv-importer"; +const touristicAll = require(DATA_DIR + '/touristic-poi-all.json'); +const touristicFilteredSet = require(DATA_DIR + '/touristic-poi-filtered-set.json'); + +const accomodationAll = require(DATA_DIR + '/accomodation-poi-all.json'); +const accomodationFilteredSet = require(DATA_DIR + '/accomodation-poi-filtered-set.json'); + +const EXPORT_POIS = DATA_DIR + "/touristic-poi.json"; +const EXPORT_ACCOMODATION = DATA_DIR + "/accomodation-poi.json"; +// Index POI by id +const touristicAllIndex = {}; +touristicAll.Items.forEach((item) => { + touristicAllIndex[item.Id] = item; +}); + + +var touristicPois = touristicFilteredSet.Items.map((filteredItem) => { + // Retrieve poi data + let poi = touristicAllIndex[filteredItem.Id]; + + if(!poi) { + console.log("Missing poi", filteredItem); + } + + return poi; +}).filter((poi) => { + return poi; +}); + +// Write poi to file +fs.writeFileSync(EXPORT_POIS, JSON.stringify(touristicPois, null, 2)); +delete touristicPois; +delete touristicAllIndex; + +// Index accomodation by id +const accomodationIndex = {}; +accomodationAll.Items.forEach((item) => { + accomodationIndex[item.Id] = item; +}); + +var accomodationPois = accomodationFilteredSet.Items.map((filteredItem) => { + // Retrieve poi data + let poi = accomodationIndex[filteredItem.Id]; + + if(!poi) { + console.log("Missing poi", filteredItem); + } + + return poi; +}).filter((poi) => { + return poi; +}); + +// Write poi to file +fs.writeFileSync(EXPORT_ACCOMODATION, JSON.stringify(accomodationPois, null, 2)); \ No newline at end of file diff --git a/pelias/pelias.json b/pelias/pelias.json new file mode 100644 index 00000000..6951eed2 --- /dev/null +++ b/pelias/pelias.json @@ -0,0 +1,68 @@ +{ + "logger": { + "level": "debug", + "timestamp": false + }, + "esclient": { + "apiVersion": "7.5", + "hosts": [ + { "host": "elasticsearch" } + ] + }, + "elasticsearch": { + "settings": { + "index": { + "refresh_interval": "10s", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + }, + "api": { + "targets": { + "csv": ["stops","venue"], + "auto_discover": true + }, + "services": { + "pip": { "url": "http://pip:4200" }, + "libpostal": { "url": "http://libpostal:4400" }, + "placeholder": { "url": "http://placeholder:4100" }, + "interpolation": { "url": "http://interpolation:4300" } + } + }, + "imports": { + "adminLookup": { + "enabled": true + }, + "openstreetmap": { + "download": [ + { "sourceURL": "https://download.geofabrik.de/europe/italy/nord-est-latest.osm.pbf" } + ], + "leveldbpath": "/tmp", + "datapath": "/data/openstreetmap", + "import": [{ + "filename": "nord-est-latest.osm.pbf" + }] + }, + "csv": { + "datapath": "/data/csv-importer", + "files": ["stops.csv", "accomodation-poi.csv", "touristic-poi.csv"], + "download": [ + ] + }, + "openaddresses": { + "datapath": "/data/openaddresses", + "files": ["it/32/south-tyrol-it.csv"] + }, + "polyline": { + "datapath": "/data/polylines", + "files": [ "extract.0sv" ] + }, + "whosonfirst": { + "datapath": "/data/whosonfirst", + "countryCode": "IT", + "importPostalcodes": true, + "importPlace": [ "85685271" ] + } + } +} diff --git a/pelias/pelias.json.license b/pelias/pelias.json.license new file mode 100644 index 00000000..3fe3e221 --- /dev/null +++ b/pelias/pelias.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2024 routeRANK <info@routerank.com> + +SPDX-License-Identifier: MIT diff --git a/web-demo/.eslintrc.js b/web-demo/.eslintrc.js index 24c81065..e676b7b8 100644 --- a/web-demo/.eslintrc.js +++ b/web-demo/.eslintrc.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT module.exports = { diff --git a/web-demo/.gitignore b/web-demo/.gitignore index f9a46088..5c27885c 100644 --- a/web-demo/.gitignore +++ b/web-demo/.gitignore @@ -1,3 +1,5 @@ +# SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +# # SPDX-License-Identifier: MIT node_modules diff --git a/web-demo/README.md b/web-demo/README.md index 4d0719fe..0ec30179 100644 --- a/web-demo/README.md +++ b/web-demo/README.md @@ -1,4 +1,6 @@ <!-- +SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + SPDX-License-Identifier: MIT --> diff --git a/web-demo/craco-icons.js b/web-demo/craco-icons.js index 8a269677..5655908f 100644 --- a/web-demo/craco-icons.js +++ b/web-demo/craco-icons.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT import PropTypes from 'prop-types' diff --git a/web-demo/craco.config.js b/web-demo/craco.config.js index 7ac882d0..1aa8394d 100644 --- a/web-demo/craco.config.js +++ b/web-demo/craco.config.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT const path = require('path') diff --git a/web-demo/lib/app/.babelrc.json.license b/web-demo/lib/app/.babelrc.json.license index 59d7f405..02e2fcfc 100644 --- a/web-demo/lib/app/.babelrc.json.license +++ b/web-demo/lib/app/.babelrc.json.license @@ -1 +1,3 @@ +SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + SPDX-License-Identifier: MIT diff --git a/web-demo/lib/app/app.js b/web-demo/lib/app/app.js index f0fcbf5c..9e953159 100644 --- a/web-demo/lib/app/app.js +++ b/web-demo/lib/app/app.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT // TODO: Typescript diff --git a/web-demo/lib/app/components/example.js b/web-demo/lib/app/components/example.js index fd6b8ed8..6cd6f942 100644 --- a/web-demo/lib/app/components/example.js +++ b/web-demo/lib/app/components/example.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT /* eslint-disable react/prop-types */ diff --git a/web-demo/lib/app/config.js b/web-demo/lib/app/config.js index a29e23ec..7c45a487 100644 --- a/web-demo/lib/app/config.js +++ b/web-demo/lib/app/config.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT /** diff --git a/web-demo/lib/app/example.css b/web-demo/lib/app/example.css index fbe73858..bba77548 100644 --- a/web-demo/lib/app/example.css +++ b/web-demo/lib/app/example.css @@ -1,4 +1,6 @@ /* + * SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + * * SPDX-License-Identifier: MIT */ diff --git a/web-demo/lib/app/index.css b/web-demo/lib/app/index.css index 4b02e312..2ea7f91f 100644 --- a/web-demo/lib/app/index.css +++ b/web-demo/lib/app/index.css @@ -1,4 +1,6 @@ /* + * SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + * * SPDX-License-Identifier: MIT */ diff --git a/web-demo/lib/app/index.js b/web-demo/lib/app/index.js index 849fb062..2944b88e 100644 --- a/web-demo/lib/app/index.js +++ b/web-demo/lib/app/index.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT /* eslint-disable prettier/prettier */ diff --git a/web-demo/lib/app/index.tpl.html b/web-demo/lib/app/index.tpl.html index 5f6185bd..994492fb 100644 --- a/web-demo/lib/app/index.tpl.html +++ b/web-demo/lib/app/index.tpl.html @@ -1,4 +1,6 @@ <!-- +SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + SPDX-License-Identifier: MIT --> diff --git a/web-demo/lib/app/main.js b/web-demo/lib/app/main.js index 3bd11081..b28650a1 100644 --- a/web-demo/lib/app/main.js +++ b/web-demo/lib/app/main.js @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +// // SPDX-License-Identifier: MIT // import this polyfill in order to make webapp compatible with IE 11 diff --git a/web-demo/lib/config.yml b/web-demo/lib/config.yml index 7e9ab2f5..830d3871 100644 --- a/web-demo/lib/config.yml +++ b/web-demo/lib/config.yml @@ -1,3 +1,5 @@ +# SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> +# # SPDX-License-Identifier: MIT branding: Merano - Alto Adige/Suedtirol diff --git a/web-demo/package.json.license b/web-demo/package.json.license index 59d7f405..02e2fcfc 100644 --- a/web-demo/package.json.license +++ b/web-demo/package.json.license @@ -1 +1,3 @@ +SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + SPDX-License-Identifier: MIT diff --git a/web-demo/tsconfig.json.license b/web-demo/tsconfig.json.license index 59d7f405..02e2fcfc 100644 --- a/web-demo/tsconfig.json.license +++ b/web-demo/tsconfig.json.license @@ -1 +1,3 @@ +SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + SPDX-License-Identifier: MIT diff --git a/web-demo/yarn.lock.license b/web-demo/yarn.lock.license index 59d7f405..02e2fcfc 100644 --- a/web-demo/yarn.lock.license +++ b/web-demo/yarn.lock.license @@ -1 +1,3 @@ +SPDX-FileCopyrightText: 2024 Conveyal <support@conveyal.com> + SPDX-License-Identifier: MIT