From 9e15e9241e67309168bb80c05972fc9b0a3848f8 Mon Sep 17 00:00:00 2001 From: Jakob Schnell Date: Fri, 29 Nov 2024 14:39:00 +0100 Subject: [PATCH 01/28] feat: add vitepress-versioning and update vitepress, while we're at it. --- docs/.vitepress/config.js | 18 +- package-lock.json | 680 +++++++++++++++++++++++++++----------- package.json | 5 +- 3 files changed, 506 insertions(+), 197 deletions(-) diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index 4d6040d72e..ac19e32e4c 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -1,7 +1,8 @@ import {withMermaid} from "vitepress-plugin-mermaid"; +import defineVersionedConfig from 'vitepress-versioning-plugin' // https://vitepress.dev/reference/site-config -export default withMermaid({ +export default withMermaid(defineVersionedConfig({ mermaid: { // refer https://mermaid.js.org/config/setup/modules/mermaidAPI.html#mermaidapi-configuration-defaults for options }, @@ -57,7 +58,8 @@ export default withMermaid({ quote: 'We recently reworked most of our documentation. You probably ended up here by clicking an old link somewhere, e.g. in the forum. Let us know how you got here and we\'ll fix it. Click the link below and check "Getting Started" - this will help you figure out where to find what you came for.', linkText: 'Documentation Home', }, - sidebar: [ + sidebar: { + '/': [ { text: 'Home', link: '/', items: [ @@ -214,12 +216,18 @@ export default withMermaid({ {text: 'FAQ', link: '/frequently-asked-questions'} ] } - ], + ]}, socialLinks: [ {icon: 'github', link: 'https://github.com/GIScience/openrouteservice'} ], footer: { message: 'openrouteservice is part of HeiGIT gGmbH and Universität Heidelberg GIScience research group. | Imprint' } - } -}) + }, + + + versioning: { + latestVersion: "9.0.0", + }, + +}, __dirname )) diff --git a/package-lock.json b/package-lock.json index 432e63d427..47ac4ba555 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,9 +4,12 @@ "requires": true, "packages": { "": { + "dependencies": { + "vitepress-versioning-plugin": "^1.2.1" + }, "devDependencies": { "mermaid": "^11.3.0", - "vitepress": "^1.0.0-rc.30", + "vitepress": "^1.5.0", "vitepress-plugin-mermaid": "^2.0.17" } }, @@ -14,7 +17,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", @@ -25,7 +27,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.9.3" @@ -38,7 +39,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.9.3" @@ -52,7 +52,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "dev": true, "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -63,7 +62,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0" @@ -73,14 +71,12 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "dev": true, "license": "MIT" }, "node_modules/@algolia/cache-in-memory": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0" @@ -90,7 +86,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -102,7 +97,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", @@ -113,7 +107,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -125,7 +118,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -138,7 +130,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", @@ -149,7 +140,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -161,7 +151,6 @@ "version": "5.10.2", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.10.2.tgz", "integrity": "sha512-eE4OaTlb5KZdCehWmDARq2KEmMF7DEeFLjKqFDcZNb56k1DMSsa9zCQRXZMovlf2AXLsx0A/1q+SGAEgzF7G3w==", - "dev": true, "license": "MIT", "peer": true, "engines": { @@ -172,7 +161,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -184,7 +172,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", @@ -195,7 +182,6 @@ "version": "5.10.2", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.10.2.tgz", "integrity": "sha512-rGX8uil2uvPycFgtS9Fzwvh4tgKvfFWG5RIh3E77W42HrO66bykCf9jHqhIIlCxdDJih1PuUqBYZIkIAAoSkww==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -212,14 +198,12 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "dev": true, "license": "MIT" }, "node_modules/@algolia/logger-console": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/logger-common": "4.24.0" @@ -229,7 +213,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", @@ -249,7 +232,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", @@ -260,7 +242,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -272,7 +253,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" @@ -282,7 +262,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" @@ -292,7 +271,6 @@ "version": "5.10.2", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.10.2.tgz", "integrity": "sha512-gzlfE/H05ggDiEWNi8WaDSRhpE5X8rD1JqYKPPeM31JRI3TutQIKAk3MSUsa1bHM/Di56r2Gm6L1g3ZlZv2ETA==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -306,14 +284,12 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "dev": true, "license": "MIT" }, "node_modules/@algolia/requester-fetch": { "version": "5.10.2", "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.10.2.tgz", "integrity": "sha512-Q27ciW9WRdq3pUITVlxpHIwe9QWOe+oPvgs8Z+gsv8vMkwXnLfANvSgeZCyQgx3SqzUPzhel0ozVq7Qoh8xIkg==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -327,7 +303,6 @@ "version": "5.10.2", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.10.2.tgz", "integrity": "sha512-WMUQ4iFhNnQXC4F1Yj51x8tgIvq5h8jtTLMBs7LbMiW6JhnLHfBVl7IVk6X1fZJO5YcvXW051HN8aFlfAb5QEw==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -341,7 +316,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0", @@ -377,7 +351,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -387,7 +360,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -397,7 +369,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.25.9" @@ -413,7 +384,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -478,14 +448,12 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.2.tgz", "integrity": "sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw==", - "dev": true, "license": "MIT" }, "node_modules/@docsearch/js": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.2.tgz", "integrity": "sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA==", - "dev": true, "license": "MIT", "dependencies": { "@docsearch/react": "3.6.2", @@ -496,7 +464,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.2.tgz", "integrity": "sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.9.3", @@ -532,7 +499,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -542,6 +508,15 @@ "node": ">=12" } }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.13.tgz", + "integrity": "sha512-rRQjMoIt/kPfaD+fnBC9YZQpso3hkn8xPeadl+YWhscJ5SVUCdB9oTeR9VIpt+/5Yi8vEkh2UOWFPq4lz3ee2A==", + "dev": true, + "dependencies": { + "@iconify/types": "*" + } + }, "node_modules/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", @@ -569,7 +544,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@mermaid-js/mermaid-mindmap": { @@ -614,7 +588,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -628,7 +601,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -636,59 +608,49 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.1.tgz", - "integrity": "sha512-bqAhT/Ri5ixV4oYsvJNH8UJjpjbINWlWyXY6tBTsP4OmD6XnFv43nRJ+lTdxd2rmG5pgam/x+zGR6kLRXrpEKA==", - "dev": true, - "license": "MIT", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.0.tgz", + "integrity": "sha512-6pvdH0KoahMzr6689yh0QJ3rCgF4j1XsXRHNEeEN6M4xJTfQ6QPWrmHzIddotg+xPJUPEPzYzYCKzpYyhTI6Gw==", "dependencies": { - "@shikijs/engine-javascript": "1.22.1", - "@shikijs/engine-oniguruma": "1.22.1", - "@shikijs/types": "1.22.1", + "@shikijs/engine-javascript": "1.24.0", + "@shikijs/engine-oniguruma": "1.24.0", + "@shikijs/types": "1.24.0", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.1.tgz", - "integrity": "sha512-540pyoy0LWe4jj2BVbgELwOFu1uFvRI7lg4hdsExrSXA9x7gqfzZ/Nnh4RfX86aDAgJ647gx4TCmRwACbnQSvw==", - "dev": true, - "license": "MIT", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.0.tgz", + "integrity": "sha512-ZA6sCeSsF3Mnlxxr+4wGEJ9Tto4RHmfIS7ox8KIAbH0MTVUkw3roHPHZN+LlJMOHJJOVupe6tvuAzRpN8qK1vA==", "dependencies": { - "@shikijs/types": "1.22.1", + "@shikijs/types": "1.24.0", "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-js": "0.4.3" + "oniguruma-to-es": "0.7.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.1.tgz", - "integrity": "sha512-L+1Vmd+a2kk8HtogUFymQS6BjUfJnzcWoUp1BUgxoDiklbKSMvrsMuLZGevTOP1m0rEjgnC5MsDmsr8lX1lC+Q==", - "dev": true, - "license": "MIT", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.0.tgz", + "integrity": "sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==", "dependencies": { - "@shikijs/types": "1.22.1", + "@shikijs/types": "1.24.0", "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/transformers": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.22.1.tgz", - "integrity": "sha512-KvG49YFV6gV116sC4L3Sn1Rp6HXsioMKBBG373j088rw849440hm8s2r+/dgjsGLvT4p+QB7newev+5a3ARM6w==", - "dev": true, - "license": "MIT", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.24.0.tgz", + "integrity": "sha512-Qf/hby+PRPkoHncjYnJf5svK1aCsOUtQhuLzKPnmeXJtuUZCmbH0pTpdNtXe9tgln/RHlyRJnv7q46HHS1sO0Q==", "dependencies": { - "shiki": "1.22.1" + "shiki": "1.24.0" } }, "node_modules/@shikijs/types": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.1.tgz", - "integrity": "sha512-+45f8mu/Hxqs6Kyhfm98Nld5n7Q7lwhjU8UtdQwrOPs7BnM4VAb929O3IQ2ce+4D7SlNFlZGd8CnKRSnwbQreQ==", - "dev": true, - "license": "MIT", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.0.tgz", + "integrity": "sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==", "dependencies": { "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" @@ -698,7 +660,6 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", - "dev": true, "license": "MIT" }, "node_modules/@types/d3": { @@ -999,7 +960,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { @@ -1013,7 +973,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" @@ -1023,14 +982,17 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==" + }, "node_modules/@types/markdown-it": { "version": "14.1.2", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, "license": "MIT", "dependencies": { "@types/linkify-it": "^5", @@ -1041,7 +1003,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" @@ -1051,7 +1012,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, "license": "MIT" }, "node_modules/@types/trusted-types": { @@ -1065,28 +1025,24 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, "license": "MIT" }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, "license": "ISC" }, "node_modules/@vitejs/plugin-vue": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", - "dev": true, "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -1100,7 +1056,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", @@ -1114,7 +1069,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.12", @@ -1125,7 +1079,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", @@ -1143,7 +1096,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.12", @@ -1154,7 +1106,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.5.4.tgz", "integrity": "sha512-j9UC/KeYUNZ6AyCJxBROBCbogB5YHW6PZv9VnCNp2ntE4rq426Lfc8WP5B9V+rXBwqWmrgZTGYBa31CBSxdAUg==", - "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-kit": "^7.5.4" @@ -1164,7 +1115,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.5.4.tgz", "integrity": "sha512-0i7WFgc1B2TL52tstn82zlb9opSA0aIiHfkUYFXtZb8CIpmlFMTkHtgwVl6PMWNBj3LNhYou1YJCLpCYvJYYoA==", - "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-shared": "^7.5.4", @@ -1180,7 +1130,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.5.4.tgz", "integrity": "sha512-dwuq4YmwTyLc7eBOqX63s3JB8il7qnKsNgENglSMkUPwiItHkVAYYfPESN1rxSdYkl1RCux1l5TBidYqfUDNAA==", - "dev": true, "license": "MIT", "dependencies": { "rfdc": "^1.4.1" @@ -1190,7 +1139,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", - "dev": true, "license": "MIT", "dependencies": { "@vue/shared": "3.5.12" @@ -1200,7 +1148,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", - "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.12", @@ -1211,7 +1158,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", - "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.12", @@ -1224,7 +1170,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.5.12", @@ -1238,7 +1183,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", - "dev": true, "license": "MIT" }, "node_modules/@vueuse/core": { @@ -1445,7 +1389,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", @@ -1469,7 +1412,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", @@ -1480,7 +1422,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", @@ -1492,7 +1433,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" @@ -1502,7 +1442,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dev": true, "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" @@ -1512,7 +1451,6 @@ "version": "0.2.19", "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -1522,7 +1460,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1533,7 +1470,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1544,7 +1480,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1579,11 +1514,25 @@ "chevrotain": "^11.0.0" } }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1611,7 +1560,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dev": true, "license": "MIT", "dependencies": { "is-what": "^4.1.8" @@ -1637,7 +1585,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/cytoscape": { @@ -1693,6 +1640,18 @@ "dev": true, "license": "MIT" }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -2220,7 +2179,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -2230,7 +2188,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -2247,11 +2204,15 @@ "dev": true, "license": "(MPL-2.0 OR Apache-2.0)" }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -2260,11 +2221,58 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -2299,18 +2307,47 @@ "@esbuild/win32-x64": "0.21.5" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, "license": "MIT" }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/focus-trap": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz", "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==", - "dev": true, "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -2327,7 +2364,6 @@ "version": "9.0.3", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", - "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -2351,7 +2387,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -2365,14 +2400,12 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, "license": "MIT" }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -2402,11 +2435,15 @@ "node": ">=12" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.13" @@ -2415,6 +2452,17 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/katex": { "version": "0.16.11", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", @@ -2496,6 +2544,11 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", @@ -2503,11 +2556,18 @@ "dev": true, "license": "MIT" }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, "node_modules/magic-string": { "version": "0.30.12", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -2516,8 +2576,7 @@ "node_modules/mark.js": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" }, "node_modules/marked": { "version": "13.0.3", @@ -2536,7 +2595,6 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -2554,6 +2612,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/mermaid": { "version": "11.4.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.0.tgz", @@ -2588,7 +2664,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -2609,7 +2684,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -2626,7 +2700,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -2648,7 +2721,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -2665,7 +2737,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -2682,14 +2753,12 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.0.tgz", "integrity": "sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==", - "dev": true, "license": "MIT" }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, "license": "MIT" }, "node_modules/mlly": { @@ -2716,7 +2785,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -2731,6 +2799,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", @@ -2739,17 +2812,14 @@ "license": "MIT", "optional": true }, - "node_modules/oniguruma-to-js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", - "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", - "dev": true, - "license": "MIT", + "node_modules/oniguruma-to-es": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz", + "integrity": "sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==", "dependencies": { - "regex": "^4.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "emoji-regex-xs": "^1.0.0", + "regex": "^5.0.2", + "regex-recursion": "^4.3.0" } }, "node_modules/package-manager-detector": { @@ -2777,14 +2847,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/pkg-types": { @@ -2821,7 +2889,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2850,7 +2917,6 @@ "version": "10.24.3", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", - "dev": true, "license": "MIT", "funding": { "type": "opencollective", @@ -2861,7 +2927,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -2869,17 +2934,30 @@ } }, "node_modules/regex": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", - "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==", - "dev": true, - "license": "MIT" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz", + "integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.3.0.tgz", + "integrity": "sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, "license": "MIT" }, "node_modules/robust-predicates": { @@ -2893,7 +2971,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -2956,21 +3033,18 @@ "version": "2.17.2", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", - "dev": true, "license": "MIT", "peer": true }, "node_modules/shiki": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.1.tgz", - "integrity": "sha512-PbJ6XxrWLMwB2rm3qdjIHNm3zq4SfFnOx0B3rEoi4AN8AUngsdyZ1tRe5slMPtn6jQkbUURLNZPpLR7Do3k78g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "1.22.1", - "@shikijs/engine-javascript": "1.22.1", - "@shikijs/engine-oniguruma": "1.22.1", - "@shikijs/types": "1.22.1", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.0.tgz", + "integrity": "sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==", + "dependencies": { + "@shikijs/core": "1.24.0", + "@shikijs/engine-javascript": "1.24.0", + "@shikijs/engine-oniguruma": "1.24.0", + "@shikijs/types": "1.24.0", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } @@ -2979,7 +3053,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -2989,7 +3062,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -3000,7 +3072,6 @@ "version": "14.0.1", "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3010,7 +3081,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", @@ -3032,7 +3102,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", - "dev": true, "license": "MIT", "dependencies": { "copy-anything": "^3.0.2" @@ -3045,9 +3114,20 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "dev": true, "license": "MIT" }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/tinyexec": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", @@ -3059,7 +3139,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -3076,6 +3155,11 @@ "node": ">=6.10" } }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, "node_modules/ufo": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", @@ -3087,7 +3171,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -3101,7 +3184,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -3115,7 +3197,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -3129,7 +3210,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -3145,7 +3225,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -3174,7 +3253,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -3189,7 +3267,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -3204,7 +3281,6 @@ "version": "5.4.10", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", - "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", @@ -3261,28 +3337,28 @@ } }, "node_modules/vitepress": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.4.1.tgz", - "integrity": "sha512-C2rQ7PMlDVqgsaHOa0uJtgGGWaGv74QMaGL62lxKbtFkYtosJB5HAfZ8+pEbfzzvLemYaYwaiQdFLBlexK2sFw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.5.0.tgz", + "integrity": "sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==", "dev": true, - "license": "MIT", "dependencies": { "@docsearch/css": "^3.6.2", "@docsearch/js": "^3.6.2", - "@shikijs/core": "^1.22.0", - "@shikijs/transformers": "^1.22.0", - "@shikijs/types": "^1.22.0", + "@iconify-json/simple-icons": "^1.2.10", + "@shikijs/core": "^1.22.2", + "@shikijs/transformers": "^1.22.2", + "@shikijs/types": "^1.22.2", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.1.4", - "@vue/devtools-api": "^7.4.6", + "@vue/devtools-api": "^7.5.4", "@vue/shared": "^3.5.12", "@vueuse/core": "^11.1.0", "@vueuse/integrations": "^11.1.0", "focus-trap": "^7.6.0", "mark.js": "8.11.1", "minisearch": "^7.1.0", - "shiki": "^1.22.0", - "vite": "^5.4.8", + "shiki": "^1.22.2", + "vite": "^5.4.10", "vue": "^3.5.12" }, "bin": { @@ -3315,6 +3391,230 @@ "vitepress": "^1.0.0 || ^1.0.0-alpha" } }, + "node_modules/vitepress-versioning-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vitepress-versioning-plugin/-/vitepress-versioning-plugin-1.2.1.tgz", + "integrity": "sha512-qWYs7qWAJf2aDzHNkzrbcX5FY5RIPINcA/d6TDg5S6Z1urHbhh044/oQyKtl70Ds+vtyH5/uN1GHmyIhbmA8MA==", + "dependencies": { + "@types/lodash": "^4.17.7", + "cli-color": "^2.0.4", + "json5": "^2.2.3", + "lodash": "^4.17.21", + "vite": "^5.3.4", + "vitepress": "1.3.1" + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/integrations": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.1.tgz", + "integrity": "sha512-Y5hCGBguN+vuVYTZmdd/IMXLOdfS60zAmDmFYc4BKBcMUPZH1n4tdyDECCPjXm0bNT3ZRUy1xzTLGaUje8Xyaw==", + "dependencies": { + "@vueuse/core": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^4", + "drauu": "^0.3", + "focus-trap": "^7", + "fuse.js": "^6", + "idb-keyval": "^6", + "jwt-decode": "^3", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^6" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vitepress-versioning-plugin/node_modules/vitepress": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.3.1.tgz", + "integrity": "sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==", + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.10.3", + "@shikijs/transformers": "^1.10.3", + "@types/markdown-it": "^14.1.1", + "@vitejs/plugin-vue": "^5.0.5", + "@vue/devtools-api": "^7.3.5", + "@vue/shared": "^3.4.31", + "@vueuse/core": "^10.11.0", + "@vueuse/integrations": "^10.11.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^7.0.0", + "shiki": "^1.10.3", + "vite": "^5.3.3", + "vue": "^3.4.31" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -3374,7 +3674,6 @@ "version": "3.5.12", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.12", @@ -3396,7 +3695,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, "license": "MIT", "funding": { "type": "github", diff --git a/package.json b/package.json index e7a84565cd..51900445d6 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "type": "module", "devDependencies": { - "vitepress": "^1.0.0-rc.30", "mermaid": "^11.3.0", + "vitepress": "^1.5.0", "vitepress-plugin-mermaid": "^2.0.17" }, "scripts": { @@ -10,5 +10,8 @@ "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", "build-preview": "vitepress build docs && vitepress preview docs" + }, + "dependencies": { + "vitepress-versioning-plugin": "^1.2.1" } } From e41ca03fae93b837332d949b1fc09d21f9c44148 Mon Sep 17 00:00:00 2001 From: Jakob Schnell Date: Fri, 29 Nov 2024 15:01:13 +0100 Subject: [PATCH 02/28] fix: try '/' as object, with items-array, instead of array --- docs/.vitepress/config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index ac19e32e4c..cc12e40bdc 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -59,7 +59,8 @@ export default withMermaid(defineVersionedConfig({ linkText: 'Documentation Home', }, sidebar: { - '/': [ + '/': { + items: [ { text: 'Home', link: '/', items: [ @@ -223,6 +224,7 @@ export default withMermaid(defineVersionedConfig({ footer: { message: 'openrouteservice is part of HeiGIT gGmbH and Universität Heidelberg GIScience research group. | Imprint' } + } }, From eb9c48810d4c11a49009152b877811aa8efc90fa Mon Sep 17 00:00:00 2001 From: Jakob Schnell Date: Fri, 29 Nov 2024 15:32:15 +0100 Subject: [PATCH 03/28] feat: add v7 and template --- docs/.vitepress/sidebars/versioned/7.json | 124 ++++++++++++++++++ .../sidebars/versioned/template.json | 124 ++++++++++++++++++ 2 files changed, 248 insertions(+) create mode 100644 docs/.vitepress/sidebars/versioned/7.json create mode 100644 docs/.vitepress/sidebars/versioned/template.json diff --git a/docs/.vitepress/sidebars/versioned/7.json b/docs/.vitepress/sidebars/versioned/7.json new file mode 100644 index 0000000000..d0d0a778e4 --- /dev/null +++ b/docs/.vitepress/sidebars/versioned/7.json @@ -0,0 +1,124 @@ +[ + { + "text": "Home", "link": "/", + "items": [ + {"text": "Getting Started 7", "link": "./getting-started"}, + { + "text": "API Reference", "collapsed": true, "link": "/api-reference/", + "items": [ + { + "text": "Endpoints", "collapsed": true, "link": "/api-reference/endpoints/", + "items": [ + { + "text": "Directions", "collapsed": true, "link": "/api-reference/endpoints/directions/", + "items": [ + {"text": "Requests and Return Types", "link": "/api-reference/endpoints/directions/requests-and-return-types"}, + {"text": "Routing Options", "link": "/api-reference/endpoints/directions/routing-options"}, + { + "text": "Extra info", "collapsed": true, "link": "/api-reference/endpoints/directions/extra-info/", + "items": [ + {"text": "Steepness IDs", "link": "/api-reference/endpoints/directions/extra-info/steepness"}, + {"text": "Surface IDs", "link": "/api-reference/endpoints/directions/extra-info/surface"}, + {"text": "Category IDs", "link": "/api-reference/endpoints/directions/extra-info/waycategory"}, + {"text": "Type IDs", "link": "/api-reference/endpoints/directions/extra-info/waytype"}, + {"text": "Difficulty IDs", "link": "/api-reference/endpoints/directions/extra-info/trail-difficulty"}, + {"text": "Restriction IDs", "link": "/api-reference/endpoints/directions/extra-info/road-access-restrictions"}, + {"text": "Country IDs", "link": "/technical-details/country-list"} + ] + }, + {"text": "Route Attributes", "link": "/api-reference/endpoints/directions/route-attributes"}, + {"text": "Geometry Decoding", "link": "/api-reference/endpoints/directions/geometry-decoding"}, + {"text": "Instruction Types", "link": "/api-reference/endpoints/directions/instruction-types"} + ] + }, + {"text": "Isochrones", "link": "/api-reference/endpoints/isochrones/"}, + {"text": "Matrix", "link": "/api-reference/endpoints/matrix/"}, + {"text": "Snapping (not live)", "link": "/api-reference/endpoints/snapping/"}, + {"text": "Export (not live)", "link": "/api-reference/endpoints/export/"}, + {"text": "Health (not live)", "link": "/api-reference/endpoints/health/"}, + {"text": "Status (not live)", "link": "/api-reference/endpoints/status/"}, + {"text": "POI", "link": "/api-reference/endpoints/poi/"}, + {"text": "Elevation", "link": "/api-reference/endpoints/elevation/"}, + {"text": "Geocoder", "link": "/api-reference/endpoints/geocoder/"}, + {"text": "Optimization", "link": "/api-reference/endpoints/optimization/"} + ] + }, + {"text": "Error Codes", "link": "/api-reference/error-codes"} + ] + }, + { + "text": "Run ORS instance", "collapsed": true, "link": "/run-instance/", + "items": [ + {"text": "System Requirements", "link": "/run-instance/system-requirements"}, + {"text": "Data", "link": "/run-instance/data"}, + { + "text": "Installation", "collapsed": true, "link": "/run-instance/installation/", + "items": [ + {"text": "Running with Docker", "link": "/run-instance/installation/running-with-docker"}, + {"text": "Running JAR / WAR", "link": "/run-instance/installation/running-jar-war"}, + {"text": "Building from Source", "link": "/run-instance/installation/building-from-source"} + ] + }, + { + "text": "Configuration", "collapsed": true, "link": "/run-instance/configuration/", + "items": [ + {"text": "Spring Properties", "link": "/run-instance/configuration/spring/", "collapsed":true, + "items": [ + {"text": "server", "link": "/run-instance/configuration/spring/server.md"}, + {"text": "logging", "link": "/run-instance/configuration/spring/logging.md"} + ] + }, + {"text": "ORS Properties", "collapsed":true, + "items": [ + {"text": "endpoints", "link": "/run-instance/configuration/ors/endpoints/", "collapsed": true, + "items": [ + {"text": "defaults", "link": "/run-instance/configuration/ors/endpoints/defaults.md"}, + {"text": "routing", "link": "/run-instance/configuration/ors/endpoints/routing.md"}, + {"text": "matrix", "link": "/run-instance/configuration/ors/endpoints/matrix.md"}, + {"text": "isochrones", "link": "/run-instance/configuration/ors/endpoints/isochrones.md"}, + {"text": "snap", "link": "/run-instance/configuration/ors/endpoints/snap.md"} + ] + }, + {"text": "engine", "link": "/run-instance/configuration/ors/engine/", "collapsed": true, + "items": [ + {"text": "profiles", "link": "/run-instance/configuration/ors/engine/profiles.md"}, + {"text": "elevation", "link": "/run-instance/configuration/ors/engine/elevation.md"} + ] + }, + {"text": "cors", "link": "/run-instance/configuration/ors/cors/"}, + {"text": "messages", "link": "/run-instance/configuration/ors/messages/"} + ] + }, + {"text": "JSON config (deprecated)", "link":"/run-instance/configuration/json.md"} + ] + } + ] + }, + { + "text": "Contributing", "collapsed": true, "link": "/contributing/", + "items": [ + {"text": "Opening project in IntelliJ", "link": "/contributing/opening-project-in-intellij"}, + {"text": "Backend documentation", "link": "/contributing/backend-documentation"}, + {"text": "Contribution guidelines", "link": "https://github.com/GIScience/openrouteservice/blob/main/CONTRIBUTE.md"}, + {"text": "Contributing translations", "link": "/contributing/contributing-translations"} + ] + }, + { + "text": "Technical details", "collapsed": true, "link": "/technical-details/", + "items": [ + {"text": "Country List", "link": "/technical-details/country-list"}, + {"text": "Travel Speeds", "link": "/technical-details/travel-speeds/", + "items": [ + {"text": "Country Speeds", "link": "/technical-details/travel-speeds/country-speeds.md"}, + {"text": "Tracktype Speeds", "link": "/technical-details/travel-speeds/tracktype-speeds.md"}, + {"text": "Waytype Speeds", "link": "/technical-details/travel-speeds/waytype-speeds.md"}, + {"text": "Surface Speeds", "link": "/technical-details/travel-speeds/surface-speeds.md"} + ] + }, + {"text": "Tag Filtering", "link": "/technical-details/tag-filtering"} + ] + }, + {"text": "FAQ", "link": "/frequently-asked-questions"} + ] + } +] diff --git a/docs/.vitepress/sidebars/versioned/template.json b/docs/.vitepress/sidebars/versioned/template.json new file mode 100644 index 0000000000..2ab82e4ab6 --- /dev/null +++ b/docs/.vitepress/sidebars/versioned/template.json @@ -0,0 +1,124 @@ +[ + { + "text": "Home", "link": "/", + "items": [ + {"text": "Getting Started", "link": "/getting-started"}, + { + "text": "API Reference", "collapsed": true, "link": "/api-reference/", + "items": [ + { + "text": "Endpoints", "collapsed": true, "link": "/api-reference/endpoints/", + "items": [ + { + "text": "Directions", "collapsed": true, "link": "/api-reference/endpoints/directions/", + "items": [ + {"text": "Requests and Return Types", "link": "/api-reference/endpoints/directions/requests-and-return-types"}, + {"text": "Routing Options", "link": "/api-reference/endpoints/directions/routing-options"}, + { + "text": "Extra info", "collapsed": true, "link": "/api-reference/endpoints/directions/extra-info/", + "items": [ + {"text": "Steepness IDs", "link": "/api-reference/endpoints/directions/extra-info/steepness"}, + {"text": "Surface IDs", "link": "/api-reference/endpoints/directions/extra-info/surface"}, + {"text": "Category IDs", "link": "/api-reference/endpoints/directions/extra-info/waycategory"}, + {"text": "Type IDs", "link": "/api-reference/endpoints/directions/extra-info/waytype"}, + {"text": "Difficulty IDs", "link": "/api-reference/endpoints/directions/extra-info/trail-difficulty"}, + {"text": "Restriction IDs", "link": "/api-reference/endpoints/directions/extra-info/road-access-restrictions"}, + {"text": "Country IDs", "link": "/technical-details/country-list"} + ] + }, + {"text": "Route Attributes", "link": "/api-reference/endpoints/directions/route-attributes"}, + {"text": "Geometry Decoding", "link": "/api-reference/endpoints/directions/geometry-decoding"}, + {"text": "Instruction Types", "link": "/api-reference/endpoints/directions/instruction-types"} + ] + }, + {"text": "Isochrones", "link": "/api-reference/endpoints/isochrones/"}, + {"text": "Matrix", "link": "/api-reference/endpoints/matrix/"}, + {"text": "Snapping (not live)", "link": "/api-reference/endpoints/snapping/"}, + {"text": "Export (not live)", "link": "/api-reference/endpoints/export/"}, + {"text": "Health (not live)", "link": "/api-reference/endpoints/health/"}, + {"text": "Status (not live)", "link": "/api-reference/endpoints/status/"}, + {"text": "POI", "link": "/api-reference/endpoints/poi/"}, + {"text": "Elevation", "link": "/api-reference/endpoints/elevation/"}, + {"text": "Geocoder", "link": "/api-reference/endpoints/geocoder/"}, + {"text": "Optimization", "link": "/api-reference/endpoints/optimization/"} + ] + }, + {"text": "Error Codes", "link": "/api-reference/error-codes"} + ] + }, + { + "text": "Run ORS instance", "collapsed": true, "link": "/run-instance/", + "items": [ + {"text": "System Requirements", "link": "/run-instance/system-requirements"}, + {"text": "Data", "link": "/run-instance/data"}, + { + "text": "Installation", "collapsed": true, "link": "/run-instance/installation/", + "items": [ + {"text": "Running with Docker", "link": "/run-instance/installation/running-with-docker"}, + {"text": "Running JAR / WAR", "link": "/run-instance/installation/running-jar-war"}, + {"text": "Building from Source", "link": "/run-instance/installation/building-from-source"} + ] + }, + { + "text": "Configuration", "collapsed": true, "link": "/run-instance/configuration/", + "items": [ + {"text": "Spring Properties", "link": "/run-instance/configuration/spring/", "collapsed":true, + "items": [ + {"text": "server", "link": "/run-instance/configuration/spring/server.md"}, + {"text": "logging", "link": "/run-instance/configuration/spring/logging.md"} + ] + }, + {"text": "ORS Properties", "collapsed":true, + "items": [ + {"text": "endpoints", "link": "/run-instance/configuration/ors/endpoints/", "collapsed": true, + "items": [ + {"text": "defaults", "link": "/run-instance/configuration/ors/endpoints/defaults.md"}, + {"text": "routing", "link": "/run-instance/configuration/ors/endpoints/routing.md"}, + {"text": "matrix", "link": "/run-instance/configuration/ors/endpoints/matrix.md"}, + {"text": "isochrones", "link": "/run-instance/configuration/ors/endpoints/isochrones.md"}, + {"text": "snap", "link": "/run-instance/configuration/ors/endpoints/snap.md"} + ] + }, + {"text": "engine", "link": "/run-instance/configuration/ors/engine/", "collapsed": true, + "items": [ + {"text": "profiles", "link": "/run-instance/configuration/ors/engine/profiles.md"}, + {"text": "elevation", "link": "/run-instance/configuration/ors/engine/elevation.md"} + ] + }, + {"text": "cors", "link": "/run-instance/configuration/ors/cors/"}, + {"text": "messages", "link": "/run-instance/configuration/ors/messages/"} + ] + }, + {"text": "JSON config (deprecated)", "link":"/run-instance/configuration/json.md"} + ] + } + ] + }, + { + "text": "Contributing", "collapsed": true, "link": "/contributing/", + "items": [ + {"text": "Opening project in IntelliJ", "link": "/contributing/opening-project-in-intellij"}, + {"text": "Backend documentation", "link": "/contributing/backend-documentation"}, + {"text": "Contribution guidelines", "link": "https://github.com/GIScience/openrouteservice/blob/main/CONTRIBUTE.md"}, + {"text": "Contributing translations", "link": "/contributing/contributing-translations"} + ] + }, + { + "text": "Technical details", "collapsed": true, "link": "/technical-details/", + "items": [ + {"text": "Country List", "link": "/technical-details/country-list"}, + {"text": "Travel Speeds", "link": "/technical-details/travel-speeds/", + "items": [ + {"text": "Country Speeds", "link": "/technical-details/travel-speeds/country-speeds.md"}, + {"text": "Tracktype Speeds", "link": "/technical-details/travel-speeds/tracktype-speeds.md"}, + {"text": "Waytype Speeds", "link": "/technical-details/travel-speeds/waytype-speeds.md"}, + {"text": "Surface Speeds", "link": "/technical-details/travel-speeds/surface-speeds.md"} + ] + }, + {"text": "Tag Filtering", "link": "/technical-details/tag-filtering"} + ] + }, + {"text": "FAQ", "link": "/frequently-asked-questions"} + ] + } +] From 19d83b66721524bf6970c695472c3d8b7dea6a2d Mon Sep 17 00:00:00 2001 From: Jakob Schnell Date: Fri, 29 Nov 2024 16:10:18 +0100 Subject: [PATCH 04/28] fix: try showing sidebar --- docs/.vitepress/config.js | 13 +- docs/.vitepress/sidebars/versioned/7.json | 246 +++++++++++----------- 2 files changed, 131 insertions(+), 128 deletions(-) diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index cc12e40bdc..2254a17247 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -59,8 +59,8 @@ export default withMermaid(defineVersionedConfig({ linkText: 'Documentation Home', }, sidebar: { - '/': { - items: [ + process: true, + '/': [ { text: 'Home', link: '/', items: [ @@ -217,7 +217,7 @@ export default withMermaid(defineVersionedConfig({ {text: 'FAQ', link: '/frequently-asked-questions'} ] } - ]}, + ], socialLinks: [ {icon: 'github', link: 'https://github.com/GIScience/openrouteservice'} ], @@ -229,7 +229,12 @@ export default withMermaid(defineVersionedConfig({ versioning: { - latestVersion: "9.0.0", + latestVersion: "9.0.0", + sidebars: { + processSidebarURLs: true, + sidebarPathResolver: (version) => `.vitepress/sidebars/versioned/${version}.json`, + sidebarUrlProcessor: (url, version) => `/${version}${url}` + }, }, }, __dirname )) diff --git a/docs/.vitepress/sidebars/versioned/7.json b/docs/.vitepress/sidebars/versioned/7.json index d0d0a778e4..3ff74ce288 100644 --- a/docs/.vitepress/sidebars/versioned/7.json +++ b/docs/.vitepress/sidebars/versioned/7.json @@ -1,124 +1,122 @@ -[ - { - "text": "Home", "link": "/", - "items": [ - {"text": "Getting Started 7", "link": "./getting-started"}, - { - "text": "API Reference", "collapsed": true, "link": "/api-reference/", - "items": [ - { - "text": "Endpoints", "collapsed": true, "link": "/api-reference/endpoints/", - "items": [ - { - "text": "Directions", "collapsed": true, "link": "/api-reference/endpoints/directions/", - "items": [ - {"text": "Requests and Return Types", "link": "/api-reference/endpoints/directions/requests-and-return-types"}, - {"text": "Routing Options", "link": "/api-reference/endpoints/directions/routing-options"}, - { - "text": "Extra info", "collapsed": true, "link": "/api-reference/endpoints/directions/extra-info/", - "items": [ - {"text": "Steepness IDs", "link": "/api-reference/endpoints/directions/extra-info/steepness"}, - {"text": "Surface IDs", "link": "/api-reference/endpoints/directions/extra-info/surface"}, - {"text": "Category IDs", "link": "/api-reference/endpoints/directions/extra-info/waycategory"}, - {"text": "Type IDs", "link": "/api-reference/endpoints/directions/extra-info/waytype"}, - {"text": "Difficulty IDs", "link": "/api-reference/endpoints/directions/extra-info/trail-difficulty"}, - {"text": "Restriction IDs", "link": "/api-reference/endpoints/directions/extra-info/road-access-restrictions"}, - {"text": "Country IDs", "link": "/technical-details/country-list"} - ] - }, - {"text": "Route Attributes", "link": "/api-reference/endpoints/directions/route-attributes"}, - {"text": "Geometry Decoding", "link": "/api-reference/endpoints/directions/geometry-decoding"}, - {"text": "Instruction Types", "link": "/api-reference/endpoints/directions/instruction-types"} - ] - }, - {"text": "Isochrones", "link": "/api-reference/endpoints/isochrones/"}, - {"text": "Matrix", "link": "/api-reference/endpoints/matrix/"}, - {"text": "Snapping (not live)", "link": "/api-reference/endpoints/snapping/"}, - {"text": "Export (not live)", "link": "/api-reference/endpoints/export/"}, - {"text": "Health (not live)", "link": "/api-reference/endpoints/health/"}, - {"text": "Status (not live)", "link": "/api-reference/endpoints/status/"}, - {"text": "POI", "link": "/api-reference/endpoints/poi/"}, - {"text": "Elevation", "link": "/api-reference/endpoints/elevation/"}, - {"text": "Geocoder", "link": "/api-reference/endpoints/geocoder/"}, - {"text": "Optimization", "link": "/api-reference/endpoints/optimization/"} - ] - }, - {"text": "Error Codes", "link": "/api-reference/error-codes"} - ] - }, - { - "text": "Run ORS instance", "collapsed": true, "link": "/run-instance/", - "items": [ - {"text": "System Requirements", "link": "/run-instance/system-requirements"}, - {"text": "Data", "link": "/run-instance/data"}, - { - "text": "Installation", "collapsed": true, "link": "/run-instance/installation/", - "items": [ - {"text": "Running with Docker", "link": "/run-instance/installation/running-with-docker"}, - {"text": "Running JAR / WAR", "link": "/run-instance/installation/running-jar-war"}, - {"text": "Building from Source", "link": "/run-instance/installation/building-from-source"} - ] - }, - { - "text": "Configuration", "collapsed": true, "link": "/run-instance/configuration/", - "items": [ - {"text": "Spring Properties", "link": "/run-instance/configuration/spring/", "collapsed":true, - "items": [ - {"text": "server", "link": "/run-instance/configuration/spring/server.md"}, - {"text": "logging", "link": "/run-instance/configuration/spring/logging.md"} - ] - }, - {"text": "ORS Properties", "collapsed":true, - "items": [ - {"text": "endpoints", "link": "/run-instance/configuration/ors/endpoints/", "collapsed": true, - "items": [ - {"text": "defaults", "link": "/run-instance/configuration/ors/endpoints/defaults.md"}, - {"text": "routing", "link": "/run-instance/configuration/ors/endpoints/routing.md"}, - {"text": "matrix", "link": "/run-instance/configuration/ors/endpoints/matrix.md"}, - {"text": "isochrones", "link": "/run-instance/configuration/ors/endpoints/isochrones.md"}, - {"text": "snap", "link": "/run-instance/configuration/ors/endpoints/snap.md"} - ] - }, - {"text": "engine", "link": "/run-instance/configuration/ors/engine/", "collapsed": true, - "items": [ - {"text": "profiles", "link": "/run-instance/configuration/ors/engine/profiles.md"}, - {"text": "elevation", "link": "/run-instance/configuration/ors/engine/elevation.md"} - ] - }, - {"text": "cors", "link": "/run-instance/configuration/ors/cors/"}, - {"text": "messages", "link": "/run-instance/configuration/ors/messages/"} - ] - }, - {"text": "JSON config (deprecated)", "link":"/run-instance/configuration/json.md"} - ] - } - ] - }, - { - "text": "Contributing", "collapsed": true, "link": "/contributing/", - "items": [ - {"text": "Opening project in IntelliJ", "link": "/contributing/opening-project-in-intellij"}, - {"text": "Backend documentation", "link": "/contributing/backend-documentation"}, - {"text": "Contribution guidelines", "link": "https://github.com/GIScience/openrouteservice/blob/main/CONTRIBUTE.md"}, - {"text": "Contributing translations", "link": "/contributing/contributing-translations"} - ] - }, - { - "text": "Technical details", "collapsed": true, "link": "/technical-details/", - "items": [ - {"text": "Country List", "link": "/technical-details/country-list"}, - {"text": "Travel Speeds", "link": "/technical-details/travel-speeds/", - "items": [ - {"text": "Country Speeds", "link": "/technical-details/travel-speeds/country-speeds.md"}, - {"text": "Tracktype Speeds", "link": "/technical-details/travel-speeds/tracktype-speeds.md"}, - {"text": "Waytype Speeds", "link": "/technical-details/travel-speeds/waytype-speeds.md"}, - {"text": "Surface Speeds", "link": "/technical-details/travel-speeds/surface-speeds.md"} - ] - }, - {"text": "Tag Filtering", "link": "/technical-details/tag-filtering"} - ] - }, - {"text": "FAQ", "link": "/frequently-asked-questions"} - ] - } -] +{ + "text": "Home", "link": "/", + "items": [ + {"text": "Getting Started 7", "link": "./getting-started"}, + { + "text": "API Reference", "collapsed": true, "link": "/api-reference/", + "items": [ + { + "text": "Endpoints", "collapsed": true, "link": "/api-reference/endpoints/", + "items": [ + { + "text": "Directions", "collapsed": true, "link": "/api-reference/endpoints/directions/", + "items": [ + {"text": "Requests and Return Types", "link": "/api-reference/endpoints/directions/requests-and-return-types"}, + {"text": "Routing Options", "link": "/api-reference/endpoints/directions/routing-options"}, + { + "text": "Extra info", "collapsed": true, "link": "/api-reference/endpoints/directions/extra-info/", + "items": [ + {"text": "Steepness IDs", "link": "/api-reference/endpoints/directions/extra-info/steepness"}, + {"text": "Surface IDs", "link": "/api-reference/endpoints/directions/extra-info/surface"}, + {"text": "Category IDs", "link": "/api-reference/endpoints/directions/extra-info/waycategory"}, + {"text": "Type IDs", "link": "/api-reference/endpoints/directions/extra-info/waytype"}, + {"text": "Difficulty IDs", "link": "/api-reference/endpoints/directions/extra-info/trail-difficulty"}, + {"text": "Restriction IDs", "link": "/api-reference/endpoints/directions/extra-info/road-access-restrictions"}, + {"text": "Country IDs", "link": "/technical-details/country-list"} + ] + }, + {"text": "Route Attributes", "link": "/api-reference/endpoints/directions/route-attributes"}, + {"text": "Geometry Decoding", "link": "/api-reference/endpoints/directions/geometry-decoding"}, + {"text": "Instruction Types", "link": "/api-reference/endpoints/directions/instruction-types"} + ] + }, + {"text": "Isochrones", "link": "/api-reference/endpoints/isochrones/"}, + {"text": "Matrix", "link": "/api-reference/endpoints/matrix/"}, + {"text": "Snapping (not live)", "link": "/api-reference/endpoints/snapping/"}, + {"text": "Export (not live)", "link": "/api-reference/endpoints/export/"}, + {"text": "Health (not live)", "link": "/api-reference/endpoints/health/"}, + {"text": "Status (not live)", "link": "/api-reference/endpoints/status/"}, + {"text": "POI", "link": "/api-reference/endpoints/poi/"}, + {"text": "Elevation", "link": "/api-reference/endpoints/elevation/"}, + {"text": "Geocoder", "link": "/api-reference/endpoints/geocoder/"}, + {"text": "Optimization", "link": "/api-reference/endpoints/optimization/"} + ] + }, + {"text": "Error Codes", "link": "/api-reference/error-codes"} + ] + }, + { + "text": "Run ORS instance", "collapsed": true, "link": "/run-instance/", + "items": [ + {"text": "System Requirements", "link": "/run-instance/system-requirements"}, + {"text": "Data", "link": "/run-instance/data"}, + { + "text": "Installation", "collapsed": true, "link": "/run-instance/installation/", + "items": [ + {"text": "Running with Docker", "link": "/run-instance/installation/running-with-docker"}, + {"text": "Running JAR / WAR", "link": "/run-instance/installation/running-jar-war"}, + {"text": "Building from Source", "link": "/run-instance/installation/building-from-source"} + ] + }, + { + "text": "Configuration", "collapsed": true, "link": "/run-instance/configuration/", + "items": [ + {"text": "Spring Properties", "link": "/run-instance/configuration/spring/", "collapsed":true, + "items": [ + {"text": "server", "link": "/run-instance/configuration/spring/server.md"}, + {"text": "logging", "link": "/run-instance/configuration/spring/logging.md"} + ] + }, + {"text": "ORS Properties", "collapsed":true, + "items": [ + {"text": "endpoints", "link": "/run-instance/configuration/ors/endpoints/", "collapsed": true, + "items": [ + {"text": "defaults", "link": "/run-instance/configuration/ors/endpoints/defaults.md"}, + {"text": "routing", "link": "/run-instance/configuration/ors/endpoints/routing.md"}, + {"text": "matrix", "link": "/run-instance/configuration/ors/endpoints/matrix.md"}, + {"text": "isochrones", "link": "/run-instance/configuration/ors/endpoints/isochrones.md"}, + {"text": "snap", "link": "/run-instance/configuration/ors/endpoints/snap.md"} + ] + }, + {"text": "engine", "link": "/run-instance/configuration/ors/engine/", "collapsed": true, + "items": [ + {"text": "profiles", "link": "/run-instance/configuration/ors/engine/profiles.md"}, + {"text": "elevation", "link": "/run-instance/configuration/ors/engine/elevation.md"} + ] + }, + {"text": "cors", "link": "/run-instance/configuration/ors/cors/"}, + {"text": "messages", "link": "/run-instance/configuration/ors/messages/"} + ] + }, + {"text": "JSON config (deprecated)", "link":"/run-instance/configuration/json.md"} + ] + } + ] + }, + { + "text": "Contributing", "collapsed": true, "link": "/contributing/", + "items": [ + {"text": "Opening project in IntelliJ", "link": "/contributing/opening-project-in-intellij"}, + {"text": "Backend documentation", "link": "/contributing/backend-documentation"}, + {"text": "Contribution guidelines", "link": "https://github.com/GIScience/openrouteservice/blob/main/CONTRIBUTE.md"}, + {"text": "Contributing translations", "link": "/contributing/contributing-translations"} + ] + }, + { + "text": "Technical details", "collapsed": true, "link": "/technical-details/", + "items": [ + {"text": "Country List", "link": "/technical-details/country-list"}, + {"text": "Travel Speeds", "link": "/technical-details/travel-speeds/", + "items": [ + {"text": "Country Speeds", "link": "/technical-details/travel-speeds/country-speeds.md"}, + {"text": "Tracktype Speeds", "link": "/technical-details/travel-speeds/tracktype-speeds.md"}, + {"text": "Waytype Speeds", "link": "/technical-details/travel-speeds/waytype-speeds.md"}, + {"text": "Surface Speeds", "link": "/technical-details/travel-speeds/surface-speeds.md"} + ] + }, + {"text": "Tag Filtering", "link": "/technical-details/tag-filtering"} + ] + }, + {"text": "FAQ", "link": "/frequently-asked-questions"} + ] +} From 91acea22d3b49a01bb8be0e338cf8ab3851a7d4f Mon Sep 17 00:00:00 2001 From: Jakob Schnell Date: Fri, 29 Nov 2024 16:16:24 +0100 Subject: [PATCH 05/28] feat: add v7 doc folder --- .../endpoints/directions/extra-info/index.md | 146 ++++++ .../extra-info/road-access-restrictions.md | 22 + .../directions/extra-info/steepness.md | 23 + .../directions/extra-info/surface.md | 33 ++ .../directions/extra-info/trail-difficulty.md | 22 + .../directions/extra-info/waycategory.md | 20 + .../directions/extra-info/waytype.md | 25 + .../endpoints/directions/geometry-decoding.md | 202 ++++++++ .../endpoints/directions/index.md | 12 + .../endpoints/directions/instruction-types.md | 33 ++ .../directions/requests-and-return-types.md | 33 ++ .../endpoints/directions/route-attributes.md | 23 + .../endpoints/directions/routing-options.md | 264 ++++++++++ .../endpoints/elevation/index.md | 12 + .../7/api-reference/endpoints/export/index.md | 459 ++++++++++++++++++ .../api-reference/endpoints/geocoder/index.md | 17 + .../7/api-reference/endpoints/health/index.md | 11 + .../7/api-reference/endpoints/index.md | 34 ++ .../endpoints/isochrones/index.md | 14 + .../7/api-reference/endpoints/matrix/index.md | 60 +++ .../endpoints/optimization/index.md | 12 + .../7/api-reference/endpoints/poi/index.md | 282 +++++++++++ .../api-reference/endpoints/snapping/index.md | 87 ++++ .../7/api-reference/endpoints/status/index.md | 102 ++++ docs/versions/7/api-reference/error-codes.md | 133 +++++ docs/versions/7/api-reference/index.md | 44 ++ .../7/contributing/backend-documentation.md | 41 ++ .../contributing/contributing-translations.md | 50 ++ docs/versions/7/contributing/index.md | 27 ++ .../opening-project-in-intellij.md | 9 + docs/versions/7/frequently-asked-questions.md | 72 +++ docs/versions/7/getting-started.md | 27 ++ docs/versions/7/index.md | 34 ++ .../7/installation/Location-of-OSM-file.md | 40 ++ docs/versions/7/performance.txt | 16 + docs/versions/7/public/openrouteservice.png | Bin 0 -> 105985 bytes .../7/public/openrouteservice_dark.png | Bin 0 -> 25676 bytes docs/versions/7/public/ors_fav.png | Bin 0 -> 1861 bytes docs/versions/7/public/playground-map.png | Bin 0 -> 179117 bytes .../7/public/playground-select-server.png | Bin 0 -> 20670 bytes docs/versions/7/public/swagger-ui.png | Bin 0 -> 94419 bytes .../7/run-instance/configuration/index.md | 91 ++++ .../7/run-instance/configuration/json.md | 329 +++++++++++++ .../configuration/ors/cors/index.md | 9 + .../configuration/ors/endpoints/defaults.md | 7 + .../configuration/ors/endpoints/index.md | 3 + .../configuration/ors/endpoints/isochrones.md | 73 +++ .../configuration/ors/endpoints/matrix.md | 14 + .../configuration/ors/endpoints/routing.md | 18 + .../configuration/ors/endpoints/snap.md | 10 + .../configuration/ors/engine/elevation.md | 12 + .../configuration/ors/engine/index.md | 14 + .../configuration/ors/engine/profiles.md | 179 +++++++ .../configuration/ors/messages/index.md | 52 ++ .../configuration/spring/index.md | 5 + .../configuration/spring/logging.md | 16 + .../configuration/spring/server.md | 13 + docs/versions/7/run-instance/data.md | 20 + docs/versions/7/run-instance/index.md | 21 + .../installation/building-from-source.md | 150 ++++++ .../7/run-instance/installation/index.md | 9 + .../installation/running-jar-war.md | 46 ++ .../installation/running-with-docker.md | 226 +++++++++ .../7/run-instance/system-requirements.md | 30 ++ .../7/technical-details/country-list.md | 243 ++++++++++ docs/versions/7/technical-details/index.md | 10 + .../7/technical-details/tag-filtering.md | 169 +++++++ .../travel-speeds/country-speeds.md | 94 ++++ .../technical-details/travel-speeds/index.md | 100 ++++ .../travel-speeds/surface-speeds.md | 39 ++ .../travel-speeds/tracktype-speeds.md | 15 + .../travel-speeds/waytype-speeds.md | 31 ++ 72 files changed, 4489 insertions(+) create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/index.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/road-access-restrictions.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/steepness.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/surface.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/trail-difficulty.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/waycategory.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/extra-info/waytype.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/geometry-decoding.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/index.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/instruction-types.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/requests-and-return-types.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/route-attributes.md create mode 100644 docs/versions/7/api-reference/endpoints/directions/routing-options.md create mode 100644 docs/versions/7/api-reference/endpoints/elevation/index.md create mode 100644 docs/versions/7/api-reference/endpoints/export/index.md create mode 100644 docs/versions/7/api-reference/endpoints/geocoder/index.md create mode 100644 docs/versions/7/api-reference/endpoints/health/index.md create mode 100644 docs/versions/7/api-reference/endpoints/index.md create mode 100644 docs/versions/7/api-reference/endpoints/isochrones/index.md create mode 100644 docs/versions/7/api-reference/endpoints/matrix/index.md create mode 100644 docs/versions/7/api-reference/endpoints/optimization/index.md create mode 100644 docs/versions/7/api-reference/endpoints/poi/index.md create mode 100644 docs/versions/7/api-reference/endpoints/snapping/index.md create mode 100644 docs/versions/7/api-reference/endpoints/status/index.md create mode 100644 docs/versions/7/api-reference/error-codes.md create mode 100644 docs/versions/7/api-reference/index.md create mode 100644 docs/versions/7/contributing/backend-documentation.md create mode 100644 docs/versions/7/contributing/contributing-translations.md create mode 100644 docs/versions/7/contributing/index.md create mode 100644 docs/versions/7/contributing/opening-project-in-intellij.md create mode 100644 docs/versions/7/frequently-asked-questions.md create mode 100644 docs/versions/7/getting-started.md create mode 100644 docs/versions/7/index.md create mode 100644 docs/versions/7/installation/Location-of-OSM-file.md create mode 100644 docs/versions/7/performance.txt create mode 100644 docs/versions/7/public/openrouteservice.png create mode 100644 docs/versions/7/public/openrouteservice_dark.png create mode 100644 docs/versions/7/public/ors_fav.png create mode 100644 docs/versions/7/public/playground-map.png create mode 100644 docs/versions/7/public/playground-select-server.png create mode 100644 docs/versions/7/public/swagger-ui.png create mode 100644 docs/versions/7/run-instance/configuration/index.md create mode 100644 docs/versions/7/run-instance/configuration/json.md create mode 100644 docs/versions/7/run-instance/configuration/ors/cors/index.md create mode 100644 docs/versions/7/run-instance/configuration/ors/endpoints/defaults.md create mode 100644 docs/versions/7/run-instance/configuration/ors/endpoints/index.md create mode 100644 docs/versions/7/run-instance/configuration/ors/endpoints/isochrones.md create mode 100644 docs/versions/7/run-instance/configuration/ors/endpoints/matrix.md create mode 100644 docs/versions/7/run-instance/configuration/ors/endpoints/routing.md create mode 100644 docs/versions/7/run-instance/configuration/ors/endpoints/snap.md create mode 100644 docs/versions/7/run-instance/configuration/ors/engine/elevation.md create mode 100644 docs/versions/7/run-instance/configuration/ors/engine/index.md create mode 100644 docs/versions/7/run-instance/configuration/ors/engine/profiles.md create mode 100644 docs/versions/7/run-instance/configuration/ors/messages/index.md create mode 100644 docs/versions/7/run-instance/configuration/spring/index.md create mode 100644 docs/versions/7/run-instance/configuration/spring/logging.md create mode 100644 docs/versions/7/run-instance/configuration/spring/server.md create mode 100644 docs/versions/7/run-instance/data.md create mode 100644 docs/versions/7/run-instance/index.md create mode 100644 docs/versions/7/run-instance/installation/building-from-source.md create mode 100644 docs/versions/7/run-instance/installation/index.md create mode 100644 docs/versions/7/run-instance/installation/running-jar-war.md create mode 100644 docs/versions/7/run-instance/installation/running-with-docker.md create mode 100644 docs/versions/7/run-instance/system-requirements.md create mode 100644 docs/versions/7/technical-details/country-list.md create mode 100644 docs/versions/7/technical-details/index.md create mode 100644 docs/versions/7/technical-details/tag-filtering.md create mode 100644 docs/versions/7/technical-details/travel-speeds/country-speeds.md create mode 100644 docs/versions/7/technical-details/travel-speeds/index.md create mode 100644 docs/versions/7/technical-details/travel-speeds/surface-speeds.md create mode 100644 docs/versions/7/technical-details/travel-speeds/tracktype-speeds.md create mode 100644 docs/versions/7/technical-details/travel-speeds/waytype-speeds.md diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/index.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/index.md new file mode 100644 index 0000000000..d6a8741a58 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/index.md @@ -0,0 +1,146 @@ +# Extra Info + +When requesting routes, there are a number of "extra info" items that can be requested to give you more information about the route. +This info could be things like the road surface, track type, or OpenStreetMap way ID. +The list below details which extra info items are available for each profile in the routing provided by https://api.openrouteservice.org. + +## Specify Extra Info in Request + +The desired extra info can be specified in the request body parameter `extra_info`: + +```json +"extra_info": [ "steepness", "waytype"] +``` + +The following table lists the possible values for the request as well as the keys and possible values in the directions response: + +| Request Value in `extra_info` | Description | Key in Response `$.routes[*].extras` | Response Values | +|:-----------------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------|-----------------------------------------------------------| +| steepness | Provides information about how steep parts of the route are | `steepness` | [Steepness IDs](steepness.md) | +| suitability | How suitable the way is based on characteristics of the route and the profile | `suitability` | 1 (unsuitable) - 10 (very suitable) | +| surface | The surface covering along the route | `surface` | [Surface IDs](surface.md) | +| waycategory | Specific categories of parts of the route (tollways, highways, fords etc.) | `waycategory` | [Category IDs](waycategory.md) | +| waytype | Types of roads and paths that are used in the route | `waytypes`¹ | [Type IDs](waytype.md) | +| tollways | Any tollways that the route crosses. Whether a way is marked as [tollway](https://wiki.openstreetmap.org/wiki/Key:toll) depends on `profile` | `tollways` | 0 (no tollway) or 1 (tollway) | +| traildifficulty | The difficulty of parts of the way based on sac or mountain bike scales | `traildifficulty` | [Difficulty IDs](trail-difficulty.md) | +| osmid | The [OpenStreetMap way IDs](https://wiki.openstreetmap.org/wiki/Elements#id) of the ways the route uses | `osmId`¹ | | +| roadaccessrestrictions | Information about ways that may have access restrictions (e.g. private roads, destination only) | `roadaccessrestrictions` | [Restrictions IDs](road-access-restrictions.md) | +| countryinfo | Which country parts of the way lies in | `countryinfo` | [Country IDs](/technical-details/country-list.md) | +| green | How "green" the parts of the route are (influenced by things like number of trees, parks, rivers etc.) | `green` | 0 (minimal green-space) - 10 (a lot of green-space) | +| noise | How noisy the parts of the route are (influenced by things like proximity to highways) | `noise` | 0 (quiet) - 10 (noisy) | +| shadow² | How sunny the parts of the route are are | `shadow` | 0 (completely in the shadow) - 10 (completely in the sun) | +| csv² | Experimental feature: Generic extra information from provided csv file(s) | `csv` | custom values | + +*¹ Note the different keys in request and response!* + +*² No data available in the public openrouteservice hosted by HeiGIT* + + +## Extra Info Availability + +Some values are not available in all routing profiles: + +| | steepness | suitability | surface | waycategory | waytype | tollways | traildifficulty | osmid | roadaccessrestrictions | countryinfo | green | noise | shadow | +|:-----------------|:---------:|:-----------:|:-------:|:-----------:|:-------:|:--------:|:---------------:|:-----:|:----------------------:|:-----------:|:-----:|:-----:|:------:| +| driving-car | x | x | x | x | x | x | x | | x | x | | | | +| driving-hgv | x | x | x | x | x | x | x | | x | x | | | | +| cycling-regular | x | x | x | x | x | | x | | | | | | | +| cycling-mountain | x | x | x | x | x | | x | | | | | | | +| cycling-road | x | x | x | x | x | | x | | | | | | | +| foot-walking | x | x | x | x | x | | x | | | | x | x | x | +| foot-hiking | x | x | x | x | x | | x | | | | x | x | x | +| wheelchair | x | x | x | x | x | | x | x | | | | | | + + +## Extra Info in Responses + +The requested extra information can be found in the directions response (JSON endpoints) in the node + +```jsonpath +$.routes[*].extras +``` + +of type object. Each requested extra_info is represented as a nested object entry with the requested value as key, e.g. `steepness`. +Note that some keys in the `extras` object are different from the requested values, see the table above! + +Here one example: + +```json +"extras": { + "waytypes": { + "values": [ + [ + 0, + 17, + 3 + ], + [ + 17, + 19, + 1 + ], + [ + 19, + 20, + 3 + ] + ], + "summary": [ + { + "value": 3, + "distance": 1285.2, + "amount": 93.93 + }, + { + "value": 1, + "distance": 83, + "amount": 6.07 + } + ] + }, + "steepness": { + "values": [ + [ + 0, + 20, + 0 + ] + ], + "summary": [ + { + "value": 0, + "distance": 1368.2, + "amount": 100 + } + ] + } +} +``` + +The values of each entry have the same structure: Objects with the entries `values` and `summary`: + +### `values` + +A list of integer arrays with length 3 representing a contiguous section of the calculated route with the same value of the requested information type. +The three values of each list have the following semantics: + +1. Index of the way point starting the section +2. Index of the way point at the end of the section +3. Value of the extra info measure (waytype, steepness etc.) for this section + +In the example above, the calculated route has three sections with different waytypes: + +* waypoints 0-17: waytype=3 +* waypoints 17-19: waytype=1 +* waypoints 19-20: waytype=3 + +and only one section (i.e. the whole route) from waypoint 0-20 with steepness=0. + +### `summary` + +A list of objects with the entries `value`, `distance`, `amount` summarizing the +total length (`distance`) and relative length (`amount`) of all segments with a given `value` +of the extra info unit. + +In the example above, all sections with waytype=3 have a summarized length of 1285.2 m +which is 93.93% of the calculated route and 100% of the route have steepness=0. diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/road-access-restrictions.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/road-access-restrictions.md new file mode 100644 index 0000000000..14d66d9c27 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/road-access-restrictions.md @@ -0,0 +1,22 @@ +# Road Access Restrictions + +Value list for the directions response values in + +```jsonpath +$.routes[*].extras.roadaccessrestrictions.values +``` + +Provides information about possible restrictions on roads. +Explanation of the values can be found in the [list of possible values in the OSM Wiki](https://wiki.openstreetmap.org/wiki/Key:access) + +| Value | Encoding | +|:-----:|:---------------------------------:| +| 0 | None (there are no restrictions) | +| 1 | No | +| 2 | Customers | +| 4 | Destination | +| 8 | Delivery | +| 16 | Private | +| 32 | Permissive | + +[//]: # (keep in sync with org.heigit.ors.routing.graphhopper.extensions.AccessRestrictionType.class) \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/steepness.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/steepness.md new file mode 100644 index 0000000000..a95c30aef1 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/steepness.md @@ -0,0 +1,23 @@ +# Steepness + +Value list for the directions response values in + +```jsonpath +$.routes[*].extras.steepness.values +``` + +| Value | Encoding | +|:-----:|-------------------:| +| -5 | >=16% decline | +| -4 | 10% - <16% decline | +| -3 | 7% - <10% decline | +| -2 | 4% - <7% decline | +| -1 | 1% - <4% decline | +| 0 | 0% - <1% incline | +| 1 | 1% - <4% incline | +| 2 | 4% - <7% incline | +| 3 | 7% - <10% incline | +| 4 | 10% - <16% incline | +| 5 | >=16% incline | + +[//]: # (keep in sync with org.heigit.ors.routing.util.SteepnessUtil.getCategory ) \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/surface.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/surface.md new file mode 100644 index 0000000000..fc09769c01 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/surface.md @@ -0,0 +1,33 @@ +# Surface + +Value list for the directions response values in + +```jsonpath +$.routes[*].extras.surface.values +``` + +This extra provides info about the [surface](https://wiki.openstreetmap.org/wiki/Key:surface) of the corresponding parts of the route. + +| Value | Name | +|:-----:|:----------------:| +| 0 | Unknown | +| 1 | Paved | +| 2 | Unpaved | +| 3 | Asphalt | +| 4 | Concrete | +| 5 | Cobblestone | +| 6 | Metal | +| 7 | Wood | +| 8 | Compacted Gravel | +| 9 | Fine Gravel | +| 10 | Gravel | +| 11 | Dirt | +| 12 | Ground | +| 13 | Ice | +| 14 | Paving Stones | +| 15 | Sand | +| 16 | Woodchips | +| 17 | Grass | +| 18 | Grass Paver | + +[//]: # (keep in sync with org.heigit.ors.routing.graphhopper.extensions.SurfaceType) \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/trail-difficulty.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/trail-difficulty.md new file mode 100644 index 0000000000..0da34f9196 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/trail-difficulty.md @@ -0,0 +1,22 @@ +# Trail Difficulty + +Value list for the directions response values in + +```jsonpath +$.routes[*].extras.traildifficulty.values +``` + +This extra provides information about a trails difficulty for [hiking](https://wiki.openstreetmap.org/wiki/Key:sac_scale) as well as for [mountain-biking](https://wiki.openstreetmap.org/wiki/Key:mtb:scale). + +| Value | foot-\* | cycling-\* | +|:-----:|-------------------------------------|-------------| +| 0 | no tag | no tag | +| 1 | sac_scale=hiking | mtb:scale=0 | +| 2 | sac_scale=mountain_hiking | mtb:scale=1 | +| 3 | sac_scale=demanding_mountain_hiking | mtb:scale=2 | +| 4 | sac_scale=alpine_hiking | mtb:scale=3 | +| 5 | sac_scale=demanding_alpine_hiking | mtb:scale=4 | +| 6 | sac_scale=difficult_alpine_hiking | mtb:scale=5 | +| 7 | --- | mtb:scale=6 | + +[//]: # (keep in sync with TrailDifficultyScaleGraphStorageBuilder.getSacScale) \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/waycategory.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/waycategory.md new file mode 100644 index 0000000000..1284506729 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/waycategory.md @@ -0,0 +1,20 @@ +# WayCategory + +Value list for the directions response values in + +```jsonpath +$.routes[*].extras.waycategory.values +``` + +The exponential assignment of the values is used for [bit fields](http://eddmann.com/posts/using-bit-flags-and-enumsets-in-java/). One route section may belong to different categories. Hence, a value of ``97`` would indicate a belonging to ``Paved road``, ``Tunnel`` and ``Highway`` (``64`` + ``32`` + ``1`` ). + +| Value | Name | Corresponding tag(s) | +|:-----:|:-----------:|:-------------------------------------------:| +| 0 | No category | | +| 1 | Highway | `highway=motorway`, `highway=motorway_link` | +| 2 | Tollways | `toll*=yes` | +| 4 | Steps | `highway=steps` | +| 8 | Ferry | `route=shuttle_train`, `route=ferry` | +| 16 | Ford | `ford=yes` | + +[//]: # (keep in sync with org.heigit.ors.routing.graphhopper.extensions.storages.builders.WayCategoryGraphStorageBuilder) diff --git a/docs/versions/7/api-reference/endpoints/directions/extra-info/waytype.md b/docs/versions/7/api-reference/endpoints/directions/extra-info/waytype.md new file mode 100644 index 0000000000..2d17d82685 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/extra-info/waytype.md @@ -0,0 +1,25 @@ +# WayType + +Value list for the directions response values in + +```jsonpath +$.routes[*].extras.waytype.values +``` + +This extra provides info about the type of the way of the corresponding parts of the route. + +| Value | Name | Corresponding [`highway`](https://wiki.openstreetmap.org/wiki/Key:highway)-tag(s) | +|:-----:|:------------:|:----------------------------------------------------------------------------------:| +| 0 | Unknown | | +| 1 | State Road | `primary`, `primary_link`, `motorway`, `motorway_link`, `trunk`, `trunk_link` | +| 2 | Road | `secondary`, `secondary_link`, `tertiary`, `tertiary_link`, `road`, `unclassified` | +| 3 | Street | `residential`, `service`, `living_street` | +| 4 | Path | `path` | +| 5 | Track | `track` | +| 6 | Cycleway | `cycleway` | +| 7 | Footway | `footway`, `pedestrian`, `crossing` | +| 8 | Steps | `steps` | +| 9 | Ferry | `route=shuttle_train`, `route=ferry` | +| 10 | Construction | `construction` | + +[//]: # (keep in sync with org.heigit.ors.routing.graphhopper.extensions.WayType) diff --git a/docs/versions/7/api-reference/endpoints/directions/geometry-decoding.md b/docs/versions/7/api-reference/endpoints/directions/geometry-decoding.md new file mode 100644 index 0000000000..bafdb5df8d --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/geometry-decoding.md @@ -0,0 +1,202 @@ +# Geometry Decoding + +When a response includes a geometry the data might be encoded as single string. This is a so-called [encoded polyline](https://developers.google.com/maps/documentation/utilities/polylinealgorithm). +If no additional elevation data is requested, this can be decoded with a standard polyline decoder, available e.g. from Mapbox or others. + +When you request additional elevation data, this encoded string can not be decoded with a standard polyline decoder. +The reason for that is, that the elevation data is included in the polyline in addition to the latitude and longitude values. +To decode _X,Y_ and _X,Y,Z_ polylines the decoder needs to know whether the geometry has elevation information. +Examples on how to decode _X,Y,Z_ polylines can be found below: + +## Java + +```java +import org.json.JSONArray; + +public class GeometryDecoder { + + private static JSONArray decodeGeometry(String encodedGeometry, boolean inclElevation) { + JSONArray geometry = new JSONArray(); + int len = encodedGeometry.length(); + int index = 0; + int lat = 0; + int lng = 0; + int ele = 0; + + while (index < len) { + int result = 1; + int shift = 0; + int b; + do { + b = encodedGeometry.charAt(index++) - 63 - 1; + result += b << shift; + shift += 5; + } while (b >= 0x1f); + lat += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); + + result = 1; + shift = 0; + do { + b = encodedGeometry.charAt(index++) - 63 - 1; + result += b << shift; + shift += 5; + } while (b >= 0x1f); + lng += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); + + + if(inclElevation){ + result = 1; + shift = 0; + do { + b = encodedGeometry.charAt(index++) - 63 - 1; + result += b << shift; + shift += 5; + } while (b >= 0x1f); + ele += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); + } + + JSONArray location = new JSONArray(); + try { + location.put(lat / 1E5); + location.put(lng / 1E5); + if(inclElevation){ + location.put((float) (ele / 100)); + } + geometry.put(location); + } catch (JSONException e) { + e.printStackTrace(); + } + } + return geometry; + } +} +``` + +## JavaScript + +```js + /** + * Decode an x,y or x,y,z encoded polyline + * @param {*} encodedPolyline + * @param {Boolean} includeElevation - true for x,y,z polyline + * @returns {Array} of coordinates + */ + decodePolyline: (encodedPolyline, includeElevation) => { + // array that holds the points + let points = [] + let index = 0 + const len = encodedPolyline.length + let lat = 0 + let lng = 0 + let ele = 0 + while (index < len) { + let b + let shift = 0 + let result = 0 + do { + b = encodedPolyline.charAt(index++).charCodeAt(0) - 63 // finds ascii + // and subtract it by 63 + result |= (b & 0x1f) << shift + shift += 5 + } while (b >= 0x20) + + lat += ((result & 1) !== 0 ? ~(result >> 1) : (result >> 1)) + shift = 0 + result = 0 + do { + b = encodedPolyline.charAt(index++).charCodeAt(0) - 63 + result |= (b & 0x1f) << shift + shift += 5 + } while (b >= 0x20) + lng += ((result & 1) !== 0 ? ~(result >> 1) : (result >> 1)) + + if (includeElevation) { + shift = 0 + result = 0 + do { + b = encodedPolyline.charAt(index++).charCodeAt(0) - 63 + result |= (b & 0x1f) << shift + shift += 5 + } while (b >= 0x20) + ele += ((result & 1) !== 0 ? ~(result >> 1) : (result >> 1)) + } + try { + let location = [(lat / 1E5), (lng / 1E5)] + if (includeElevation) location.push((ele / 100)) + points.push(location) + } catch (e) { + console.log(e) + } + } + return points + } +``` + +## Python + +```python +def decode_polyline(polyline, is3d=False): + """Decodes a Polyline string into a GeoJSON geometry. + :param polyline: An encoded polyline, only the geometry. + :type polyline: string + :param is3d: Specifies if geometry contains Z component. + :type is3d: boolean + :returns: GeoJSON Linestring geometry + :rtype: dict + """ + points = [] + index = lat = lng = z = 0 + + while index < len(polyline): + result = 1 + shift = 0 + while True: + b = ord(polyline[index]) - 63 - 1 + index += 1 + result += b << shift + shift += 5 + if b < 0x1F: + break + lat += (~result >> 1) if (result & 1) != 0 else (result >> 1) + + result = 1 + shift = 0 + while True: + b = ord(polyline[index]) - 63 - 1 + index += 1 + result += b << shift + shift += 5 + if b < 0x1F: + break + lng += ~(result >> 1) if (result & 1) != 0 else (result >> 1) + + if is3d: + result = 1 + shift = 0 + while True: + b = ord(polyline[index]) - 63 - 1 + index += 1 + result += b << shift + shift += 5 + if b < 0x1F: + break + if (result & 1) != 0: + z += ~(result >> 1) + else: + z += result >> 1 + + points.append( + [ + round(lng * 1e-5, 6), + round(lat * 1e-5, 6), + round(z * 1e-2, 1), + ] + ) + + else: + points.append([round(lng * 1e-5, 6), round(lat * 1e-5, 6)]) + + geojson = {u"type": u"LineString", u"coordinates": points} + + return geojson +``` diff --git a/docs/versions/7/api-reference/endpoints/directions/index.md b/docs/versions/7/api-reference/endpoints/directions/index.md new file mode 100644 index 0000000000..cc41a1eefd --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/index.md @@ -0,0 +1,12 @@ +# Directions Service + +The Directions Service calculates routes and directions between two or more locations for different modes of transportation. + +A complete and concise overview of all request parameters and return types can be found in the [API Playground](https://openrouteservice.org/dev/#/api-docs/directions_service). +Here, however, a few topics are explained in more detail: + +* The different directions aka routing [requests and return types](requests-and-return-types.md) +* How advanced [Routing Options](routing-options.md) can be defined +* How [Extra Info](extra-info/index.md) like road surface, track type, OpenStreetMap way ID or additional [Route Attributes](route-attributes.md) can be requested +* How geometries in directions responses can be [decoded](geometry-decoding.md) +* How [Instruction Types](instruction-types.md) are encoded in the directions response diff --git a/docs/versions/7/api-reference/endpoints/directions/instruction-types.md b/docs/versions/7/api-reference/endpoints/directions/instruction-types.md new file mode 100644 index 0000000000..dd7e7eb9df --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/instruction-types.md @@ -0,0 +1,33 @@ +# Instruction Types + +[//]: # (keep in sync with org.heigit.ors.routing.instructions.InstructionType; PT_ENTER, PT_TRANSFER, PT_EXIT are replaced with street names ) + + +The following table contains the encoding of the instruction types present in the `type`-field of a directions response in a step of a segment of a route. + +JSON-Path in json response: +```jsonpath +$.routes[*].segments[*].steps[*].type +``` + +JSON-Path in geojson response: +```jsonpath +$.features[*].properties.segments[*].steps[*].type +``` + +| Value | Encoding | +|-------|------------------| +| 0 | Left | +| 1 | Right | +| 2 | Sharp left | +| 3 | Sharp right | +| 4 | Slight left | +| 5 | Slight right | +| 6 | Straight | +| 7 | Enter roundabout | +| 8 | Exit roundabout | +| 9 | U-turn | +| 10 | Goal | +| 11 | Depart | +| 12 | Keep left | +| 13 | Keep right | diff --git a/docs/versions/7/api-reference/endpoints/directions/requests-and-return-types.md b/docs/versions/7/api-reference/endpoints/directions/requests-and-return-types.md new file mode 100644 index 0000000000..fa94d974ed --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/requests-and-return-types.md @@ -0,0 +1,33 @@ +# Requests and Return Types + +## Direction Requests + +There are four POST directions requests that all accept the same request body and differ only in the result types, specified by the last path parameter: + + POST /v2/directions/{profile} <- returns JSON + POST /v2/directions/{profile}/json + POST /v2/directions/{profile}/geojson + POST /v2/directions/{profile}/gpx + +Additionally, there is one simple GET request that does not allow advanced request options. It returns GeoJSON: + + GET /v2/directions/{profile} <- returns GeoJSON + + +## Return Types + +### JSON + +The **JSON** return type is best suited for further processing. + +### GPX + +The **GPX** return type is an XML dialect from openrouteservice based on the [GPS Exchange Format](https://www.topografix.com/gpx.asp) with an own [XML Schema](https://raw.githubusercontent.com/GIScience/openrouteservice-schema/main/gpx/v2/ors-gpx.xsd). +It is a very old standard for lightweight interchange of GPS data and thus being used by hundreds of software programs and Web services. + +### GeoJSON + +**GeoJSON** is a format for encoding a variety of geographic data structures, see [geojson.org](https://datatracker.ietf.org/doc/html/rfc7946). +It is widely used and can therefore be easily processed or displayed in many applications, e.g. in [QGIS](https://qgis.org/) or on [geojson.io](http://geojson.io/) + +More information about the result types can be found in the [API Playground](https://openrouteservice.org/dev/#/api-docs/directions_service). diff --git a/docs/versions/7/api-reference/endpoints/directions/route-attributes.md b/docs/versions/7/api-reference/endpoints/directions/route-attributes.md new file mode 100644 index 0000000000..b48d4f8072 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/route-attributes.md @@ -0,0 +1,23 @@ +# Route Attributes + +With the request body parameter `attributes`, additional attributes of route segments can be requested in a directions request: + +```json +"attributes":["avgspeed","detourfactor","percentage"] +``` + +The possible values are: + +| Value | Description | +|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| avgspeed | This value is in _km/h_ and equals the average speed for this way segment after grading and applying factors. | +| detourfactor | This value is a _factor_ and gives the relative length of the segment with regard to the length of the beeline between the start and end point of the route segment. | +| percentage | This value is in _percent_ and gives the segment length in terms of the route length. | + +In the response, the additional attributes can be found in + +```jsonpath +$.routes[*].segments[*].avgspeed +$.routes[*].segments[*].detourfactor +$.routes[*].segments[*].percentage +``` diff --git a/docs/versions/7/api-reference/endpoints/directions/routing-options.md b/docs/versions/7/api-reference/endpoints/directions/routing-options.md new file mode 100644 index 0000000000..0965131e37 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/directions/routing-options.md @@ -0,0 +1,264 @@ +# Routing Options + +With the request body parameter `options`, advanced routing options can be specified for a directions request. + +The `options` parameter is a JSON object, multiple of the here mentioned parameters can be set. +For structure refer to the [examples](#examples). + + +## Available parameters + +### `options.avoid_borders` +String value specifying which borders to avoid. Only for **`driving-*`** profiles. + +| Value | Description | +|----------------|----------------------------------------------| +| `"all"` | for no border crossing | +| `"controlled"` | cross open borders but avoid controlled ones | + +### `options.avoid_countries` +An integer array of country ids to exclude from routing with **`driving-*`** profiles. Can be used together with `"avoid_borders": "controlled"`. +The list of countries and application examples can be found in the [country list](/technical-details/country-list.md). + +`"[11,193]"` would exclude Austria and Switzerland. + +### `options.avoid_features` +A string array of features to avoid. The available features are : + +| Feature | Available for | +|------------|---------------------------------------------| +| `highways` | driving-\* | +| `tollways` | driving-\* | +| `ferries` | driving-\*, cycling-\*, foot-\*, wheelchair | +| `fords` | driving-\*, cycling-\*, foot-\* | +| `steps` | cycling-\*, foot-\*, wheelchair | + +### `options.avoid_polygons` +Comprises areas to be avoided for the route. Formatted as [geojson polygon](https://datatracker.ietf.org/doc/html/rfc7946#appendix-A.3) or [geojson multipolygon](https://datatracker.ietf.org/doc/html/rfc7946#appendix-A.6). + +### `options.profile_params` +An object of additional routing parameters for all profiles except `driving-car`: + +#### `options.profile_params.weightings` +Weightings will prioritize specified factors over the shortest path. +The value is an object that can have the following properties: + +* `steepness_difficulty`: Integer specifying the fitness level for **`cycling-*`** profiles. The preferred gradient increases with the value. + + | Value | Fitness level | + |-------|---------------| + | `0` | Novice | + | `1` | Moderate | + | `2` | Amateur | + | `3` | Pro | + +* `green`: Integer value specifying the Green factor for **`foot-*`** profiles. + + | Value | Green factor | + |-------|------------------------------------------------------| + | `0` | normal routing | + | `1` | prefer ways through green areas over a shorter route | + + +* `quiet`: Integer value specifying the Quiet factor for **`foot-*`** profiles. + + | Value | Quiet factor | + |-------|----------------------------------------| + | `0` | normal routing | + | `1` | prefer quiet ways over a shorter route | + +#### `options.profile_params.restrictions` + +[//]: # (see RequestProfileParamsRestrictions) + +An object specifying restrictions for `cycling-*`, `driving-hgv` or `wheelchair`profiles. + +* for `driving-hgv`: + + | Parameter | Type | Description | + |------------|---------|-----------------------------------------------------------------------------------------------------------------------------------| + | `length` | Number | Length restriction in meters. | + | `width` | Number | Width restriction in meters. | + | `height` | Number | Height restriction in meters. | + | `axleload` | Number | Axle load restriction in tons. | + | `weight` | Number | Weight restriction in tons. | + | `hazmat` | Boolean | Specifies whether to use appropriate routing for delivering hazardous goods and avoiding water protected areas. Default is false. | + +* for `wheelchair`: + + | Parameter | Type | Description | + |-----------------------|---------|-----------------------------------------------------------------------------------------------------------------------------| + | `surface_type` | String | Specifies the minimum [surface type](http://wiki.openstreetmap.org/wiki/Key:surface). Default is `"cobblestone:flattened"`. | + | `track_type` | String | Specifies the minimum [quality](http://wiki.openstreetmap.org/wiki/Key:tracktype) of the route. Default is `"grade1"`. | + | `smoothness_type` | String | Specifies the minimum [smoothness](http://wiki.openstreetmap.org/wiki/Key:smoothness) of the route. Default is `"good"`. | + | `maximum_sloped_kerb` | Number | Specifies the maximum height of the sloped kerb in meters. Values are `0.03`, `0.06`(default), `0.1` or `any`. | + | `maximum_incline` | Integer | Specifies the maximum incline as a percentage. `3`, `6`(default), `10`, `15` or `any`. | + | `minimum_width` | Number | Specifies the minimum width of a road in meters. | + +### `options.round-trip` + +An object with specifications of a round-trip: + +| Parameter | Type | Description | +|-----------|---------|----------------------------------------------------------------------------------------------------------| +| `length` | Number | The target length of the route in m (note that this is a preferred value, but results may be different). | +| `points` | Integer | The number of points to use on the route. Larger values create more circular routes. | +| `seed` | Integer | A seed to use for adding randomisation to the overall direction of the generated route (optional). | + +### `options.vehicle_type` +For `profile=driving-hgv` only. +It is needed for **vehicle restrictions** to work (see [tag filtering](/technical-details/tag-filtering.md#driving-hgv)). +Possible values: + +* `hgv` +* `bus` +* `agricultural` +* `delivery` +* `forestry` +* `goods` + + + +## Examples + +Some `options` examples in readable and minified JSON form: + +### for `profile=driving-car`: + +```json +{"avoid_features":["ferries","tollways"]} +``` + +### for `profile=cycling-*`: + +```json +{ + "avoid_features": ["steps"], + "profile_params": { + "weightings": { + "steepness_difficulty": 2 + } + }, + "avoid_polygons": { + "coordinates": [ + [ + [ + 8.683223, + 49.41971 + ], + [ + 8.68322, + 49.41635 + ], + [ + 8.68697, + 49.41635 + ], + [ + 8.68697, + 49.41971 + ], + [ + 8.683223, + 49.41971 + ] + ] + ], + "type": "Polygon" + } +} +``` +```json +{"avoid_features":["steps"],"profile_params":{"weightings":{"steepness_difficulty":2}},"avoid_polygons":{"coordinates":[[[8.683223,49.41971],[8.68322,49.41635],[8.68697,49.41635],[8.68697,49.41971],[8.683223,49.41971]]],"type":"Polygon"}} +``` + +### for `profile=foot-*`: + +```json +{ + "avoid_features": ["fords","ferries"], + "profile_params": { + "weightings": { + "green": { + "factor": 0.8 + }, + "quiet": { + "factor": 1.0 + } + } + } +} +``` +```json +{"avoid_features":["fords","ferries"],"profile_params":{"weightings":{"green":{"factor":0.8},"quiet":{"factor":1.0}}}} +``` + +### for `profile=driving-hgv`: + +```json +{ + "avoid_features": ["ferries","tollways"], + "profile_params": { + "restrictions": { + "length": 30, + "width": 30, + "height": 3, + "axleload": 4, + "weight": 3, + "hazmat": true + } + } +} +``` +```json +{"avoid_features":["ferries","tollways"],"profile_params":{"restrictions":{"length":30,"width":30,"height":3,"axleload":4,"weight":3,"hazmat":true}}} +``` + +### for `profile=wheelchair`: + +```json +{ + "avoid_features": ["ferries","steps"], + "profile_params": { + "restrictions": { + "surface_type": "cobblestone:flattened", + "track_type": "grade1", + "smoothness_type": "good", + "maximum_sloped_kerb": 0.06, + "maximum_incline": 6 + } + } +} +``` + +```json +{"avoid_features":["ferries","steps"],"profile_params":{"restrictions":{"surface_type":"cobblestone:flattened","track_type":"grade1","smoothness_type":"good","maximum_sloped_kerb":0.06,"maximum_incline":6}}} +``` + +### Border restrictions + +Examples for routing options object with border restrictions: + +#### _Do not cross country borders at all_ + +```json +{"avoid_borders":"all"} +``` + +#### _Do not cross controlled borders (i.e. USA - Canada) but allow crossing of open borders (i.e. France - Germany)_ + +```json +{"avoid_borders":"controlled"} +``` + +#### _Do not route through Austria or Switzerland_ + +```json +{"avoid_countries": [11,193]} +``` + +#### _Pass open borders but do not cross into Switzerland_ + +```json +{"avoid_borders": "controlled","avoid_countries": [193]} +``` diff --git a/docs/versions/7/api-reference/endpoints/elevation/index.md b/docs/versions/7/api-reference/endpoints/elevation/index.md new file mode 100644 index 0000000000..eac522cfef --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/elevation/index.md @@ -0,0 +1,12 @@ +# Elevation Service + +:::warning NOTE +This endpoint is not part of the openrouteservice, but of our public API. It is not available when running an own instance of openrouteservice. +::: + +The elevation service is a Flask application which extracts elevation from various elevation datasets for Point or LineString 2D geometries and returns 3D geometries in various formats. +Just like the openrouteservice, the elevation service is also accessible via our public API. + +Details on how to use it can be found in our [API Playground](https://openrouteservice.org/dev/#/api-docs/elevation). + +If you need deeper insights or want to run your own instance, please visit our GitHub project [openelevationservice](https://github.com/GIScience/openelevationservice). \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/export/index.md b/docs/versions/7/api-reference/endpoints/export/index.md new file mode 100644 index 0000000000..29e6c9186c --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/export/index.md @@ -0,0 +1,459 @@ +# Export Endpoint + +:::warning NOTE +This endpoint is not available in the public API, +but you can use it when running an own instance of openrouteservice. +You can easily create requests with the [swagger-ui](/api-reference/index.md#swagger-ui). +::: + +Export the base graph for different modes of transport. + +In the request, the desired routing profile is specified as the last path parameter, +a bounding box for the area of interest has to be defined in the request body. + +This is an example requests for a base graph for the profile `driving-car`: +```shell +curl -X 'POST' \ + 'http://localhost:8082/ors/v2/export/driving-car' \ + -H 'accept: application/geo+json' \ + -H 'Content-Type: application/json' \ + -d '{ + "bbox": [ + [ + 8.681495, + 49.41461 + ], + [ + 8.686507, + 49.41943 + ] + ], + "id": "export_request" +}' +``` + +The response contains nodes and edges in the bounding box relevant for this routing profile. +The edge entry `weight` contains the fastest car duration in seconds: + +```json +{ + "nodes": [ + { + "nodeId": 11008, + "location": [ + 8.682782, + 49.417388 + ] + }, + { + "nodeId": 11009, + "location": [ + 8.682461, + 49.417389 + ] + }, + { + "nodeId": 11010, + "location": [ + 8.681794, + 49.417637 + ] + }, + { + "nodeId": 1987, + "location": [ + 8.681674, + 49.416601 + ] + }, + { + "nodeId": 1988, + "location": [ + 8.681532, + 49.418291 + ] + }, + { + "nodeId": 1669, + "location": [ + 8.685746, + 49.415712 + ] + }, + { + "nodeId": 1221, + "location": [ + 8.685382, + 49.417368 + ] + }, + { + "nodeId": 15494, + "location": [ + 8.683159, + 49.419081 + ] + }, + { + "nodeId": 1672, + "location": [ + 8.686424, + 49.417375 + ] + }, + { + "nodeId": 3788, + "location": [ + 8.683666, + 49.414963 + ] + }, + { + "nodeId": 3789, + "location": [ + 8.685888, + 49.415001 + ] + }, + { + "nodeId": 3790, + "location": [ + 8.684803, + 49.414908 + ] + }, + { + "nodeId": 16273, + "location": [ + 8.681976, + 49.418537 + ] + }, + { + "nodeId": 16275, + "location": [ + 8.682777, + 49.417663 + ] + }, + { + "nodeId": 16276, + "location": [ + 8.682465, + 49.417623 + ] + }, + { + "nodeId": 16277, + "location": [ + 8.682592, + 49.417719 + ] + }, + { + "nodeId": 2072, + "location": [ + 8.683596, + 49.417386 + ] + }, + { + "nodeId": 216, + "location": [ + 8.686507, + 49.41943 + ] + }, + { + "nodeId": 219, + "location": [ + 8.681882, + 49.417391 + ] + }, + { + "nodeId": 12891, + "location": [ + 8.683295, + 49.418568 + ] + }, + { + "nodeId": 3360, + "location": [ + 8.68504, + 49.419273 + ] + }, + { + "nodeId": 3506, + "location": [ + 8.682577, + 49.415744 + ] + }, + { + "nodeId": 3507, + "location": [ + 8.683801, + 49.415725 + ] + }, + { + "nodeId": 3508, + "location": [ + 8.683767, + 49.416544 + ] + }, + { + "nodeId": 3510, + "location": [ + 8.68269, + 49.417389 + ] + }, + { + "nodeId": 3511, + "location": [ + 8.682661, + 49.416511 + ] + } + ], + "edges": [ + { + "fromId": 1669, + "toId": 1221, + "weight": 44.655840000000005 + }, + { + "fromId": 3506, + "toId": 3507, + "weight": 21.26352 + }, + { + "fromId": 3507, + "toId": 3506, + "weight": 21.26352 + }, + { + "fromId": 3510, + "toId": 3511, + "weight": 23.4336 + }, + { + "fromId": 3788, + "toId": 3790, + "weight": 19.99776 + }, + { + "fromId": 3790, + "toId": 3789, + "weight": 19.008000000000003 + }, + { + "fromId": 3508, + "toId": 3511, + "weight": 19.22184 + }, + { + "fromId": 3511, + "toId": 3506, + "weight": 20.515680000000003 + }, + { + "fromId": 11010, + "toId": 1988, + "weight": 18.03816 + }, + { + "fromId": 1988, + "toId": 11010, + "weight": 18.03816 + }, + { + "fromId": 3507, + "toId": 3508, + "weight": 21.87696 + }, + { + "fromId": 3508, + "toId": 3507, + "weight": 21.87696 + }, + { + "fromId": 3789, + "toId": 1669, + "weight": 19.117440000000002 + }, + { + "fromId": 1672, + "toId": 1221, + "weight": 18.080640000000002 + }, + { + "fromId": 1221, + "toId": 1672, + "weight": 18.080640000000002 + }, + { + "fromId": 11008, + "toId": 16275, + "weight": 7.34184 + }, + { + "fromId": 16275, + "toId": 11008, + "weight": 7.34184 + }, + { + "fromId": 11009, + "toId": 16276, + "weight": 9.339839999999999 + }, + { + "fromId": 16276, + "toId": 11009, + "weight": 9.339839999999999 + }, + { + "fromId": 11010, + "toId": 16277, + "weight": 14.45232 + }, + { + "fromId": 16277, + "toId": 11010, + "weight": 14.45232 + }, + { + "fromId": 1987, + "toId": 219, + "weight": 21.433200000000003 + }, + { + "fromId": 2072, + "toId": 11008, + "weight": 14.133600000000001 + }, + { + "fromId": 219, + "toId": 1987, + "weight": 21.433200000000003 + }, + { + "fromId": 11008, + "toId": 2072, + "weight": 14.133600000000001 + }, + { + "fromId": 219, + "toId": 11010, + "weight": 6.74016 + }, + { + "fromId": 11010, + "toId": 219, + "weight": 6.74016 + }, + { + "fromId": 219, + "toId": 11009, + "weight": 10.039919999999999 + }, + { + "fromId": 11009, + "toId": 219, + "weight": 10.039919999999999 + }, + { + "fromId": 1221, + "toId": 2072, + "weight": 31.017120000000002 + }, + { + "fromId": 2072, + "toId": 1221, + "weight": 31.017120000000002 + }, + { + "fromId": 12891, + "toId": 1988, + "weight": 18.889488 + }, + { + "fromId": 1988, + "toId": 12891, + "weight": 18.889488 + }, + { + "fromId": 1221, + "toId": 3360, + "weight": 51.17568 + }, + { + "fromId": 15494, + "toId": 3360, + "weight": 33.06288 + }, + { + "fromId": 3508, + "toId": 2072, + "weight": 22.6584 + }, + { + "fromId": 2072, + "toId": 3508, + "weight": 22.6584 + }, + { + "fromId": 3511, + "toId": 1987, + "weight": 17.377920000000003 + }, + { + "fromId": 3507, + "toId": 1669, + "weight": 33.76656 + }, + { + "fromId": 3510, + "toId": 11008, + "weight": 1.59384 + }, + { + "fromId": 11008, + "toId": 3510, + "weight": 1.59384 + }, + { + "fromId": 3510, + "toId": 11009, + "weight": 3.9808799999999995 + }, + { + "fromId": 11009, + "toId": 3510, + "weight": 3.9808799999999995 + }, + { + "fromId": 3360, + "toId": 216, + "weight": 25.802400000000002 + }, + { + "fromId": 3788, + "toId": 3507, + "weight": 20.477040000000002 + }, + { + "fromId": 3507, + "toId": 3788, + "weight": 20.477040000000002 + } + ], + "nodes_count": 26, + "edges_count": 46 +} +``` \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/geocoder/index.md b/docs/versions/7/api-reference/endpoints/geocoder/index.md new file mode 100644 index 0000000000..0abdb6423f --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/geocoder/index.md @@ -0,0 +1,17 @@ +# Geocoder Endpoint + +:::warning NOTE +This endpoint is not part of the openrouteservice, but of our public API. It is not available when running an own instance of openrouteservice. +::: + +The Geocoder Endpoint of our public API is served by a [Pelias](https://www.pelias.io) instance. +It resolves geographic coordinates to addresses and vice versa. + +Our public API exposes these endpoints: + +* [Forward Geocode Service](https://openrouteservice.org/dev/#/api-docs/geocode/search/get): In the simplest search, you can provide only one parameter, the text you want to match in any part of the location details. To do this, build a query where the text parameter is set to the item you want to find. +* [Geocode Autocomplete Service](https://openrouteservice.org/dev/#/api-docs/geocode/autocomplete/get): This type-ahead functionality helps users find what they are looking for, without requiring them to fully specify their search term. Typically, the user starts typing and a drop-down list appears where they can choose the term from the list below. +* [Structured Forward Geocode Service](https://openrouteservice.org/dev/#/api-docs/geocode/search/structured/get): Structured geocoding can improve how the items in your query are parsed and interpreted in a search by defining search terms for specific fields like `address`, `postalcode` etc. _(:warning: This endpoint is beta.)_ +* [Reverse Geocode Service](https://openrouteservice.org/dev/#/api-docs/geocode/reverse/get): Reverse geocoding is used for finding places or addresses near a latitude, longitude pair — like clicking on a map to see what's there. + +For more insights please refer to the [Pelias Documentation](https://github.com/pelias/documentation). \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/health/index.md b/docs/versions/7/api-reference/endpoints/health/index.md new file mode 100644 index 0000000000..1dd8fbf283 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/health/index.md @@ -0,0 +1,11 @@ +# Health Endpoint + +:::warning NOTE +This endpoint is not available in the public API, but you can use it when running an own instance of openrouteservice. +::: + +The GET request http://localhost:8082/ors/v2/health (host and port might be different) returns the current health or readiness status +of the running instance with two possible values: + +* `not ready`: the openrouteservice instance is still busy with building graphs +* `ready`: all required graphs are computed, the openrouteservice instance is ready to process spatial requests \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/index.md b/docs/versions/7/api-reference/endpoints/index.md new file mode 100644 index 0000000000..79eb899866 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/index.md @@ -0,0 +1,34 @@ +# Endpoints + +:::warning Hint +Not all endpoints are available in our live API. +But you can use them when hosting your own instance of openrouteservice. +::: + +## Spatial Endpoints + +Openrouteservice offers a set of endpoints for different spatial purposes: + +* [Directions Service](directions/index.md): Get directions for different modes of transport +* [Isochrones Service](isochrones/index.md): Obtain areas of reachability from given locations +* [Matrix Service](matrix/index.md): Obtain one-to-many, many-to-one and many-to-many matrices for time and distance +* [Snapping Service](snapping/index.md): Snap coordinates to the graph edges _(:warning: not available in our live API)_ + +## Technical Endpoints + +Furthermore, there are technical endpoints that are :warning: _not available_ in our live API: + +* [Export Service](export/index.md): Export the base graph for different modes of transport +* [Health Service](health/index.md): Get information on the health of the running openrouteservice instance +* [Status Service](status/index.md): Get information on the status of the openrouteservice instance + +## Included Services + +There are additional other services we are hosting for convenience, which are :warning: _only_ included in our public API. +They are standalone services that are :warning: _not included_ in a local openrouteservice instance and would need +a separate local installation: + +* [POI Service](poi/index.md): Stand-Alone service from HeiGIT that returns points of interest in the area surrounding a geometry +* [Elevation Service](elevation/index.md): Stand-Alone service from HeiGIT that returns the elevation for point or line geometries +* [Geocoding Service](geocoder/index.md): Third Party Service ([Pelias](https://www.pelias.io)) hosted by HeiGIT that resolves geographic coordinates to addresses and vice versa +* [Optimization Service](optimization/index.md): Third Party Service ([VROOM](https://github.com/VROOM-Project/vroom)) hosted by HeiGIT that optimizes routes for vehicle fleets diff --git a/docs/versions/7/api-reference/endpoints/isochrones/index.md b/docs/versions/7/api-reference/endpoints/isochrones/index.md new file mode 100644 index 0000000000..dfc8086c79 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/isochrones/index.md @@ -0,0 +1,14 @@ +# Isochrones Endpoint + +The Isochrone Service supports time and distance analyses for one single or multiple locations. +It is possible to specify the isochrone interval or provide multiple exact isochrone range values. +This service allows the same range of profile options as the `/directions` endpoint, +which help you to further customize your request to obtain a more detailed reachability area response. + +The result is a GeoJSON where the isochrone polygons are represented as `features`: + +```jsonpath +$.features +``` + +For an overview of all features of the isochrones endpoint please refer to the [API Playground](https://openrouteservice.org/dev/#/api-docs/isochrones_service). diff --git a/docs/versions/7/api-reference/endpoints/matrix/index.md b/docs/versions/7/api-reference/endpoints/matrix/index.md new file mode 100644 index 0000000000..c0736b9df3 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/matrix/index.md @@ -0,0 +1,60 @@ +# Matrix Endpoint + +The Matrix Endpoint calculates profile specific distance and time matrices between multiple source and destination positions. + +Besides parameters for the routing profile, the desired metrics (distance or time) and some more (see [API Playground](https://openrouteservice.org/dev/#/api-docs/matrix_service)), +the most important and mandatory content of a matrix request is a list of locations (coordinate tuples), e.g.: + +```json +{ + "locations": [ + [8.66044,49.41571], + [8.67842,49.40664], + [8.68370,49.40854], + [8.69014,49.40778] + ] +} +``` + +To specify, from which to which of these locations the metric should be calculated, the parameters `sources` and `destinations` can be specified in the request: + +```json +"sources": ["0", "1"], +"destinations": ["2", "3"] +``` + +The numbers in both parameter value arrays represent the index of the locations array in the same request. +In the example above, the duration from the first (0) and second (1) location to the third (2) and fourth (3) location will be calculated: + + 0 -> 2 + 0 -> 3 + 1 -> 2 + 1 -> 3 + +In the response, the results are contained in the node `durations`. +Here, the first array contains the duration from the first source (0) to both destinations (2 and 3), +and the second array contains the duration from the second source (1) to both destinations (2 and 3): + +```json + "durations": [ + [ // durations from first source to each destination + 448.82, // 0 -> 2 + 553.01 // 0 -> 3 + ], + [ // durations from second source to each destination + 142.68, // 1 -> 2 + 246.88 // 1 -> 3 + ] + ] +``` + +If `sources` or `destinations` is not specified in the request, each of both defaults to "all locations". +If for example the locations array has 5 entries, +the sources array has only one entry `[0]`, +and `destinations` is missing, then duration are calculated from location 0 to all locations in the location list. + +The first entry in the result `durations` list represents the duration from location 0 to itself and is `0`. + +To specify whether distances or duration (or both) are to be calculated, the `metrics` parameter can be set accordingly. + +For details about all request parameters and the response type, see the [API Playground](https://openrouteservice.org/dev/#/api-docs/matrix_service). diff --git a/docs/versions/7/api-reference/endpoints/optimization/index.md b/docs/versions/7/api-reference/endpoints/optimization/index.md new file mode 100644 index 0000000000..7ed4f60577 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/optimization/index.md @@ -0,0 +1,12 @@ +# Optimization Service + +:::warning NOTE +This endpoint is not part of the openrouteservice, but of our public API. It is not available when running an own instance of openrouteservice. +::: + +Our public API includes an instance of VROOM, an open-source optimization engine written in C++20 that aim at providing +good solutions to various real-life vehicle routing problems (VRP) within a small computing time. + +Details on how to use it can be found in our [API Playground](https://openrouteservice.org/dev/#/api-docs/optimization). + +If you need deeper insights or want to run your own instance, please visit the GitHub project [VROOM](https://github.com/VROOM-Project/vroom). \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/poi/index.md b/docs/versions/7/api-reference/endpoints/poi/index.md new file mode 100644 index 0000000000..c4dc05e0c2 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/poi/index.md @@ -0,0 +1,282 @@ +# Points-Of-Interest (POI) Service + +:::warning NOTE +This endpoint is not part of the openrouteservice, but of our public API. It is not available when running an own instance of openrouteservice. +::: + +The [openpoiservice](https://github.com/GIScience/openpoiservice) is a stand-alone service from HeiGIT that returns +points of interest in the area surrounding a geometry. + +It is a separate flask-based python application and lives in a +separate [GitHub repository](https://github.com/GIScience/openpoiservice), where you can also find more detailed +documentation. + +A complete and concise overview of all request parameters and return types can be found in +the [API Playground](https://openrouteservice.org/dev/#/api-docs/pois). + +## POI categories + +The POI stored in the openpoiservice database are organized in category groups and categories. Below you find tables +containing the related names for the ``category_group_ids`` and the subordinate ``category_ids``. + +### category_group_ids + +Category groups + +| Name | Value | +|:------------------------------------------------------------|:-----:| +| [accommodation](#accommodation-100) | 100 | +| [animals](#animals-120) | 120 | +| [arts_and_culture](#arts-and-culture-130) | 130 | +| [education](#education-150) | 150 | +| [facilities](#facilities-160) | 160 | +| [financial](#financial-190) | 190 | +| [healthcare](#healthcare-200) | 200 | +| [historic](#historic-220) | 220 | +| [leisure_and_entertainment](#leisure-and-entertainment-260) | 260 | +| [natural](#natural-330) | 330 | +| [public_places](#public-places-360) | 360 | +| [service](#service-390) | 390 | +| [shops](#shops-420) | 420 | +| [sustenance](#sustenance-560) | 560 | +| [transport](#transport-580) | 580 | +| [tourism](#tourism-620) | 620 | + +### category_ids + +Categories listed by group + +#### accommodation : 100 + +| Name | Value | +|:---------------|:-----:| +| alpine_hut | 101 | +| apartment | 102 | +| camp_site | 103 | +| caravan_site | 104 | +| chalet | 105 | +| guest_house | 106 | +| hostel | 107 | +| hotel | 108 | +| motel | 109 | +| wilderness_hut | 110 | + +#### animals : 120 + +| Name | Value | +|:----------------|:-----:| +| animal_boarding | 121 | +| animal_shelter | 122 | +| veterinary | 123 | +| pet | 124 | + +#### arts_and_culture : 130 + +| Name | Value | +|:-----------------|:-----:| +| arts_centre | 131 | +| gallery | 132 | +| library | 133 | +| museum | 134 | +| place_of_worship | 135 | +| studio | 136 | + +#### education : 150 + +| Name | Value | +|:----------------|:-----:| +| college | 151 | +| driving_school | 152 | +| kindergarten | 153 | +| language_school | 154 | +| music_school | 155 | +| school | 156 | +| university | 157 | + +#### facilities : 160 + +| Name | Value | | Name | Value | +|:------------------|:-----:|---|:----------------------|-------| +| compressed_air | 161 | | recycling | 172 | +| bench | 162 | | recycling_station | 173 | +| emergency_phone | 163 | | sanitary_dump_station | 174 | +| clock | 164 | | shelter | 175 | +| defibrillator | 165 | | shower | 176 | +| drinking_water | 166 | | table | 177 | +| fire_hydrant | 167 | | telephone | 178 | +| hunting_stand | 168 | | toilets | 179 | +| internet_cafe | 169 | | waste_basket | 180 | +| kneipp_water_cure | 170 | | waste_disposal | 181 | +| post_box | 171 | | water_point | 182 | + +#### financial : 190 + +| Name | Value | +|:-----------------|:-----:| +| atm | 191 | +| bank | 192 | +| bureau_de_change | 193 | + +#### healthcare : 200 + +| Name | Value | +|:-----------------------|:-----:| +| baby_hatch | 201 | +| clinic | 202 | +| dentist | 203 | +| doctors | 204 | +| emergency_access_point | 205 | +| hospital | 206 | +| nursing_home | 207 | +| pharmacy | 208 | +| retirement_home | 209 | +| social_facility | 210 | +| blood_donation | 211 | + +#### historic : 220 + +| Name | Value | | Name | Value | | Name | Value | +|:--------------------|:-----:|---|----------------|-------|---|-------------------|-------| +| aircraft | 221 | | farm | 231 | | optical_telegraph | 241 | +| aqueduct | 222 | | fort | 232 | | pillory | 242 | +| archaeological_site | 223 | | gallows | 233 | | ruins | 243 | +| castle | 224 | | highwater_mark | 234 | | rune_stone | 244 | +| cannon | 225 | | locomotive | 235 | | ship | 245 | +| city_gate | 226 | | manor | 236 | | tomb | 246 | +| citywalls | 227 | | memorial | 237 | | wayside_cross | 247 | +| battlefield | 228 | | milestone | 238 | | wayside_shrine | 248 | +| boundary_stone | 229 | | monastery | 239 | | wreck | 249 | +| building | 230 | | monument | 240 | | | | + +#### leisure_and_entertainment : 260 + +| Name | Value | | Name | Value | | Name | Value | | Name | Value | | Name | Value | +|:--------------------|:-----:|---|----------------|-------|---|---------------|-------|---|---------------|-------|---|---------------|-------| +| adult_gaming_centre | 261 | | fitness_centre | 271 | | picnic_table | 281 | | swimming_area | 291 | | dojo | 301 | +| amusement_arcade | 262 | | garden | 272 | | pitch | 282 | | swimming_pool | 292 | | gambling | 302 | +| beach_resort | 263 | | golf_course | 273 | | playground | 283 | | track | 293 | | nightclub | 303 | +| bandstand | 264 | | hackerspace | 274 | | raceway | 284 | | turkish_bath | 294 | | planetarium | 304 | +| bird_hide | 265 | | horse_riding | 275 | | public_bath | 285 | | water_park | 295 | | social_centre | 305 | +| common | 266 | | ice_ring | 276 | | sauna | 286 | | wildlife_hide | 296 | | spa | 306 | +| dance | 267 | | marina | 277 | | slipway | 287 | | brothel | 297 | | stripclub | 307 | +| dog_park | 268 | | miniature_golf | 278 | | sports_centre | 288 | | casino | 298 | | aquarium | 308 | +| firepit | 269 | | nature_reserve | 279 | | stadium | 289 | | cinema | 299 | | theme_park | 309 | +| fishing | 270 | | park | 280 | | summer_camp | 290 | | dive_centre | 300 | | zoo | 310 | + +#### natural : 330 + +| Name | Value | +|:--------------|:-----:| +| cave_entrance | 331 | +| beach | 332 | +| geyser | 333 | +| hill | 334 | +| peak | 335 | +| rock | 336 | +| saddle | 337 | +| spring | 338 | +| volcano | 339 | +| water | 340 | + +#### public_places : 360 + +| Name | Value | +|:-----------------|:-----:| +| embassy | 361 | +| crematorium | 362 | +| community_centre | 363 | +| courthouse | 364 | +| coworking_space | 365 | +| crypt | 366 | +| fire_station | 367 | +| grave_yard | 368 | +| police | 369 | +| post_office | 370 | +| prison | 371 | +| ranger_station | 372 | +| rescue_station | 373 | +| townhall | 374 | + +#### service : 390 + +| Name | Value | +|:-------------|:-----:| +| beauty | 391 | +| estate_agent | 392 | +| dry_cleaning | 393 | +| glaziery | 394 | +| hairdresser | 395 | +| laundry | 396 | +| massage | 397 | +| photo_booth | 398 | +| tailor | 399 | +| tattoo | 400 | + +#### shops : 420 + +| Name | Value | Name | Value | Name | Value | Name | Value | Name | Value | Name | Value | +|:------------------|:-----:|------------------|-------|---------------------|-------|-----------------------|-------|---------------|-------|-----------------|-------| +| agrarian | 421 | curtain | 441 | e-cigarette | 461 | hifi | 481 | optician | 502 | tiles | 522 | +| alcohol | 422 | cheese | 442 | farm | 462 | houseware | 482 | organic | 503 | tobacco | 523 | +| antiques | 423 | chemist | 443 | fashion | 463 | hunting | 483 | outdoor | 504 | toys | 524 | +| art | 424 | chocolate | 444 | fishing | 464 | jewelry | 485 | paint | 505 | trophy | 525 | +| bag | 425 | clock | 445 | florist | 465 | leather | 486 | pastry | 506 | tyres | 526 | +| bakery | 426 | clocks | 446 | funeral_directors | 466 | locksmith | 487 | perfumery | 507 | variety_store | 527 | +| bed | 427 | clothes | 447 | furniture | 467 | kiosk | 488 | photo | 508 | vending_machine | 528 | +| beverages | 428 | coffee | 448 | games | 468 | kitchen | 489 | pyrotechnics | 509 | video | 529 | +| bicycle | 429 | computer | 449 | garden_centre | 469 | lamps | 490 | radiotechnics | 510 | video_games | 530 | +| books | 430 | confectionery | 450 | garden_furniture | 470 | lottery | 491 | seafood | 511 | watches | 531 | +| boutique | 431 | convenience | 451 | gas | 471 | mall | 492 | second_hand | 512 | weapons | 532 | +| brewing_supplies | 432 | copyshop | 452 | general | 472 | marketplace | 493 | security | 513 | wine | 533 | +| business_machines | 433 | cosmetics | 453 | gift | 473 | medical_supply | 494 | shoes | 514 | | | +| butcher | 434 | dairy | 454 | greengrocer | 474 | mobile_phone | 495 | spices | 515 | | | +| cafe | 435 | deli | 455 | grocery | 475 | model | 496 | sports | 516 | | | +| camera | 436 | department_store | 456 | interior_decoration | 476 | motorcycle | 497 | stationery | 517 | | | +| candles | 437 | doityourself | 457 | hairdresser_supply | 477 | music | 498 | supermarket | 518 | | | +| car | 438 | electrical | 458 | hardware | 478 | musical_instrument | 499 | swimming_pool | 519 | | | +| car_parts | 439 | electronics | 459 | hearing_aids | 479 | nutrition_supplements | 500 | tea | 520 | | | +| carpet | 440 | erotic | 460 | herbalist | 480 | newsagent | 501 | ticket | 521 | | | + +#### sustenance : 560 + +| Name | Value | +|:---------------|:-----:| +| bar | 561 | +| bbq | 562 | +| biergarten | 563 | +| café | 564 | +| drinking_water | 565 | +| fast_food | 566 | +| food_court | 567 | +| ice_cream | 568 | +| pub | 569 | +| restaurant | 570 | + +#### transport : 580 + +| Name | Value | | Name | Value | | Name | Value | +|:-----------------------|:-----:|---|--------------------|-------|---|------------------|-------| +| aerodrome | 581 | | car_sharing | 591 | | parking | 601 | +| aeroport | 582 | | car_wash | 592 | | parking_entrance | 602 | +| bicycle_parking | 583 | | charging_station | 593 | | parking_space | 603 | +| bicycle_rental | 584 | | ev_charging | 594 | | station | 604 | +| bicycle_repair_station | 585 | | ferry_terminal | 595 | | tram_stop | 605 | +| boat_sharing | 586 | | fuel | 596 | | taxi | 606 | +| bus_station | 587 | | halt | 597 | | platform | 607 | +| bus_stop | 588 | | helipad | 598 | | stop_position | 608 | +| car_rental | 589 | | heliport | 599 | | stop_area | 609 | +| car_repair | 590 | | motorcycle_parking | 600 | | station | 610 | + +Note, that `station` appears once as a railway station (604) and once as a public transport station (610). + +#### tourism : 620 + +| Name | Value | +|:--------------|:-----:| +| artwork | 621 | +| attraction | 622 | +| fountain | 623 | +| information | 624 | +| picnic_site | 625 | +| travel_agency | 626 | +| viewpoint | 627 | \ No newline at end of file diff --git a/docs/versions/7/api-reference/endpoints/snapping/index.md b/docs/versions/7/api-reference/endpoints/snapping/index.md new file mode 100644 index 0000000000..59dc3df13b --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/snapping/index.md @@ -0,0 +1,87 @@ +# Snapping Endpoint + +:::warning NOTE +This endpoint is not available in the public API, +but you can use it when running an own instance of openrouteservice. +You can easily create requests with the [swagger-ui](/api-reference/index.md#swagger-ui). +::: + +The snapping endpoint can be used to snap points to the edges of the street network for a specific means of transportation. + +The endpoint returns a list of points snapped to the nearest edge in the graph as JSON or GeoJSON. +In case an appropriate snapping point cannot be found within the specified search radius, "null" is returned. + +The routing profile has to be specified as path parameter. +The list of points to be snapped has to be specified as parameter `locations` in the request body, +a list or longitude/latitude tuples. +Another required request body parameter is the `radius` in meters. + +The result contains the snapped points in the same order as their origin position in the request. + +In the following example request and result, the first point cannot be snapped within the search radius +and therefore the first entry in the result `locations` is null. + +Request: +```shell +curl -X 'POST' \ + 'http://localhost:8082/ors/v2/snap/driving-car/json' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "locations": [ + [ + 8.681495, + 49.51461 + ], + [ + 8.686507, + 49.41943 + ] + ], + "id": "my_request", + "radius": 300 +}' +``` + +Response: +```json +{ + "locations": [ + null, + { + "location": [ + 8.686507, + 49.41943 + ], + "name": "Werderplatz", + "snapped_distance": 0.01 + } + ], + "metadata": { + "attribution": "openrouteservice.org, OpenStreetMap contributors", + "service": "snap", + "timestamp": 1702565781290, + "query": { + "locations": [ + [ + 8.681495, + 49.51461 + ], + [ + 8.686507, + 49.41943 + ] + ], + "profile": "driving-car", + "id": "my_request", + "format": "json", + "radius": 300 + }, + "engine": { + "version": "8.0", + "build_date": "2023-12-07T10:16:51Z", + "graph_date": "2023-12-07T15:04:45Z" + } + } +} +``` diff --git a/docs/versions/7/api-reference/endpoints/status/index.md b/docs/versions/7/api-reference/endpoints/status/index.md new file mode 100644 index 0000000000..19362251f0 --- /dev/null +++ b/docs/versions/7/api-reference/endpoints/status/index.md @@ -0,0 +1,102 @@ +# Status Endpoint + +:::warning NOTE +This endpoint is not available in the public API, but you can use it when running an own instance of openrouteservice. +::: + +The GET request http://localhost:8082/ors/v2/status (host and port are dependent on the setup) returns basic information about the running instance: + +* `languages`: available languages +* `engine`: the build date and version of the openrouteservice +* `profiles`: available routing profiles, info about storages and configured limits +* `services`: activated services + +[//]: # (TODO: engine git die ORS version aus, nicht die eigentliche engine version, die wir dann auch im graph management verwenden, oder?) + + +:::details This is an example response: +```json +{ + "languages": [ + "cs", + "cs-cz", + "de", + "de-de", + "en", + "en-us", + "eo", + "eo-eo", + "es", + "es-es", + "fr", + "fr-fr", + "gr", + "gr-gr", + "he", + "he-il", + "hu", + "hu-hu", + "id", + "id-id", + "it", + "it-it", + "ja", + "ja-jp", + "ne", + "ne-np", + "nl", + "nl-nl", + "pl", + "pl-pl", + "pt", + "pt-pt", + "ro", + "ro-ro", + "ru", + "ru-ru", + "tr", + "tr-tr", + "zh", + "zh-cn" + ], + "engine": { + "build_date": "2023-12-15T14:31:27Z", + "version": "8.0" + }, + "profiles": { + "profile 1": { + "storages": { + "WayCategory": { + "gh_profile": "car_ors_fastest_with_turn_costs" + }, + "HeavyVehicle": { + "gh_profile": "car_ors_fastest_with_turn_costs" + }, + "WaySurfaceType": { + "gh_profile": "car_ors_fastest_with_turn_costs" + }, + "RoadAccessRestrictions": { + "gh_profile": "car_ors_fastest_with_turn_costs", + "use_for_warnings": "true" + } + }, + "profiles": "driving-car", + "creation_date": "", + "limits": { + "maximum_distance": 100000, + "maximum_waypoints": 50, + "maximum_distance_dynamic_weights": 100000, + "maximum_distance_avoid_areas": 100000 + } + } + }, + "services": [ + "routing", + "isochrones", + "matrix", + "snap" + ] +} +``` +::: + diff --git a/docs/versions/7/api-reference/error-codes.md b/docs/versions/7/api-reference/error-codes.md new file mode 100644 index 0000000000..1ae5237bcc --- /dev/null +++ b/docs/versions/7/api-reference/error-codes.md @@ -0,0 +1,133 @@ +# Error Codes + +## HTTP Status Codes + +The following table describes the supported HTTP status codes. + +| HTTP Status Code | Description | +|:----------------:|--------------------------------------------------------------------------------------------------------------------------------------------| +| 200 | Standard response for successfully processed requests. | +| 400 | The request is incorrect and therefore can not be processed. | +| 404 | The end point is not available, or a given request completed successfully but found no results. | +| 405 | The specified HTTP method is not supported. For more details, refer to the Endpoint documentation. | +| 413 | The request is larger than the server is able to process, the data provided in the request exceeds the capacity limit. | +| 500 | An unexpected error was encountered and more detailed internal error code is provided (see [Internal Error Codes](#internal-error-codes)). | +| 501 | Indicates that the server does not support the functionality needed to fulfill the request. | +| 503 | The server is currently unavailable due to overload or maintenance. | + + + +## Internal Error Codes + +The following sections describes the list of possible internal error codes that might be provided by different ORS +Endpoints. + +### Routing API + +[//]: # (keep in sync with org.heigit.ors.routing.RoutingErrorCodes) + +| Error Code | Description | +|:----------:|----------------------------------------------------| +| 2000 | Unable to parse JSON request. |x +| 2001 | Required parameter is missing. |x +| 2002 | Invalid parameter format. |x +| 2003 | Invalid parameter value. |x +| 2004 | Parameter value exceeds the maximum allowed limit. | +| 2006 | Unable to parse the request to the export handler. | +| 2007 | Unsupported export format. |x +| 2008 | Empty Element. | +| 2009 | Route could not be found between locations. | +| 2010 | Point was not found. | +| 2011 | Incompatible parameters. | +| 2012 | Unknown parameter. |x +| 2013 | Entry not reached. | +| 2014 | Exit not reached. | +| 2015 | Entry not reached. | +| 2016 | No route between entry and exit found. | +| 2017 | Maximum number of nodes exceeded. | +| 2099 | Unknown internal error. | + +### Isochrones API + +[//]: # (keep in sync with org.heigit.ors.isochrones.IsochronesErrorCodes) + +| Error Code | Description | +|:----------:|----------------------------------------------------| +| 3000 | Unable to parse JSON request. | +| 3001 | Required parameter is missing. | +| 3002 | Invalid parameter format. | +| 3003 | Invalid parameter value. | +| 3004 | Parameter value exceeds the maximum allowed limit. | +| 3005 | Requested feature is not supported. | +| 3006 | Unable to parse the request to the export handler. | +| 3007 | Unsupported export format. | +| 3008 | Empty Element. | +| 3011 | Unknown parameter. | +| 3012 | Parameter value exceeds the minimum allowed limit. | +| 3099 | Unknown internal error. | + +### POIs API + +[//]: # (keep in sync with openpoiservice https://github.com/GIScience/openpoiservice/blob/master/openpoiservice/server/api/__init__.py) + +| Error Code | Description | +|:----------:|-----------------------------------------------------| +| 4000 | Invalid JSON object in request. | +| 4001 | Category or category group ids missing. | +| 4002 | Geometry is missing. | +| 4003 | Bounding box and or geojson not present in request. | +| 4004 | Buffer is missing. | +| 4005 | Geometry length does not meet the restrictions. | +| 4006 | Unsupported HTTP method. | +| 4007 | GeoJSON parsing error. | +| 4008 | Geometry size does not meet the restrictions. | +| 4099 | Unknown internal error. | + +### Matrix API + +[//]: # (keep in sync with org.heigit.ors.matrix.MatrixErrorCodes) + +| Error Code | Description | +|:----------:|----------------------------------------------------| +| 6000 | Unable to parse JSON request. | +| 6001 | Required parameter is missing. | +| 6002 | Invalid parameter format. | +| 6003 | Invalid parameter value. | +| 6004 | Parameter value exceeds the maximum allowed limit. | +| 6006 | Unable to parse the request to the export handler. | +| 6007 | Unsupported export format. | +| 6008 | Empty Element. | +| 6010 | Point not found. | +| 6011 | Unknown parameter. | +| 6020 | Maximum number of visited nodes exceeded. | +| 6099 | Unknown internal error. | + +### Export API + +[//]: # (keep in sync with org.heigit.ors.export.ExportErrorCodes) + +| Error Code | Description | +|:----------:|--------------------------------| +| 7000 | Unable to parse JSON request. | +| 7001 | Required parameter is missing. | +| 7002 | Invalid parameter format. | +| 7003 | Invalid parameter value. | +| 7004 | Unknown parameter. | +| 7005 | Mismatched input. | +| 7006 | Unsupported export format. | +| 7099 | Unknown internal error. | + +### Snapping API + +[//]: # (keep in sync with org.heigit.ors.snapping.SnappingErrorCodes) + +| Error Code | Description | +|:----------:|--------------------------------| +| 8000 | Unable to parse JSON request. | +| 8001 | Required parameter is missing. | +| 8002 | Invalid parameter format. | +| 8003 | Invalid parameter value. | +| 8004 | Unknown parameter. | +| 8006 | Unsupported export format. | +| 8010 | Point not found. | +| 8099 | Unknown internal error. | diff --git a/docs/versions/7/api-reference/index.md b/docs/versions/7/api-reference/index.md new file mode 100644 index 0000000000..3db20d0bbe --- /dev/null +++ b/docs/versions/7/api-reference/index.md @@ -0,0 +1,44 @@ +# API Reference + +There are different ways to get information about the openrouteservice API. + +As a first starting point best try out our [API Playground](#api-playground). + +The following chapter [Endpoints](endpoints/index.md) contains explanation and examples for some selected topics that might not +be explained sufficiently in the API Playground. +Here, the single endpoints are not completely covered with all their request parameters etc. +But on the other hand, there is also information about endpoints that are not available in our live API, +but e.g. on instances you run or host yourself like [Export](endpoints/export/index.md), [Snapping](endpoints/snapping/index.md), [Health](endpoints/health/index.md) and [Status](endpoints/status/index.md). + +If you are developing ORS or running your own instance, you might benefit from the included [Swagger-UI](#swagger-ui). + +## API Playground + +The [API Playground](https://openrouteservice.org/dev/#/api-docs/directions_service) is a complete, interactive and concise technical documentation of our live API. +It can also be used to send sample requests to either our live API or an instance of openrouteservice running on your local machine. +Use the form "API Server" on the top left to select and edit "Development Server" if you want to send requests to your local instance: +![Development server usage](/playground-select-server.png "Development server usage"){ style="display: block; margin: 0 auto"} + +The responses of your sample requests are visualized on a small map on the bottom right, +but can also be shown as json, table or downloaded as file: +![Example request visualization](/playground-map.png "Example request visualization"){ style="display: block; margin: 0 auto"} + +::: warning Hint +If you prefer the swagger-ui you can also use the [swagger editor](https://editor-next.swagger.io/) and load +the full OpenAPI spec file for our API from https://openrouteservice.org/wp-json/ors-api/v1/api-doc/source/V2. +However, some of the displayed endpoints or features won't be accessible with our live API. +::: + +## Swagger-UI + +Local instances of openrouteservice also have an accessible swagger-ui. +This is a way to get an interactive API doc for your current or an older version of openrouteservice: +1. Checkout the source code for the desired version or tag and [run the service locally](/run-instance/installation/index.md). +2. You can then navigate to the swagger-ui hosted by your local instance in your browser: [http://localhost:8082/ors/swagger-ui/index.html](http://localhost:8082/ors/swagger-ui/index.html) +(the port may be different on your local environment). + +:::warning Hint +The swagger-ui is not available on the production ORS instances hosted by HeiGIT. +::: + +![Swagger-UI](/swagger-ui.png "Swagger UI") diff --git a/docs/versions/7/contributing/backend-documentation.md b/docs/versions/7/contributing/backend-documentation.md new file mode 100644 index 0000000000..fc9b407ab8 --- /dev/null +++ b/docs/versions/7/contributing/backend-documentation.md @@ -0,0 +1,41 @@ +# Setting up the backend documentation + +The backend documentation is built using [vitepress](https://vitepress.dev/guide/getting-started). + +Requirements: +- [node version 20](https://nodejs.org/en/download) + +## Set up locally + +To run a development version with hot reload locally, run + +```bash +npm install +npm run docs:dev +``` + +To build the static files to `docs/.vitepress/dist` and preview the production version locally, use + +```bash +npm run docs:build +npm run docs:preview +``` + +::: info +For Markdown links to resolve properly in your IDE (e.g. Intellij), right-click the `docs` folder and +mark it as 'Sources Root'. +::: + +## Configuration and Theme + +Configuration of the site (e.g. sidebar, navigation, …) is in `docs/.vitepress/config.js`. +Follow the [vitepress reference](https://vitepress.dev/reference/site-config) for changes to that. + +The custom theme is in `docs/.vitepress/theme`. +See the [vitepress guide](https://vitepress.dev/guide/extending-default-theme) for details. + +## Deployed version + +The documentation is deployed via a GitHub Action in `.github/workflows/deploy-docs.yml` +using [GitHub Pages](https://pages.github.com/) +on [giscience.github.io/openrouteservice](https://giscience.github.io/openrouteservice/). diff --git a/docs/versions/7/contributing/contributing-translations.md b/docs/versions/7/contributing/contributing-translations.md new file mode 100644 index 0000000000..8b579a7894 --- /dev/null +++ b/docs/versions/7/contributing/contributing-translations.md @@ -0,0 +1,50 @@ +# Translations +If you notice anything wrong with translations, or you want to add a new language to the openrouteservice instructions, please add/edit files in the [`ors-engine/src/main/resources/resources/locales`](https://github.com/GIScience/openrouteservice/tree/main/ors-engine/src/main/resources/resources/locales) folder. You can use the [`ors_en.resources`](https://github.com/GIScience/openrouteservice/blob/main/ors-engine/src/main/resources/resources/locales/ors_en-US.resources) file as a template as to what information needs to be present. +As a guide, for each instruction there are two formats - one where there is a named place (i.e. 47 Berliner Straße) and one without. It is important to keep the `{way_name}` tag in the text, but it should be moved to the correct location. +To show openrouteservice what language is being used, you should alter the name of the file to include the ISO identifier (i.e. for Austrian German the filename would be `ors_de_AT.resources`). + +Since the update to the v2 API, we make use of the Spring framework. Because of that, you also need to make a slight modification to a java file that declares what parameters can be passed through to the API. This file is located in [`ors-api/src/main/java/org/heigit/ors/api/APIEnums.java`](https://github.com/GIScience/openrouteservice/blob/main/ors-api/src/main/java/org/heigit/ors/api/APIEnums.java) and the section that needs updating is the `public enum Languages` enum. If (for example) you want to add Polish to the languages, you would also need to add here something like `PL("pl")` to the list where the part in the `("...")` is what would be passed in to the API to select that language. So ultimately you would end up with: +```java +public enum Languages { + public enum Languages { + CS("cs"), + CS_CZ("cs-cz"), + DE("de"), + DE_DE("de-de"), + EN("en"), + EN_US("en-us"), + EO("eo"), + EO_EO("eo-eo"), + ES("es"), + ES_ES("es-es"), + FR("fr"), + FR_FR("fr-fr"), + GR("gr"), + GR_GR("gr-gr"), + HE("he"), + HE_IL("he-il"), + HU("hu"), + HU_HU("hu-hu"), + ID("id"), + ID_ID("id-id"), + IT("it"), + IT_IT("it-it"), + JA("ja"), + JA_JP("ja-jp"), + NE("ne"), + NE_NP("ne-np"), + NL("nl"), + NL_NL("nl-nl"), + PL("pl"), + PL_PL("pl-pl"), + PT("pt"), + PT_PT("pt-pt"), + RO("ro"), + RO_RO("ro-ro"), + RU("ru"), + RU_RU("ru-ru"), + TR("tr"), + TR_TR("tr-tr"), + ZH("zh"), + ZH_CN("zh-cn"); +``` diff --git a/docs/versions/7/contributing/index.md b/docs/versions/7/contributing/index.md new file mode 100644 index 0000000000..cc696279da --- /dev/null +++ b/docs/versions/7/contributing/index.md @@ -0,0 +1,27 @@ +# Contributing + +We are glad that you decided to contribute to the openrouteservice. + +There are plenty of ways to help make it an even better routing service. +Whether you are a Java developer who is interested in fixing +some bugs or adding some new functionality, someone who knows an area well and +can update information in OSM so that openrouteservice can take it into +account, or even someone who speaks different languages and is will to provide +some translations for routing instructions, there will be something that you +can help with. + +Feel free to create an [issue](https://github.com/GIScience/openrouteservice/issues) and label it accordingly. +If your issue regards the openrouteservice maps client on [maps.openrouteservice.org](https://maps.openrouteservice.org) +please use the [corresponding repository](https://github.com/GIScience/ors-maps-client/issues). + +## Contributing code + +To help you get started, here is a document describing how to [open the code in IntelliJ](./opening-project-in-intellij). +We also put together a few [guidelines](https://github.com/GIScience/openrouteservice/blob/main/CONTRIBUTE.md) +to help you in the process and keep the repository clean and tidy. + +## Other ways to contribute + +* [Contributing translations](./contributing-translations) +* [Contributing to this documentation](./backend-documentation) +* [Updating OpenStreetMap](https://wiki.openstreetmap.org/wiki/Beginners%27_guide) diff --git a/docs/versions/7/contributing/opening-project-in-intellij.md b/docs/versions/7/contributing/opening-project-in-intellij.md new file mode 100644 index 0000000000..2a763abc37 --- /dev/null +++ b/docs/versions/7/contributing/opening-project-in-intellij.md @@ -0,0 +1,9 @@ +# Opening openrouteservice code in IntelliJ + +Though IntelliJ provides functionality to directly clone a repository, the steps below are the general procedure for getting openrouteservice up and running in IntelliJ: +1. Clone the repository into a folder +2. Open IntelliJ and Create a project via File -> New -> Project from Existing Sources +3. Select the "pom.xml" file from the cloned "openrouteservice" folder and click "Open" +4. Click through project settings with "Next" until you reach the page for selecting project SDK. +5. Choose "17" as project SDK and click "Next" +6. Finalize the project import by clicking "Finish" in the last window. diff --git a/docs/versions/7/frequently-asked-questions.md b/docs/versions/7/frequently-asked-questions.md new file mode 100644 index 0000000000..9a3ae3fd8d --- /dev/null +++ b/docs/versions/7/frequently-asked-questions.md @@ -0,0 +1,72 @@ +--- +title: FAQ +--- + +# Frequently Asked Questions + +## Why is my ors reporting `Could not find point`? + +This is a frequently encountered error message: +``` +Could not find point 0: 25.3531986 51.5214311 within a radius of 350.0 meters.; +Could not find point 1: 25.3524229 51.4627229 within a radius of 350.0 meters. +``` + +There are three main reasons for this problem, listed in order of most to least common. + +1. If both points are not found you probably just mixed up Lat and Long. Our + API expects coordinates in [lon,lat] order as described in our documentation + (check help button for parameter info). Output is also [lon,lat] as by the + GeoJSON Specification. + +2. The given start and endpoint are further than 350m away from any routable + road. The maximum distance for snapping to road segments in our API is 350m. + This can be customized for local installations via the + `maximum_snapping_radius` and `location_index_resolution` config-parameter. See + [configuration](./run-instance/configuration/ors/engine/profiles.md) for details. + +3. The start and endpoint are passed with correct lon,lat-order and are within + 350m of a routable road. This should only happen with a local installation. + Usually, this means that ors is trying to route in an area that graphs have not + been built for. + If routes in Heidelberg(Germany) can be found, the ors is still running on the + default dataset. + +## When does the OSM data update in the openrouteservice? + +The openrouteservice builds its data from the `planet.osm.pbf`-files. According +to [the osm-wiki](https://wiki.openstreetmap.org/wiki/Planet.osm), these files +take two days to build and are updated weekly. + +Since the `planet`-files are rather large (currently over 60GB), there is a bit +of work involved to make sure the download went right and the file is not +corrupted in any way and in fact new. Parts of this process are in the hands of +the OSM, parts are done by the openrouteservice. + +Once the newest `planet`-file is on the openrouteservice-servers, it needs to +be preprocessed before the openrouteservice can start building the graphs used +for routing. + +The build process in itself is [rather +resource-intensive](./run-instance/system-requirements.md). It takes roughly two +days for any one of the nine profiles. For the mentioned resource requirements, +this means that it will take roughly a week for all profiles to be re-built. + +Once the graphs are built, the production instances have to load them. Since +this should happen in a low-traffic time slot, it is also scheduled to happen +once per week. + +To sum up: if you change anything in the OSM, it will therefore take roughly a +week until it's included in the `planet`-file. This gets read once a week, the +build takes a week and reloading graphs happens once a week. + +If everything aligns as it should, changes should be reflected in the +openrouteservice within two to three weeks. + +If, however, anything goes wrong anywhere, this will usually mean a delay of at +least a week, assuming it gets noticed and fixed immediately. It is no sign of +concern, if changes are not reflected within a month. + +## I get an Error `Native memory allocation (mmap) failed to map 16384 bytes for committing reserved memory` + +See memory mapping section in [system requirements](./run-instance/system-requirements.md#memory-mapping-in-large-builds-with-a-containerized-openrouteservice-instance). diff --git a/docs/versions/7/getting-started.md b/docs/versions/7/getting-started.md new file mode 100644 index 0000000000..e3f2edf56e --- /dev/null +++ b/docs/versions/7/getting-started.md @@ -0,0 +1,27 @@ +# Getting started with v7 + + +The fastest way to get to the info you are looking for is **the search bar above**. If that doesn't work, the sidebar has you covered: + +* The [API Reference](./api-reference/index.md) contains info about openrouteservice's API [endpoints](./api-reference/endpoints/index.md) and usage, both for using the [public API](https://openrouteservice.org/dev/#/api-docs) and using locally run instances of openrouteservice. + * [Directions](./api-reference/endpoints/directions/index.md) endpoint + * [Isochrones](./api-reference/endpoints/isochrones/index.md) endpoint + * [Matrix](./api-reference/endpoints/matrix/index.md) endpoint + * [Snapping](./api-reference/endpoints/snapping/index.md) endpoint _(not available in our live API)_ + * [Export](./api-reference/endpoints/export/index.md) endpoint _(not available in our live API)_ +* [Run ORS instance](./run-instance/index.md) contains all info about setting up the ors locally. + * [System requirements](./run-instance/system-requirements) + * [Data](./run-instance/data) used by openrouteservice + * [Installation](./run-instance/installation/index.md) either directly using [JAR / WAR](./run-instance/installation/running-jar-war) artifacts, with [Docker](./run-instance/installation/running-with-docker) or [building from source](./run-instance/installation/building-from-source) + * [Configuration](./run-instance/configuration/index.md) of openrouteservice instances +* [Contributing](./contributing/index.md) contains info about contributing to the openrouteservice, the OpenStreetMap and [translations](./contributing/contributing-translations) +* [Technical details](./technical-details/index.md) contains all sorts of explanation about the internal workings of the openrouteservice. +* [FAQ](./frequently-asked-questions) contains answers to frequently asked questions. + +For a more general overview, visit our website at [openrouteservice.org](https://openrouteservice.org). + +For an easy and interactive way to test the api, you can try out the different endpoints instantly and start firing requests at the [API Playground](https://openrouteservice.org/dev/#/api-docs) after obtaining an account and an API key. + +If you spot issues with the documentation, click the link below the page to directly open an issue on GitHub. + +If you have questions that aren't answered here, or you want to provide feedback or point out problems, go to our [Forum](https://ask.openrouteservice.org). diff --git a/docs/versions/7/index.md b/docs/versions/7/index.md new file mode 100644 index 0000000000..8f49dd7a79 --- /dev/null +++ b/docs/versions/7/index.md @@ -0,0 +1,34 @@ +--- +title: Home +layout: home +hero: + name: Openrouteservice Backend Documentation + tagline: Smart mobility made easy + actions: + - theme: brand + text: Getting Started + link: ./getting-started + - theme: alt + text: API Playground + link: https://openrouteservice.org/dev/#/api-docs/v2/directions/{profile}/post + - theme: alt + text: Contributing + link: ./contributing/ + - theme: alt + text: Reference + link: ./api-reference/ + +features: + - title: Installation + details: Set up your own openrouteservice instance. + linkText: Instructions + link: ./run-instance/installation/ + - title: Data Sources + details: Find all information on the data used by the openrouteservice here. + linkText: Data + link: ./run-instance/data + - title: Latest Changes + details: Check out the latest changes to the openrouteservice. + linkText: CHANGELOG.md + link: https://github.com/GIScience/openrouteservice/blob/main/CHANGELOG.md +--- diff --git a/docs/versions/7/installation/Location-of-OSM-file.md b/docs/versions/7/installation/Location-of-OSM-file.md new file mode 100644 index 0000000000..a08ad42771 --- /dev/null +++ b/docs/versions/7/installation/Location-of-OSM-file.md @@ -0,0 +1,40 @@ +--- +title: A comprehensive guide to the location of the OSM file +--- +Let's say you have just downloaded a fresh OSM file that you want to use for routing, e.g. `andorra-latest.osm.pbf`. +Given the multiple ways to set up and configure the openrouteservice, it's not quite clear where this should go. + +In theory, this should be easy. The osm file used is simply the one set in the `sources` parameter in the configuration file. +However, there's a few pitfalls: + +## How does ORS know which configuration file to use + +The openrouteservice will first determine the configuration file being used. +To do so, it searches the following places: + +1. A system property called `ors_config`. This is useful to set a specific + configuration file, e.g. running ors with a configuration specific for API + tests in IDEA by setting the `ors_config` property in the Runner configuration. + +2. A system property called `ors_app_config`. This is deprecated, the above name should be used. + +3. An environment variable called `ORS_CONFIG`. This is useful to set a + specific configuration file when building the ors via a script, such as a + Dockerfile. + +4. An environment variable called `ORS_APP_CONFIG`. This is deprecated, the above name should be used. + +5. A file named `ors-config.json` in the class path. When built with maven and + run through tomcat, that file should be located in + `openrouteservice/src/main/resources`. + +6. A file named `app.config` in the class path. This is deprecated, the above name should be used. + + +k + + +* location configured in osm-config.json in `openrouteservice/openrouteservice/src/main/resources` + search for `sources` +* sources is an array containing one string to the osm file to be used +* relative to ??? diff --git a/docs/versions/7/performance.txt b/docs/versions/7/performance.txt new file mode 100644 index 0000000000..aa5fe5cd2a --- /dev/null +++ b/docs/versions/7/performance.txt @@ -0,0 +1,16 @@ + +On a machine with an Intel i7-6600U CPU (2x2.6GHz), it will take around 40 to 50 seconds to compile ors and start building graphs. +On a machine with an AMD Ryzen 7 PRO 4750U CPU (8x1.7GHz), it will take around 20 to 30 seconds to compile ors and start building graphs. + +This time is **not** included in the following table. Note, that graphs for all nine profiles were being built. +TODO: infos about config + +| PBF-File | Size | Build duration (min:sec) | Read Duration | Mem usage | +|-------------------------------------+--------+--------------------------+---------------+-----------| +| berlin-20221118.osm.pbf | 67 MB | 213 s | 3s | 345 MB | +| baden-wuerttemberg-20221117.osm.pbf | 525 MB | 2517 s | 12s | 2.5 GB | +| nepal-latest.osm.pbf | 343 MB | 895 s | 9s | 1.3 GB | +| ile-de-france-latest.osm.pbf | 275 MB | 1076 s | 8s | 992 MB | +| tennessee-latest.osm.pbf | 120 Mb | +| north-carolina-latest.osm.pbf | 293 Mb | +| spain-latest.osm.pbf | 948 Mb | diff --git a/docs/versions/7/public/openrouteservice.png b/docs/versions/7/public/openrouteservice.png new file mode 100644 index 0000000000000000000000000000000000000000..af1325c038fad56d8037219e09ab505042598427 GIT binary patch literal 105985 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 Nx9!=QZ$`iH{{Vf{FsA?j literal 0 HcmV?d00001 diff --git a/docs/versions/7/public/openrouteservice_dark.png b/docs/versions/7/public/openrouteservice_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0b5aed1db45e6bdc0b66418cf48b5b19785d6d GIT binary patch literal 25676 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 ZMn87lhIXr^tlgAZU0Da2qj>84{{d!o?|uLP literal 0 HcmV?d00001 diff --git a/docs/versions/7/public/ors_fav.png b/docs/versions/7/public/ors_fav.png new file mode 100644 index 0000000000000000000000000000000000000000..3548419e1e02e17748ad2de8581f1cbaa0ac83df GIT binary patch literal 1861 zcmY*Zc~H}b5)Kej4v9wqZ5UB1g7t!m2P%?j1uawwCh7e4ss374GNRW^~5|ZDQ{Envoy|**FJF_$U&F=TjZf!)T^PY?uxDNuCo{P~|89jT1K0853Pd=Z9*M~6C4MB}s4Gn>mLlWk^ZXU-*E zu(r0D=SXpLqroNx1`TjB3)o2)A;SkVI2Qhu-<>(zkC22jOTwb%kB5(~|+%GTBv1QkwBP8h7f!QPfKFvt*&&Sx3iR2VQo!*E&J2W(b30u zljD5P;(`nUpSAFS>ZT*ymumW@C<-CQA(LSc1?47S)P(3UvyQ+Kf>7XQRbhTn{ewTb zSFWZ0lnG4r7xO9!!enW$uDKr{f0A|h80)~%hQ`*s;$M;k+}z@7tyX7&j*UGa>XyOd z&x&|8gib0E{#91dpcoPpvrB?S&Q349ZTu`dw(~H#FKJGdKq! zhOu$w{59JcWD*P+ZEb809@wiLd&Mg)-RS4}`KkrXuz;=G7&t*lWnx0IZN(yI?`7V< z=jYD8Z*#FDF_~cmq1(12dK*?Zo9<$`JsSPR6;nzcY--}Hz0|&J(3M`7jqa{tB1vch zy)P6n#~Hcfe1$ovx){6K^2Ch#;iLH3;E&C}*3YQ`Wq@yRga1gRe{#2d1s)oDPtM%0C%M}lh7cH+>09Pj-Bn=h+F@PMgxs_15{`&IWiHm3yp zQ)fyPMHc@5$1Do}zu`eqV2tJZsUbmMM*2(QSsWXx$1V!xTySt8h2lXu%~^UaXthnn zgEg#=#O}g_3s=$eM-886)mK4CzWi6k2CecGc3^?nQ-}?THS1A z)*;)V9ow&3v)3Omr+k#(c*;5G8WrX08pd|^ZuEQb#J}p+o6&DY68psoIU$cok9~c0 zCs%@dDkmdPb=pR?Q#a($-n*A@KTqd*_ZS}_kx_;7u{Pu#Dv==F_H8eEmx)5kx|rRZnxtW$a zCw}DJRK<`XDH=mj%%NSBa|tK0Lsu6H3M=8W>Y?|KM1n5y@N-xJXdB`#_Y2-qt*(0V zauP30->WUn5=kpB!s8PKJnzJt>9y=wUp14R=SB0s{^I!J5WC-`=2VSQJaHoK&|k)B zI9F1~m=$mSPS`E9D%|XGBBQ{cZ`T&@&6VA3Ij3q>(}j>r8AuAoySU}Let|O4h7M_WxSZ@#k#Fi?W&s&@f0^#t9I|J u6W?n0Swq?4YZSyZm@}qMu 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�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