From c23b9479734f9c680b4413fa032e208f581c2f20 Mon Sep 17 00:00:00 2001 From: morganherlocker Date: Mon, 16 Mar 2020 12:19:19 -0700 Subject: [PATCH 1/2] implement optional osrm dependency injection --- package-lock.json | 885 +++++++++++++++++++++++++++++++--------------- package.json | 2 +- src/graph.ts | 313 ++++++++-------- test_core.ts | 119 +++---- test_graph.ts | 10 +- test_match.ts | 122 +++---- 6 files changed, 879 insertions(+), 572 deletions(-) diff --git a/package-lock.json b/package-lock.json index 103f2ea..a355934 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sharedstreets", - "version": "0.11.1-9", + "version": "0.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1181,9 +1181,9 @@ "dev": true }, "@oclif/command": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.12.tgz", - "integrity": "sha512-D5/Kph9smL92X1z9WPmxFd9zDruFsCk4/LbfCaBmiO2Vyyt7Y9O6kI1YLsC3B0KC9wymSCTH14IK96rf9AFHfQ==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.13.tgz", + "integrity": "sha512-zkO8hRd5Sjl7a+GM9ZMNHLD8rneAPjFBFjkAwLPs/hEv72RnFeWSyW6eE1nDbKVzMyDUYmmWNQFp0lQuwhHCdA==", "requires": { "@oclif/errors": "^1.2.2", "@oclif/parser": "^3.7.3", @@ -1195,7 +1195,6 @@ "version": "1.12.12", "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.12.12.tgz", "integrity": "sha512-0vlX5VYvOfF9QbkCqMyPSzH9GMp6at4Mbqn8CxCskxhKvNZoPD5ocda2ku0zEnoqxGAQ4VfQP7NCqJthuiStfg==", - "dev": true, "requires": { "debug": "^4.1.1", "tslib": "^1.9.3" @@ -1239,12 +1238,12 @@ "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" }, "@oclif/parser": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.7.3.tgz", - "integrity": "sha512-yfYpDzVn9ipo4HZtYLfMtd3j3ArpTQlRbQfy9pNnHFd4VedE2PNYQTRWYYMuu1FxEOoknlMZbzsewVvl41TvKg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.0.tgz", + "integrity": "sha512-w1fCz0bpg1ukbYKLxQn3cYQS9hiqNgmFhlqAqqfr1k0ijMhA/g8Z+7mshiFs1w7OsxxnKhmRxPn7EZR4EJcemA==", "requires": { "@oclif/linewrap": "^1.0.0", - "chalk": "^2.4.1", + "chalk": "^2.4.2", "tslib": "^1.9.3" } }, @@ -2136,11 +2135,6 @@ "platform": "^1.3.3" } }, - "bignumber.js": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-6.0.0.tgz", - "integrity": "sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA==" - }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -2489,6 +2483,15 @@ "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", "dev": true }, + "cli-progress": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-2.1.1.tgz", + "integrity": "sha512-TSJw3LY9ZRSis7yYzQ7flIdtQMbacd9oYoiFphJhI4SzgmqF0zErO+uNv0lbUjk1L4AGfHQJ4OVYYzW+JV66KA==", + "requires": { + "colors": "^1.1.2", + "string-width": "^2.1.1" + } + }, "cli-ux": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.2.1.tgz", @@ -2711,6 +2714,11 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, "colortape": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/colortape/-/colortape-0.1.2.tgz", @@ -2796,6 +2804,11 @@ } } }, + "const": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/const/-/const-1.0.0.tgz", + "integrity": "sha1-0VkZFmW2iF9dZcVTNWJqh8xuwTw=" + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -3766,25 +3779,29 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { @@ -3794,13 +3811,15 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, "requires": { @@ -3810,37 +3829,43 @@ }, "chownr": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": false, + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, "requires": { @@ -3849,25 +3874,29 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, "requires": { @@ -3876,13 +3905,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -3898,7 +3929,8 @@ }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, "requires": { @@ -3912,13 +3944,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": false, + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { @@ -3927,7 +3961,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, "requires": { @@ -3936,7 +3971,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -3946,19 +3982,22 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, "requires": { @@ -3967,13 +4006,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { @@ -3982,13 +4023,15 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true, "optional": true }, "minipass": { "version": "2.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "optional": true, "requires": { @@ -3998,7 +4041,8 @@ }, "minizlib": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "optional": true, "requires": { @@ -4007,7 +4051,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "optional": true, "requires": { @@ -4016,13 +4061,15 @@ }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true, "optional": true }, "needle": { "version": "2.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "dev": true, "optional": true, "requires": { @@ -4033,7 +4080,8 @@ }, "node-pre-gyp": { "version": "0.10.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", "dev": true, "optional": true, "requires": { @@ -4051,7 +4099,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, "requires": { @@ -4061,13 +4110,15 @@ }, "npm-bundled": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "dev": true, "optional": true, "requires": { @@ -4077,7 +4128,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -4089,19 +4141,22 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, "requires": { @@ -4110,19 +4165,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -4132,19 +4190,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { @@ -4156,7 +4217,8 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } @@ -4164,7 +4226,8 @@ }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, "requires": { @@ -4179,7 +4242,8 @@ }, "rimraf": { "version": "2.6.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "optional": true, "requires": { @@ -4188,43 +4252,50 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, "requires": { @@ -4235,7 +4306,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -4244,7 +4316,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { @@ -4253,13 +4326,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "optional": true, "requires": { @@ -4274,13 +4349,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { @@ -4289,13 +4366,15 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true, "optional": true } @@ -5957,12 +6036,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "append-transform": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { "default-require-extensions": "^2.0.0" @@ -5970,17 +6051,20 @@ }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "async": { "version": "2.6.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { "lodash": "^4.17.11" @@ -5988,12 +6072,14 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -6002,7 +6088,8 @@ }, "caching-transform": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y1KTLNwSPd4ljsDrFOtyXVmm7Gnk42yQitNq43AhE+cwUR/e4T+rmOHs1IPtzBg8066GBJfTOj1rQYFSWSsH2g==", "dev": true, "requires": { "hasha": "^3.0.0", @@ -6013,12 +6100,14 @@ }, "camelcase": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true }, "cliui": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -6028,28 +6117,33 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "commander": { "version": "2.17.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true, "optional": true }, "commondir": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -6057,7 +6151,8 @@ }, "cross-spawn": { "version": "4.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -6066,7 +6161,8 @@ }, "debug": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -6074,12 +6170,14 @@ }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "default-require-extensions": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { "strip-bom": "^3.0.0" @@ -6087,7 +6185,8 @@ }, "end-of-stream": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -6095,7 +6194,8 @@ }, "error-ex": { "version": "1.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -6103,12 +6203,14 @@ }, "es6-error": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "execa": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", @@ -6122,7 +6224,8 @@ "dependencies": { "cross-spawn": { "version": "6.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -6136,7 +6239,8 @@ }, "find-cache-dir": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -6146,7 +6250,8 @@ }, "find-up": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -6154,7 +6259,8 @@ }, "foreground-child": { "version": "1.5.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { "cross-spawn": "^4", @@ -6163,17 +6269,20 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stream": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -6181,7 +6290,8 @@ }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -6194,12 +6304,14 @@ }, "graceful-fs": { "version": "4.1.15", - "bundled": true, + "resolved": false, + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "handlebars": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", "dev": true, "requires": { "async": "^2.5.0", @@ -6210,19 +6322,22 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "has-flag": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "hasha": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", "dev": true, "requires": { "is-stream": "^1.0.1" @@ -6230,17 +6345,20 @@ }, "hosted-git-info": { "version": "2.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -6249,42 +6367,50 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "invert-kv": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-arrayish": { "version": "0.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, "istanbul-lib-hook": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", "dev": true, "requires": { "append-transform": "^1.0.0" @@ -6292,7 +6418,8 @@ }, "istanbul-lib-report": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.3", @@ -6302,7 +6429,8 @@ "dependencies": { "supports-color": { "version": "6.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6312,7 +6440,8 @@ }, "istanbul-lib-source-maps": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", "dev": true, "requires": { "debug": "^4.1.1", @@ -6324,14 +6453,16 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", "dev": true, "requires": { "handlebars": "^4.1.0" @@ -6339,12 +6470,14 @@ }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "lcid": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" @@ -6352,7 +6485,8 @@ }, "load-json-file": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -6363,7 +6497,8 @@ }, "locate-path": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -6372,17 +6507,20 @@ }, "lodash": { "version": "4.17.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash.flattendeep": { "version": "4.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lru-cache": { "version": "4.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -6391,7 +6529,8 @@ }, "make-dir": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "^3.0.0" @@ -6399,7 +6538,8 @@ }, "map-age-cleaner": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" @@ -6407,7 +6547,8 @@ }, "mem": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", @@ -6417,7 +6558,8 @@ }, "merge-source-map": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -6425,19 +6567,22 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "mimic-fn": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -6445,12 +6590,14 @@ }, "minimist": { "version": "0.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -6458,24 +6605,28 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "nice-try": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "normalize-package-data": { "version": "2.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -6486,7 +6637,8 @@ }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -6494,12 +6646,14 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -6507,7 +6661,8 @@ }, "optimist": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", @@ -6516,12 +6671,14 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", @@ -6531,22 +6688,26 @@ }, "p-defer": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, "p-limit": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -6554,7 +6715,8 @@ }, "p-locate": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -6562,12 +6724,14 @@ }, "p-try": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, "package-hash": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -6578,7 +6742,8 @@ }, "parse-json": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -6587,27 +6752,32 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" @@ -6615,12 +6785,14 @@ }, "pify": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pkg-dir": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" @@ -6628,12 +6800,14 @@ }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "pump": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -6642,7 +6816,8 @@ }, "read-pkg": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -6652,7 +6827,8 @@ }, "read-pkg-up": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { "find-up": "^3.0.0", @@ -6661,7 +6837,8 @@ }, "release-zalgo": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { "es6-error": "^4.0.1" @@ -6669,17 +6846,20 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve": { "version": "1.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -6687,12 +6867,14 @@ }, "resolve-from": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "rimraf": { "version": "2.6.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -6700,22 +6882,26 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "semver": { "version": "5.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -6723,17 +6909,20 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "spawn-wrap": { "version": "1.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -6746,7 +6935,8 @@ }, "spdx-correct": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -6755,12 +6945,14 @@ }, "spdx-exceptions": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -6769,12 +6961,14 @@ }, "spdx-license-ids": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -6783,7 +6977,8 @@ }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -6791,17 +6986,20 @@ }, "strip-bom": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "test-exclude": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -6812,7 +7010,8 @@ }, "uglify-js": { "version": "3.4.9", - "bundled": true, + "resolved": false, + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { @@ -6822,7 +7021,8 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } @@ -6830,12 +7030,14 @@ }, "uuid": { "version": "3.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -6844,7 +7046,8 @@ }, "which": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -6852,17 +7055,20 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -6871,12 +7077,14 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -6884,7 +7092,8 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -6894,7 +7103,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -6904,12 +7114,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "2.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -6919,17 +7131,20 @@ }, "y18n": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "12.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", @@ -6948,7 +7163,8 @@ }, "yargs-parser": { "version": "11.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -7155,6 +7371,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/osrm/-/osrm-5.22.0.tgz", "integrity": "sha512-+OTFX2XsvtBNY47hgkZfxqPhjdXB/wyz1iNqFpVrtNC16VHDvh7twrmOshMzHnRh/KCljJ5ogmRYix8d5+Cbyg==", + "dev": true, "requires": { "mkdirp": "^0.5.1", "nan": "^2.11.1", @@ -7165,19 +7382,23 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "are-we-there-yet": { "version": "1.1.5", "bundled": true, + "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -7185,11 +7406,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "brace-expansion": { "version": "1.1.8", "bundled": true, + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7197,19 +7420,23 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "camelcase": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "chownr": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "cliui": { "version": "3.2.0", "bundled": true, + "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -7218,46 +7445,56 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "debug": { "version": "2.6.9", "bundled": true, + "dev": true, "requires": { "ms": "2.0.0" } }, "decamelize": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "deep-extend": { "version": "0.6.0", - "bundled": true + "bundled": true, + "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "detect-libc": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true }, "error-ex": { "version": "1.3.1", "bundled": true, + "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -7265,6 +7502,7 @@ "find-up": { "version": "1.1.2", "bundled": true, + "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -7273,17 +7511,20 @@ "fs-minipass": { "version": "1.2.5", "bundled": true, + "dev": true, "requires": { "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "gauge": { "version": "2.7.4", "bundled": true, + "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -7297,11 +7538,13 @@ }, "get-caller-file": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "glob": { "version": "7.1.2", "bundled": true, + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7313,19 +7556,23 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "bundled": true, + "dev": true }, "has-unicode": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "hosted-git-info": { "version": "2.5.0", - "bundled": true + "bundled": true, + "dev": true }, "iconv-lite": { "version": "0.4.24", "bundled": true, + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -7333,6 +7580,7 @@ "ignore-walk": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -7340,6 +7588,7 @@ "inflight": { "version": "1.0.6", "bundled": true, + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -7347,23 +7596,28 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "ini": { "version": "1.3.4", - "bundled": true + "bundled": true, + "dev": true }, "invert-kv": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-arrayish": { "version": "0.2.1", - "bundled": true + "bundled": true, + "dev": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "builtin-modules": "^1.0.0" } @@ -7371,25 +7625,30 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-utf8": { "version": "0.2.1", - "bundled": true + "bundled": true, + "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "lcid": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "invert-kv": "^1.0.0" } @@ -7397,6 +7656,7 @@ "load-json-file": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -7408,17 +7668,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, + "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7426,17 +7689,20 @@ "dependencies": { "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, "minizlib": { "version": "1.2.1", "bundled": true, + "dev": true, "requires": { "minipass": "^2.2.1" } @@ -7444,21 +7710,25 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "nan": { "version": "2.11.1", - "bundled": true + "bundled": true, + "dev": true }, "needle": { "version": "2.2.4", "bundled": true, + "dev": true, "requires": { "debug": "^2.1.2", "iconv-lite": "^0.4.4", @@ -7467,13 +7737,15 @@ "dependencies": { "sax": { "version": "1.2.4", - "bundled": true + "bundled": true, + "dev": true } } }, "node-cmake": { "version": "2.3.2", "bundled": true, + "dev": true, "requires": { "nan": "*", "which": "^1.2.14", @@ -7483,6 +7755,7 @@ "node-pre-gyp": { "version": "0.12.0", "bundled": true, + "dev": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", @@ -7499,6 +7772,7 @@ "nopt": { "version": "4.0.1", "bundled": true, + "dev": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -7507,6 +7781,7 @@ "normalize-package-data": { "version": "2.4.0", "bundled": true, + "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -7516,11 +7791,13 @@ }, "npm-bundled": { "version": "1.0.5", - "bundled": true + "bundled": true, + "dev": true }, "npm-packlist": { "version": "1.1.12", "bundled": true, + "dev": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -7529,6 +7806,7 @@ "npmlog": { "version": "4.1.2", "bundled": true, + "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -7538,37 +7816,44 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true }, "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "os-locale": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "lcid": "^1.0.0" } }, "os-tmpdir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "osenv": { "version": "0.1.5", "bundled": true, + "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -7577,6 +7862,7 @@ "parse-json": { "version": "2.2.0", "bundled": true, + "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -7584,17 +7870,20 @@ "path-exists": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "path-type": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -7603,26 +7892,31 @@ }, "pify": { "version": "2.3.0", - "bundled": true + "bundled": true, + "dev": true }, "pinkie": { "version": "2.0.4", - "bundled": true + "bundled": true, + "dev": true }, "pinkie-promise": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "pinkie": "^2.0.0" } }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "bundled": true, + "dev": true }, "rc": { "version": "1.2.8", "bundled": true, + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -7632,13 +7926,15 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true } } }, "read-pkg": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -7648,6 +7944,7 @@ "read-pkg-up": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -7656,6 +7953,7 @@ "readable-stream": { "version": "2.3.3", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7668,57 +7966,69 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "rimraf": { "version": "2.6.2", "bundled": true, + "dev": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.1.1", - "bundled": true + "bundled": true, + "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true + "bundled": true, + "dev": true }, "semver": { "version": "5.4.1", - "bundled": true + "bundled": true, + "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true }, "spdx-correct": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { "version": "1.0.4", - "bundled": true + "bundled": true, + "dev": true }, "spdx-license-ids": { "version": "1.2.2", - "bundled": true + "bundled": true, + "dev": true }, "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7728,6 +8038,7 @@ "string_decoder": { "version": "1.0.3", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -7735,6 +8046,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7742,17 +8054,20 @@ "strip-bom": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "is-utf8": "^0.2.0" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "tar": { "version": "4.4.8", "bundled": true, + "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -7765,21 +8080,25 @@ "dependencies": { "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "validate-npm-package-license": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "spdx-correct": "~1.0.0", "spdx-expression-parse": "~1.0.0" @@ -7788,17 +8107,20 @@ "which": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "wide-align": { "version": "1.1.3", "bundled": true, + "dev": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -7806,6 +8128,7 @@ "wrap-ansi": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -7813,15 +8136,18 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "y18n": { "version": "3.2.1", - "bundled": true + "bundled": true, + "dev": true }, "yargs": { "version": "7.1.0", "bundled": true, + "dev": true, "requires": { "camelcase": "^3.0.0", "cliui": "^3.2.0", @@ -7841,6 +8167,7 @@ "yargs-parser": { "version": "5.0.0", "bundled": true, + "dev": true, "requires": { "camelcase": "^3.0.0" } @@ -9774,9 +10101,9 @@ "dev": true }, "ts-node": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz", - "integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", + "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", "dev": true, "requires": { "arg": "^4.1.0", diff --git a/package.json b/package.json index 90c8a54..bafdf4b 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "benchmark": "^2.1.4", "colortape": "^0.1.2", "documentation": "^9.3.1", + "osrm": "^5.22.0", "tap": "*", "tape": "*", "ts-node": "^8.1.0", @@ -96,7 +97,6 @@ "leveldown": "^5.0.0", "levelup": "^4.0.1", "node-fetch": "^2.3.0", - "osrm": "^5.22.0", "rbush": "^3.0.0", "sharedstreets-pbf": "^0.8.0", "sharedstreets-types": "^1.3.1", diff --git a/src/graph.ts b/src/graph.ts index f6626b8..46d263d 100644 --- a/src/graph.ts +++ b/src/graph.ts @@ -19,7 +19,6 @@ import * as fs from "fs"; import { rmse, resolveHome } from './util'; const { exec } = require('child_process'); -const OSRM = require("osrm"); const xml = require('xml'); const stream = require('stream'); const levelup = require('levelup'); @@ -36,22 +35,6 @@ const OPTIMIZE_GRAPH = true; const USE_LOCAL_CACHE = true; const SHST_GRAPH_CACHE_DIR = resolveHome('~/.shst/cache/graphs/'); - -function getOSRMDirectory() { - - const osrmPath = require.resolve('osrm'); - const osrmLibPath = path.dirname(osrmPath); - const osrmDirPath = path.join(osrmLibPath, '..'); - - if(fs.existsSync(osrmDirPath)) { - return osrmDirPath - } - else - return null -} - -const OSRM_DIR = getOSRMDirectory(); - export enum MatchType { DIRECT = 'direct', HMM = 'hmm' @@ -93,7 +76,7 @@ const MAX_BEARING_TOLERANCE = 180; // 360 +/- tolerance const REFERNECE_GEOMETRY_OFFSET = 2; const MAX_ROUTE_QUERIES = 16; -// TODO need to pull this from PBF enum defintion +// TODO need to pull this from PBF enum defintion // @property {number} Motorway=0 Motorway value // * @property {number} Trunk=1 Trunk value @@ -123,20 +106,20 @@ function roadClassConverter(roadClass:string):number { return 6; else if(roadClass === 'Service') return 7; - else + else return null; } function angleDelta(a1, a2) { - var delta = 180 - Math.abs(Math.abs(a1 - a2) - 180); + var delta = 180 - Math.abs(Math.abs(a1 - a2) - 180); return delta; } function normalizeAngle(a) { - if(a < 0) + if(a < 0) return a + 360; return a; @@ -168,7 +151,7 @@ interface SortableCanddate { export class PointCandidate implements SortableCanddate { score:number; - + searchPoint:turfHelpers.Feature; pointOnLine:turfHelpers.Feature; snappedPoint:turfHelpers.Feature; @@ -186,13 +169,13 @@ export class PointCandidate implements SortableCanddate { oneway:boolean; calcScore():number { - + if(!this.score) { // score for snapped points are average of distance to point on line distance and distance to snapped ponit if(this.snappedPoint) this.score = (this.pointOnLine.properties.dist + distance(this.searchPoint, this.snappedPoint, {units: 'meters'})) / 2; else - this.score = this.pointOnLine.properties.dist; + this.score = this.pointOnLine.properties.dist; } return this.score; } @@ -201,7 +184,7 @@ export class PointCandidate implements SortableCanddate { this.calcScore(); - var feature:turfHelpers.Feature = turfHelpers.feature(this.pointOnLine.geometry, { + var feature:turfHelpers.Feature = turfHelpers.feature(this.pointOnLine.geometry, { score: this.score, location: this.location, @@ -256,7 +239,7 @@ export class PathSegment { sideOfStreet:ReferenceSideOfStreet; geometry ; - + isIdentical(otherSegment:PathSegment):boolean { if(this.referenceId === otherSegment.referenceId) { if( (otherSegment.section[0] === this.section[0] && otherSegment.section[1] === this.section[1])) @@ -276,7 +259,7 @@ export class PathSegment { toFeature():turfHelpers.Feature { - var feature:turfHelpers.Feature = turfHelpers.feature(this.geometry.geometry, { + var feature:turfHelpers.Feature = turfHelpers.feature(this.geometry.geometry, { referenceLength: this.referenceLength, geometryId: this.geometryId, @@ -329,7 +312,7 @@ export class PathCandidate { getOriginalFeatureLength() { - if(!this.originalFeatureLength) + if(!this.originalFeatureLength) this.originalFeatureLength = length(this.originalFeature, {"units":"meters"}); return this.originalFeatureLength; @@ -343,7 +326,7 @@ export class PathCandidate { for(var segment of this.segments) { if(segment.section) this.pathLength = this.pathLength + (segment.section[1] - segment.section[0]); - else + else this.pathLength = this.pathLength + segment.referenceLength; } } @@ -364,24 +347,24 @@ export class PathCandidate { var path2GeometryIds:Set = new Set(); for(var segment of this.segments) { - path1GeometryIds.add(segment.geometryId); + path1GeometryIds.add(segment.geometryId); } for(var segment of candidate.segments) { path2GeometryIds.add(segment.geometryId); if(!path1GeometryIds.has(segment.geometryId)) - return false; + return false; } for(var segment of this.segments) { if(!path2GeometryIds.has(segment.geometryId)) - return false; + return false; } } - else - return false; + else + return false; return true; } @@ -437,7 +420,6 @@ export class Graph { id:string; db:LevelDB; - osrm; tilePathGroup:TilePathGroup; tileIndex:TileIndex; graphMode:GraphMode; @@ -451,8 +433,9 @@ export class Graph { bearingTolerance:number = DEFAULT_BEARING_TOLERANCE; tileParams; - constructor(extent:turfHelpers.Feature, tileParams:TilePathParams, graphMode:GraphMode=GraphMode.CAR_ALL, existingTileIndex:TileIndex=null, ) { - + constructor(osrm:OSRM, extent:turfHelpers.Feature, tileParams:TilePathParams, graphMode:GraphMode=GraphMode.CAR_ALL, existingTileIndex:TileIndex=null, ) { + + this.osrm = osrm; this.tileParams = tileParams; this.tilePathGroup = TilePathGroup.fromPolygon(extent, 1000, tileParams); this.tilePathGroup.addType(TileType.GEOMETRY); @@ -477,7 +460,7 @@ export class Graph { this.tileIndex = new TileIndex(); } - // create id from tile path hash + // create id from tile path hash this.id = uuidHash(this.graphMode + ' node-pair.sv1 ' + paths.join(" ")); } @@ -495,10 +478,10 @@ export class Graph { var xmlStreamWriter = createWriteStream(xmlPath); var osmRootElem = xml.element({ _attr: { version: '0.6', generator: 'shst cli v1.0'} }); - + var xmlStream = xml({ osm: osmRootElem }, { stream: true }); xmlStream.on('data', function (chunk) {xmlStreamWriter.write(chunk)}); - + const writeNode = async (lon:number, lat:number, shstIntersectionId:string=null):Promise => { var nodeId:number; @@ -510,7 +493,7 @@ export class Graph { else { nodeId = nextNodeId; - + var newNode:GraphNode = new GraphNode(); newNode.nodeId = nodeId; @@ -518,14 +501,14 @@ export class Graph { newNode.shstIntersectionId = shstIntersectionId; await this.db.put(shstIntersectionId, JSON.stringify(newNode)); } - + await this.db.put('node:' + nodeId, JSON.stringify(newNode)); // write node xml osmRootElem.push({ node: [{_attr:{id:nodeId, lat:lat, lon:lon}}] }); nextNodeId++; } - + return nodeId; }; @@ -538,7 +521,7 @@ export class Graph { else { await this.db.put(nodePairId, JSON.stringify([refId])); } - } + } for(var obj of this.tileIndex.objectIndex.values()) { @@ -548,7 +531,7 @@ export class Graph { if(this.graphMode != GraphMode.CAR_ALL && this.graphMode != GraphMode.CAR_MOTORWAY_ONLY) { continue; } - } + } else { if(this.graphMode == GraphMode.CAR_MOTORWAY_ONLY) { continue; @@ -582,12 +565,12 @@ export class Graph { // edge.edgeId = nextEdgeId; // await this.db.put(obj.id, JSON.stringify(edge)); // await this.db.put('edge:' + edge.edgeId, JSON.stringify(edge)); - + var nodeIdElems:{}[] = []; var previousNode = null; for(nodeId of nodeIds) { - + //var nodeEdgeRelation:GraphNodeEdgeRelations; // if(await this.db.has('node-edges:' + nodeId)){ // // insert new edge into existing node-edge relation set for node id @@ -613,36 +596,36 @@ export class Graph { } previousNode = nodeId; - } - + } + var oneWay = obj.backReferenceId ? 'no' : 'yes'; var roadClass = obj.roadClass.toLocaleLowerCase(); if(roadClass == "other") - roadClass = "path"; // TODO add bike/ped modal restrictions to paths + roadClass = "path"; // TODO add bike/ped modal restrictions to paths osmRootElem.push({way:[{_attr:{id:nextEdgeId}},{tag:{_attr:{k:'highway', v:roadClass}}},{tag:{_attr:{k:'oneway', v:oneWay}}},...nodeIdElems]}); nextEdgeId++; } } - + const writeFinished = new Promise((resolve, reject) => { - xmlStreamWriter.on('finish', () => { + xmlStreamWriter.on('finish', () => { resolve(xmlPath); }); }); - + osmRootElem.close(); xmlStreamWriter.close(); //xmlStream.end(); - + return writeFinished; } async buildGraph() { - + // check if graph is already built; if(this.osrm) return; @@ -662,16 +645,16 @@ export class Graph { this.osrm = new OSRM({path:osrmPath, algorithm:"MLD"}); } else { - + if(!OSRM_DIR) { console.log("unable to locate OSRM module.") throw "unable to locate OSRM module." } - - + + // TODO before building, check if this graph is a subset of an existing graph console.log(chalk.keyword('lightgreen')(" building graph using OSRM from: " + OSRM_DIR)); - + mkdirSync(dbPath, {recursive:true}); this.db = new LevelDB(dbPath) @@ -679,9 +662,9 @@ export class Graph { console.log(chalk.keyword('lightgreen')(" building " + this.graphMode + " graph xml...")); var xmlPath = await this.createGraphXml(); - //extract + //extract console.log(chalk.keyword('lightgreen')(" building " + this.graphMode + " graph from: " + xmlPath)); - + var profile; if(this.graphMode === GraphMode.CAR_ALL || this.graphMode === GraphMode.CAR_SURFACE_ONLY || this.graphMode === GraphMode.CAR_MOTORWAY_ONLY) @@ -719,7 +702,7 @@ export class Graph { // fall back to hmm for probabilistic path discovery if(!this.osrm) throw "Graph not buit. call buildGraph() before running queries." - + var hmmOptions = { coordinates: feature.geometry.coordinates, annotations: true, @@ -730,7 +713,7 @@ export class Graph { try { var matches = await new Promise((resolve, reject) => { this.osrm.match(hmmOptions, function(err, response) { - if (err) + if (err) reject(err); else resolve(response) @@ -741,24 +724,24 @@ export class Graph { var visitedEdgeList:string[] = []; if(matches['matchings'] && matches['matchings'].length > 0) { - + var match = matches['matchings'][0]; if(0 < match.confidence ) { // this is kind of convoluted due to the sparse info returned in the OSRM annotations... // write out sequence of nodes and edges as emitted from walking OSRM-returned nodes - // finding the actual posistion and directionality of the OSRM-edge within the ShSt graph + // finding the actual posistion and directionality of the OSRM-edge within the ShSt graph // edge means that we have to snap start/end points in the OSRM geom - + //console.log(JSON.stringify(match.geometry)); var edgeCandidates; var nodes:number[] = []; var visitedNodes:Set = new Set(); - // ooof this is brutual -- need to unpack legs and reduce list... + // ooof this is brutual -- need to unpack legs and reduce list... for(var leg of match['legs']) { //console.log(leg['annotation']['nodes']) - for(var n of leg['annotation']['nodes']){ + for(var n of leg['annotation']['nodes']){ if(!visitedNodes.has(n) || nodes.length == 0) nodes.push(n); @@ -775,7 +758,7 @@ export class Graph { if(await this.db.has('node-pair:' + nodeId + '-' + previousNode)) { var edges = JSON.parse(await this.db.get('node-pair:' + nodeId + '-' + previousNode)); for(var edge of edges) { - + if(!visitedEdges.has(edge)) visitedEdgeList.push(edge); @@ -785,7 +768,7 @@ export class Graph { } previousNode = nodeId; } - } + } } } @@ -819,19 +802,19 @@ export class Graph { return null; } - + } async matchGeom(feature:turfHelpers.Feature) { - + var pathCandidates:PathCandidate[] = []; - + // fall back to hmm for probabilistic path discovery if(!this.osrm) throw "Graph not buit. call buildGraph() before running queries." - - + + var hmmOptions = { coordinates: feature.geometry.coordinates, annotations: true, @@ -842,7 +825,7 @@ export class Graph { try { var matches = await new Promise((resolve, reject) => { this.osrm.match(hmmOptions, function(err, response) { - if (err) + if (err) reject(err); else resolve(response) @@ -851,26 +834,26 @@ export class Graph { var visitedEdges:Set = new Set(); var visitedEdgeList:string[] = []; - + if(matches['matchings'] && matches['matchings'].length > 0) { - + var match = matches['matchings'][0]; if(0 < match.confidence ) { // this is kind of convoluted due to the sparse info returned in the OSRM annotations... // write out sequence of nodes and edges as emitted from walking OSRM-returned nodes - // finding the actual posistion and directionality of the OSRM-edge within the ShSt graph + // finding the actual posistion and directionality of the OSRM-edge within the ShSt graph // edge means that we have to snap start/end points in the OSRM geom - + //console.log(JSON.stringify(match.geometry)); var edgeCandidates; var nodes:number[] = []; var visitedNodes:Set = new Set(); - // ooof this is brutual -- need to unpack legs and reduce list... + // ooof this is brutual -- need to unpack legs and reduce list... for(var leg of match['legs']) { //console.log(leg['annotation']['nodes']) - for(var n of leg['annotation']['nodes']){ + for(var n of leg['annotation']['nodes']){ if(!visitedNodes.has(n) || nodes.length == 0) nodes.push(n); @@ -887,7 +870,7 @@ export class Graph { if(await this.db.has('node-pair:' + nodeId + '-' + previousNode)) { var edges = JSON.parse(await this.db.get('node-pair:' + nodeId + '-' + previousNode)); for(var edge of edges) { - + if(!visitedEdges.has(edge)) visitedEdgeList.push(edge); @@ -897,10 +880,10 @@ export class Graph { } previousNode = nodeId; } - } + } } } - + if(visitedEdgeList.length > 0) { var startPoint = turfHelpers.point(feature.geometry.coordinates[0]); var endPoint = turfHelpers.point(feature.geometry.coordinates[feature.geometry.coordinates.length - 1]); @@ -926,23 +909,23 @@ export class Graph { var length = pathCandidate.getOriginalFeatureLength(); for(var k = 0; k < visitedEdgeList.length; k++) { - + var pathSegment:PathSegment = new PathSegment(); pathSegment.referenceId = visitedEdgeList[k]; var shstRef = this.tileIndex.objectIndex.get(visitedEdgeList[k]); pathSegment.referenceId = visitedEdgeList[k]; - pathSegment.geometryId = shstRef.geometryId; + pathSegment.geometryId = shstRef.geometryId; pathCandidate.segments.push(pathSegment); pathCandidate.segments[k].referenceLength = getReferenceLength(shstRef); } if(pathCandidate.segments.length > 0) { pathCandidate.startPoint = startCandidate; - - // build directionality into edge sequences + + // build directionality into edge sequences for(var k = 0; k < pathCandidate.segments.length; k++) { var edgeGeom = this.tileIndex.objectIndex.get(pathCandidate.segments[k].geometryId); - + pathCandidate.segments[k].roadClass = roadClassConverter(edgeGeom.roadClass); // if start and end are on the same graph edge make sure they're the same referenceId/direction if(startCandidate.referenceId == endCandidate.referenceId) { @@ -961,7 +944,7 @@ export class Graph { else { pathCandidate.segments[k].section = [0, pathCandidate.segments[k].referenceLength]; } - } + } // put to/from on semgnet if(edgeGeom.forwardReferenceId == pathCandidate.segments[k].referenceId) { @@ -972,12 +955,12 @@ export class Graph { // reverse to/from for back references pathCandidate.segments[k].fromIntersectionId = edgeGeom.toIntersectionId; pathCandidate.segments[k].toIntersectionId = edgeGeom.fromIntersectionId; - } + } } if(pathCandidate.startPoint.sideOfStreet == pathCandidate.endPoint.sideOfStreet) pathCandidate.sideOfStreet = pathCandidate.startPoint.sideOfStreet; - else + else pathCandidate.sideOfStreet = ReferenceSideOfStreet.UNKNOWN; var startDist = distance(startPoint, startCandidate.pointOnLine, {"units":"meters"}); @@ -989,14 +972,14 @@ export class Graph { // if(matchWorked && !alreadyIncludedPaths.has(refIdHash)) { // alreadyIncludedPaths.add(refIdHash); // bestPathCandidate = pathCandidate; - // } - } + // } + } } } catch(e) { // no-op failed to match } - + if(pathCandidates.length > 0) { var bestPathCandidate = pathCandidates[0]; var cleanedPath = []; @@ -1004,20 +987,20 @@ export class Graph { var totalPathLength = 0; for(var i = 0; i < bestPathCandidate.segments.length; i++) { - totalPathLength += bestPathCandidate.segments[i].section[1] - bestPathCandidate.segments[i].section[0]; + totalPathLength += bestPathCandidate.segments[i].section[1] - bestPathCandidate.segments[i].section[0]; } - + for(var i = 0; i < bestPathCandidate.segments.length; i++) { var segment = bestPathCandidate.segments[i]; - + // adding fudge factor for decimal precision issues if(segment.section[0] < segment.section[1] + this.searchRadius && segment.section[1] <= segment.referenceLength + this.searchRadius && segment.section[0] + this.searchRadius >= 0) { - + if(this.snapIntersections && (totalPathLength > this.searchRadius)) { - + if(i == 0 && segment.referenceLength - segment.section[0] < this.searchRadius) continue; - + if(i == 0 && segment.section[0] < this.searchRadius) segment.section[0] = 0; @@ -1033,13 +1016,13 @@ export class Graph { } } - if(segment.section[0] == segment.section[1]) + if(segment.section[0] == segment.section[1]) continue; segment.geometry = await this.tileIndex.geom(segment.referenceId, segment.section[0], segment.section[1]); - - + + if(segment.geometry) { cleanedPath.push(segment); segCoords.push(segment.geometry.geometry.coordinates) @@ -1048,7 +1031,7 @@ export class Graph { } bestPathCandidate.segments = cleanedPath; - + if(cleanedPath.length == 0) return null; @@ -1056,12 +1039,12 @@ export class Graph { var segmentGeoms:turfHelpers.Feature = turfHelpers.multiLineString([]); segmentGeoms.geometry.coordinates = [...segCoords]; bestPathCandidate.matchedPath = segmentGeoms; - } + } } return bestPathCandidate; } - + directionForRefId(refId:string):ReferenceDirection { var ref = this.tileIndex.objectIndex.get(refId); @@ -1081,7 +1064,7 @@ export class Graph { toIntersectionIdForRefId(refId:string):string { var ref:SharedStreetsReference = this.tileIndex.objectIndex.get(refId); - return ref.locationReferences[ref.locationReferences.length - 1].intersectionId; + return ref.locationReferences[ref.locationReferences.length - 1].intersectionId; } fromIntersectionIdForRefId(refId:string):string { @@ -1097,18 +1080,18 @@ export class Graph { var direction = ReferenceDirection.FORWARD; if(geometry.backReferenceId && geometry.backReferenceId === refId) - direction = ReferenceDirection.BACKWARD; + direction = ReferenceDirection.BACKWARD; - var pointOnLine = nearestPointOnLine(geometryFeature, searchPoint, {units:'meters'}); + var pointOnLine = nearestPointOnLine(geometryFeature, searchPoint, {units:'meters'}); if(pointOnLine.properties.dist < this.searchRadius) { - + var refLength = 0; for(var lr of reference.locationReferences) { if(lr.distanceToNextRef) refLength = refLength + (lr.distanceToNextRef / 100); } - + var interceptBearing = normalizeAngle(bearing(pointOnLine, searchPoint)); var i = pointOnLine.properties.index; @@ -1121,15 +1104,15 @@ export class Graph { if(direction === ReferenceDirection.BACKWARD) lineBearing += 180; - lineBearing = normalizeAngle(lineBearing); - + lineBearing = normalizeAngle(lineBearing); + var pointCandidate:PointCandidate = new PointCandidate(); pointCandidate.searchPoint = searchPoint; pointCandidate.pointOnLine = pointOnLine; - pointCandidate.geometryId = geometryFeature.properties.id; + pointCandidate.geometryId = geometryFeature.properties.id; pointCandidate.referenceId = reference.id; pointCandidate.roadClass = roadClassConverter(geometry.roadClass); @@ -1141,7 +1124,7 @@ export class Graph { pointCandidate.direction = direction; pointCandidate.referenceLength = refLength; - if(direction === ReferenceDirection.FORWARD) + if(direction === ReferenceDirection.FORWARD) pointCandidate.location = pointOnLine.properties.location; else pointCandidate.location = refLength - pointOnLine.properties.location; @@ -1161,7 +1144,7 @@ export class Graph { pointCandidate.oneway = false; else pointCandidate.oneway = true; - + // check bearing and add to candidate list if(!searchBearing || angleDelta(searchBearing, lineBearing) < this.bearingTolerance) return pointCandidate; @@ -1181,13 +1164,13 @@ export class Graph { } else { - if(candidateGeom.backReferenceId) + if(candidateGeom.backReferenceId) reference = this.tileIndex.objectIndex.get(candidateGeom.backReferenceId); else return null; // no back-reference } - + var refLength = 0; for(var lr of reference.locationReferences) { if(lr.distanceToNextRef) @@ -1206,15 +1189,15 @@ export class Graph { if(direction === ReferenceDirection.BACKWARD) lineBearing += 180; - lineBearing = normalizeAngle(lineBearing); - + lineBearing = normalizeAngle(lineBearing); + var pointCandidate:PointCandidate = new PointCandidate(); pointCandidate.searchPoint = searchPoint; pointCandidate.pointOnLine = pointOnLine; - pointCandidate.geometryId = candidateGeomFeature.properties.id; + pointCandidate.geometryId = candidateGeomFeature.properties.id; pointCandidate.referenceId = reference.id; pointCandidate.roadClass = roadClassConverter(candidateGeom.roadClass); @@ -1226,7 +1209,7 @@ export class Graph { pointCandidate.direction = direction; pointCandidate.referenceLength = refLength; - if(direction === ReferenceDirection.FORWARD) + if(direction === ReferenceDirection.FORWARD) pointCandidate.location = pointOnLine.properties.location; else pointCandidate.location = refLength - pointOnLine.properties.location; @@ -1246,7 +1229,7 @@ export class Graph { pointCandidate.oneway = false; else pointCandidate.oneway = true; - + // check bearing and add to candidate list if(!searchBearing || angleDelta(searchBearing, lineBearing) < this.bearingTolerance) return pointCandidate; @@ -1254,7 +1237,7 @@ export class Graph { return null; } - + async joinPoints(startPoint:PointCandidate, endPoint:PointCandidate, intersectionBuffer:number, offsetLine:number):Promise { let segmentStart = startPoint.location; @@ -1266,23 +1249,23 @@ export class Graph { if(segmentStart < intersectionBuffer) { segmentStart = intersectionBuffer; if(segmentStart > segmentEnd) { - segmentEnd = segmentStart + segmentLength; + segmentEnd = segmentStart + segmentLength; if(segmentEnd > startPoint.referenceLength) { segmentEnd = startPoint.referenceLength - intersectionBuffer; } } } - - if(startPoint.referenceLength - segmentEnd < intersectionBuffer) + + if(startPoint.referenceLength - segmentEnd < intersectionBuffer) segmentEnd = startPoint.referenceLength - intersectionBuffer; if(segmentStart > segmentEnd) { segmentStart = segmentEnd - segmentLength; if(segmentStart < 0) segmentStart = intersectionBuffer; } - + } - + var joinedPoint:PathSegment = new PathSegment(); joinedPoint.section[0] = segmentStart; joinedPoint.section[1] = segmentEnd; @@ -1290,39 +1273,39 @@ export class Graph { joinedPoint.referenceId = startPoint.referenceId; joinedPoint.referenceLength = startPoint.referenceLength; joinedPoint.sideOfStreet = startPoint.sideOfStreet; - + if(joinedPoint.sideOfStreet == ReferenceSideOfStreet.LEFT) offsetLine = 0 - offsetLine; - joinedPoint.geometry = >await this.tileIndex.geom(joinedPoint.referenceId, joinedPoint.section[0], joinedPoint.section[1], offsetLine); - - if(!joinedPoint.geometry) { + joinedPoint.geometry = >await this.tileIndex.geom(joinedPoint.referenceId, joinedPoint.section[0], joinedPoint.section[1], offsetLine); + + if(!joinedPoint.geometry) { joinedPoint.geometry = >await this.tileIndex.geom(joinedPoint.referenceId, joinedPoint.section[0], joinedPoint.section[1]); } - + return joinedPoint; - + } async bufferPoint(point:PointCandidate, bufferLength:number, offsetLine:number=null):Promise { var bufferStart = point.location - (bufferLength / 2); var bufferEnd = point.location + (bufferLength / 2) - + if(bufferStart < 0 ) { bufferEnd += Math.abs(bufferStart); bufferStart = 0; } - + if(bufferEnd > point.referenceLength) { bufferStart -= Math.abs(bufferEnd - point.referenceLength); bufferEnd = point.referenceLength; - + if(bufferStart < 0 ) { bufferStart = 0; } } - + var bufferedPoint:PathSegment = new PathSegment(); bufferedPoint.section[0] = bufferStart; bufferedPoint.section[1] = bufferEnd; @@ -1333,19 +1316,19 @@ export class Graph { if(bufferedPoint.sideOfStreet == ReferenceSideOfStreet.LEFT) offsetLine = 0 - offsetLine; - - bufferedPoint.geometry = >await this.tileIndex.geom(bufferedPoint.referenceId, bufferedPoint.section[0], bufferedPoint.section[1], offsetLine); - - if(!bufferedPoint.geometry) { + + bufferedPoint.geometry = >await this.tileIndex.geom(bufferedPoint.referenceId, bufferedPoint.section[0], bufferedPoint.section[1], offsetLine); + + if(!bufferedPoint.geometry) { bufferedPoint.geometry = >await this.tileIndex.geom(bufferedPoint.referenceId, bufferedPoint.section[0], bufferedPoint.section[1]); } - + return bufferedPoint; - + } - + async union(pathSegment:PathSegment, otherSegment:PathSegment, bufferIntersectionRaidus:number, offsetLine:number):Promise { - + if(pathSegment.isIntersecting(otherSegment)) { pathSegment.section[0] = Math.min(pathSegment.section[0], otherSegment.section[0]); pathSegment.section[1] = Math.max(pathSegment.section[1], otherSegment.section[1]); @@ -1359,13 +1342,13 @@ export class Graph { pathSegment.referenceLength = pathSegment.section[1] - pathSegment.section[0]; } - - pathSegment.geometry = >await this.tileIndex.geom(pathSegment.referenceId, pathSegment.section[0], pathSegment.section[1], offsetLine); - - if(!pathSegment.geometry) { + + pathSegment.geometry = >await this.tileIndex.geom(pathSegment.referenceId, pathSegment.section[0], pathSegment.section[1], offsetLine); + + if(!pathSegment.geometry) { pathSegment.geometry = >await this.tileIndex.geom(pathSegment.referenceId, pathSegment.section[0], pathSegment.section[1]); } - + return pathSegment; } @@ -1379,13 +1362,13 @@ export class Graph { for(var candidateFeature of candidateFeatures.features) { var candidateGeom:SharedStreetsGeometry = this.tileIndex.objectIndex.get(candidateFeature.properties.id); var candidateGeomFeature:turfHelpers.Feature = >this.tileIndex.featureIndex.get(candidateFeature.properties.id); - var pointOnLine = nearestPointOnLine(candidateGeomFeature, searchPoint, {units:'meters'}); - + var pointOnLine = nearestPointOnLine(candidateGeomFeature, searchPoint, {units:'meters'}); + var forwardCandidate = await this.getPointCandidateFromGeom(searchPoint, pointOnLine, candidateGeom, candidateGeomFeature, searchBearing, ReferenceDirection.FORWARD); var backwardCandidate = await this.getPointCandidateFromGeom(searchPoint, pointOnLine, candidateGeom, candidateGeomFeature, searchBearing, ReferenceDirection.BACKWARD); - + if(forwardCandidate != null) { - var snapped = false; + var snapped = false; if(this.snapIntersections) { if(forwardCandidate.location < this.searchRadius) { @@ -1399,7 +1382,7 @@ export class Graph { snapped = true; } - + if(forwardCandidate.referenceLength - forwardCandidate.location < this.searchRadius) { var snappedForwardCandidate2 = Object.assign(new PointCandidate, forwardCandidate); snappedForwardCandidate2.location = snappedForwardCandidate2.referenceLength; @@ -1419,7 +1402,7 @@ export class Graph { if(backwardCandidate != null) { - var snapped = false; + var snapped = false; if(this.snapIntersections) { @@ -1433,7 +1416,7 @@ export class Graph { candidates.push(snappedBackwardCandidate1); snapped = true; } - + if(backwardCandidate.referenceLength - backwardCandidate.location < this.searchRadius) { var snappedBackwardCandidate2 = Object.assign(new PointCandidate, backwardCandidate); snappedBackwardCandidate2.location = snappedBackwardCandidate2.referenceLength; @@ -1456,7 +1439,7 @@ export class Graph { var sortedCandidates = candidates.sort((p1, p2) => { p1.calcScore(); p2.calcScore(); - + if(p1.score === p2.score){ if(leftSideDrive) { if(p1.sideOfStreet === ReferenceSideOfStreet.LEFT && p2.sideOfStreet === ReferenceSideOfStreet.RIGHT) @@ -1470,7 +1453,7 @@ export class Graph { else if(p2.sideOfStreet === ReferenceSideOfStreet.RIGHT && p1.sideOfStreet === ReferenceSideOfStreet.LEFT) return 1; } - + } if(p1.score > p2.score) { @@ -1481,11 +1464,11 @@ export class Graph { } return 0; }); - + if(sortedCandidates.length > maxCandidates) { sortedCandidates = sortedCandidates.slice(0, maxCandidates); } - + return sortedCandidates; } } diff --git a/test_core.ts b/test_core.ts index 6adfc2b..db15833 100644 --- a/test_core.ts +++ b/test_core.ts @@ -7,6 +7,7 @@ import * as sharedstreetsPbf from "sharedstreets-pbf"; import * as sharedstreets from "./src/index"; import envelope from "@turf/envelope"; import * as turfHelpers from '@turf/helpers'; +import * as OSRM from "osrm" import { TileIndex } from './src/index'; import { TilePathGroup, TileType, TilePathParams, TilePath } from './src/index'; @@ -40,7 +41,7 @@ test("sharedstreets -- test osrm install", (t:any) => { else t.comment('osrmBinPath not found'); - + t.end(); }); @@ -146,10 +147,10 @@ test("sharedstreets-pbf -- reference", (t:any) => { break; const {locationReferences, id, formOfWay} = reference; - + const expectedId = sharedstreets.referenceId(locationReferences, formOfWay); const message = sharedstreets.referenceMessage(locationReferences, formOfWay); - + t.equal(expectedId, id, `["${message}": ${expectedId}] => ${id}`); } } @@ -193,7 +194,7 @@ test("sharedstreets -- reference", (t:any) => { ]; const formOfWay = 0; // => "Other" const ref = sharedstreets.reference(geom, locationReferences, formOfWay); - + const refHash = sharedstreets.generateHash("Reference 0 -74.00482 40.74164 208 93 -74.00513 40.74085"); t.equal(ref.id, refHash); @@ -278,7 +279,7 @@ test("tiles -- generate tile ids ", (t:any) => { // test polygon (dc area) var poloygon:turfHelpers.Feature = { - + "type": "Feature", "properties": {}, "geometry": { @@ -296,10 +297,10 @@ test("tiles -- generate tile ids ", (t:any) => { // test tiles for polygon var tiles1 = getTileIdsForPolygon(poloygon); t.deepEqual(tiles1, ["12-1171-1566","12-1171-1567"]); - + // test buffering var tiles2 = getTileIdsForPolygon(poloygon, 10000); - t.deepEqual(tiles2, ["12-1170-1566","12-1170-1567","12-1171-1566","12-1171-1567","12-1172-1566","12-1172-1567"]); + t.deepEqual(tiles2, ["12-1170-1566","12-1170-1567","12-1171-1566","12-1171-1567","12-1172-1566","12-1172-1567"]); // test polygon (dc area) var point = turfHelpers.point([ -77.0511531829834, 38.88588861057251]); @@ -308,10 +309,10 @@ test("tiles -- generate tile ids ", (t:any) => { var tiles3 = getTileIdsForPoint(point, 10); t.deepEqual(tiles3, ["12-1171-1567"]); - // test buffering + // test buffering var tiles4 = getTileIdsForPoint(point, 10000); - t.deepEqual(tiles4, ["12-1170-1566","12-1170-1567","12-1170-1568","12-1171-1566","12-1171-1567","12-1171-1568","12-1172-1566","12-1172-1567","12-1172-1568"]); - + t.deepEqual(tiles4, ["12-1170-1566","12-1170-1567","12-1170-1568","12-1171-1566","12-1171-1567","12-1171-1568","12-1172-1566","12-1172-1567","12-1172-1568"]); + t.end(); }); @@ -319,11 +320,11 @@ test("tiles -- generate tile ids ", (t:any) => { test("tiles -- build tile paths ", (t:any) => { var pathString = 'osm/planet-180430/12-1171-1566.geometry.6.pbf'; - - // test path parsing + + // test path parsing var tilePath = new TilePath(pathString); t.deepEqual(tilePath, {"tileId":"12-1171-1566","tileType":"geometry","source":"osm/planet-180430","tileHierarchy":6}); - + // test path string builder var pathString2 = tilePath.toPathString(); t.equal(pathString, pathString2); @@ -339,22 +340,22 @@ test("tiles -- build tile paths ", (t:any) => { }); -test("tiles -- fetch/parse protobuf filese", async (t:any) => { - // get data +test("tiles -- fetch/parse protobuf filese", async (t:any) => { + // get data var tilePath = new TilePath('osm/planet-180430/12-1171-1566.geometry.6.pbf'); var data = await getTile(tilePath); t.equal(data.length, 7352); - + t.end(); }); -test("cache -- load data", async (t:any) => { +test("cache -- load data", async (t:any) => { // test polygon (dc area) var polygon:turfHelpers.Feature = { - + "type": "Feature", "properties": {}, "geometry": { @@ -370,7 +371,7 @@ test("cache -- load data", async (t:any) => { }; var tilesIds = getTileIdsForPolygon(polygon); - + var params = new TilePathParams(); params.source = 'osm/planet-180430'; params.tileHierarchy = 6; @@ -396,11 +397,11 @@ test("cache -- load data", async (t:any) => { }); -test("tileIndex -- point data", async (t:any) => { +test("tileIndex -- point data", async (t:any) => { // test polygon (dc area) const content = fs.readFileSync('test/geojson/points_1.in.geojson'); var points:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); - + var params = new TilePathParams(); params.source = 'osm/planet-180430'; params.tileHierarchy = 6; @@ -418,22 +419,22 @@ test("tileIndex -- point data", async (t:any) => { t.end(); }); -test("match points", async (t:any) => { +test("match points", async (t:any) => { // test polygon (dc area) const content = fs.readFileSync('test/geojson/points_1.in.geojson'); var pointsIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); var cleanedPoints = new CleanedPoints(pointsIn); - + var points:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedPoints.clean); - + var params = new TilePathParams(); params.source = 'osm/planet-180430'; params.tileHierarchy = 6; - + // test matcher point candidates - var matcher = new Graph(null, params); - + var matcher = new Graph(osrm, null, params); + var matchedPoints:turfHelpers.Feature[] = []; for(let searchPoint of points.features) { let matches = await matcher.matchPoint(searchPoint, null, 3); @@ -442,74 +443,74 @@ test("match points", async (t:any) => { } } const matchedPointFeatureCollection_1a:turfHelpers.FeatureCollection = turfHelpers.featureCollection(matchedPoints); - + const expected_1a_file = 'test/geojson/points_1a.out.geojson'; if(BUILD_TEST_OUPUT) { var expected_1a_out:string = JSON.stringify(matchedPointFeatureCollection_1a); fs.writeFileSync(expected_1a_file, expected_1a_out); } - + const expected_1a_in = fs.readFileSync(expected_1a_file); const expected_1a:turfHelpers.FeatureCollection = JSON.parse(expected_1a_in.toLocaleString()); - + t.deepEqual(expected_1a, matchedPointFeatureCollection_1a); - + matcher.searchRadius = 1000; - + var matchedPoints:turfHelpers.Feature[] = []; let matches = await matcher.matchPoint(points.features[0], null, 10); - + for(let match of matches) { matchedPoints.push(match.toFeature()); } const matchedPointFeatureCollection_1b:turfHelpers.FeatureCollection = turfHelpers.featureCollection(matchedPoints); - + const expected_1b_file = 'test/geojson/points_1b.out.geojson'; - + if(BUILD_TEST_OUPUT) { var expected_1b_out:{} = JSON.stringify(matchedPointFeatureCollection_1b); fs.writeFileSync(expected_1b_file, expected_1b_out); } - + const expected_1b_in = fs.readFileSync(expected_1b_file); const expected_1b:{} = JSON.parse(expected_1b_in.toLocaleString()); - + t.deepEqual(expected_1b, matchedPointFeatureCollection_1b); - - + + t.end(); }); - - - test("match lines 1", async (t:any) => { - + + + test("match lines 1", async (t:any) => { + // test polygon (dc area) const content = fs.readFileSync('test/geojson/sf_centerlines.sample.geojson'); var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); - - var cleanedLines = new CleanedLines(linesIn); + + var cleanedLines = new CleanedLines(linesIn); var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); - + var params = new TilePathParams(); params.source = 'osm/planet-180430'; params.tileHierarchy = 6; - + //test matcher point candidates - var matcher = new Graph(envelope(lines), params); + var matcher = new Graph(osrm, envelope(lines), params); await matcher.buildGraph(); - + var matchedLines = turfHelpers.featureCollection([]); for(var line of lines.features) { var pathCandidate = await matcher.matchGeom(line); matchedLines.features.push(pathCandidate.matchedPath); } - + const expected_1a_file = 'test/geojson/sf_centerlines.sample.out.geojson'; if(BUILD_TEST_OUPUT) { var expected_1a_out:string = JSON.stringify(matchedLines); fs.writeFileSync(expected_1a_file, expected_1a_out); } - + const expected_1a_in = fs.readFileSync(expected_1a_file); const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); t.deepEqual(matchedLines, expected_1a); @@ -517,13 +518,13 @@ test("match points", async (t:any) => { t.end(); }); - test("match lines 2 -- snapping and directed edges", async (t:any) => { - + test("match lines 2 -- snapping and directed edges", async (t:any) => { + // test polygon (dc area) const content = fs.readFileSync('test/geojson/line-directed-test.in.geojson'); var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); - var cleanedLines = new CleanedLines(linesIn); + var cleanedLines = new CleanedLines(linesIn); var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); var params = new TilePathParams(); @@ -531,12 +532,12 @@ test("match points", async (t:any) => { params.tileHierarchy = 6; //test matcher point candidates - var matcher = new Graph(envelope(lines), params); + var matcher = new Graph(osrm, envelope(lines), params); await matcher.buildGraph(); matcher.searchRadius = 20; matcher.snapIntersections = true; - + var matchedLines = turfHelpers.featureCollection([]); for(var line of lines.features) { var pathCandidate = await matcher.matchGeom(line); @@ -548,7 +549,7 @@ test("match points", async (t:any) => { var expected_1a_out:string = JSON.stringify(matchedLines); fs.writeFileSync(expected_1a_file, expected_1a_out); } - + const expected_1a_in = fs.readFileSync(expected_1a_file); const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); @@ -576,7 +577,3 @@ test("match points", async (t:any) => { t.end(); }); - - - - diff --git a/test_graph.ts b/test_graph.ts index 01130dd..db1a703 100644 --- a/test_graph.ts +++ b/test_graph.ts @@ -5,6 +5,7 @@ import * as glob from "glob"; import * as path from "path"; import * as sharedstreetsPbf from "sharedstreets-pbf"; import * as sharedstreets from "./src/index"; +import * as OSRM from "osrm" import * as turfHelpers from '@turf/helpers'; import envelope from '@turf/envelope'; @@ -18,9 +19,9 @@ import { polygon } from "@turf/envelope/node_modules/@turf/helpers"; import { Graph, GraphMode } from "./src/graph"; const test = require('tape'); - + test("sharedstreets -- graph test", async (t:any) => { - + var params = new TilePathParams(); params.source = 'osm/planet-181224'; params.tileHierarchy = 7; @@ -28,11 +29,11 @@ test("sharedstreets -- graph test", async (t:any) => { // test polygon (dc area) const content = fs.readFileSync('test/geojson/test_route.geojson'); var lineIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); - var graph = new Graph(envelope(lineIn), params); + var graph = new Graph(osrm, envelope(lineIn), params); await graph.buildGraph(); t.equal(graph.id, 'd626d5b0-0dec-3e6f-97ff-d9712228a282'); - + var results = await graph.matchGeom(lineIn.features[0]); lineIn.features[0].geometry.coordinates.reverse(); var results2 = await graph.matchGeom(lineIn.features[0]); @@ -42,4 +43,3 @@ test("sharedstreets -- graph test", async (t:any) => { t.end(); }); - diff --git a/test_match.ts b/test_match.ts index 925db5e..064da28 100644 --- a/test_match.ts +++ b/test_match.ts @@ -5,6 +5,7 @@ import * as glob from "glob"; import * as path from "path"; import * as sharedstreetsPbf from "sharedstreets-pbf"; import * as sharedstreets from "./src/index"; +import * as OSRM from "osrm" import * as turfHelpers from '@turf/helpers'; @@ -19,22 +20,22 @@ const test = require('tape'); const BUILD_TEST_OUPUT = false; -test("match points", async (t:any) => { +test("match points", async (t:any) => { // test polygon (dc area) const content = fs.readFileSync('test/geojson/points_1.in.geojson'); var pointsIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); var cleanedPoints = new CleanedPoints(pointsIn); - + var points:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedPoints.clean); - + var params = new TilePathParams(); params.source = 'osm/planet-180430'; params.tileHierarchy = 6; - + // test matcher point candidates - var matcher = new Graph(null, params); - + var matcher = new Graph(osrm, null, params); + var matchedPoints:turfHelpers.Feature[] = []; for(let searchPoint of points.features) { let matches = await matcher.matchPoint(searchPoint, null, 3); @@ -43,74 +44,74 @@ test("match points", async (t:any) => { } } const matchedPointFeatureCollection_1a:turfHelpers.FeatureCollection = turfHelpers.featureCollection(matchedPoints); - + const expected_1a_file = 'test/geojson/points_1a.out.geojson'; if(BUILD_TEST_OUPUT) { var expected_1a_out:string = JSON.stringify(matchedPointFeatureCollection_1a); fs.writeFileSync(expected_1a_file, expected_1a_out); } - + const expected_1a_in = fs.readFileSync(expected_1a_file); const expected_1a:turfHelpers.FeatureCollection = JSON.parse(expected_1a_in.toLocaleString()); - + t.deepEqual(expected_1a, matchedPointFeatureCollection_1a); - + matcher.searchRadius = 1000; - + var matchedPoints:turfHelpers.Feature[] = []; let matches = await matcher.matchPoint(points.features[0], null, 10); - + for(let match of matches) { matchedPoints.push(match.toFeature()); } const matchedPointFeatureCollection_1b:turfHelpers.FeatureCollection = turfHelpers.featureCollection(matchedPoints); - + const expected_1b_file = 'test/geojson/points_1b.out.geojson'; - + if(BUILD_TEST_OUPUT) { var expected_1b_out:{} = JSON.stringify(matchedPointFeatureCollection_1b); fs.writeFileSync(expected_1b_file, expected_1b_out); } - + const expected_1b_in = fs.readFileSync(expected_1b_file); const expected_1b:{} = JSON.parse(expected_1b_in.toLocaleString()); - + t.deepEqual(expected_1b, matchedPointFeatureCollection_1b); - - + + t.end(); }); - - - test("match lines 1", async (t:any) => { - + + + test("match lines 1", async (t:any) => { + // test polygon (dc area) const content = fs.readFileSync('test/geojson/sf_centerlines.sample.geojson'); var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); - - var cleanedLines = new CleanedLines(linesIn); + + var cleanedLines = new CleanedLines(linesIn); var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); - + var params = new TilePathParams(); params.source = 'osm/planet-180430'; params.tileHierarchy = 6; - + //test matcher point candidates - var matcher = new Graph(envelope(lines), params); + var matcher = new Graph(osrm, envelope(lines), params); await matcher.buildGraph(); - + var matchedLines = turfHelpers.featureCollection([]); for(var line of lines.features) { var pathCandidate = await matcher.matchGeom(line); matchedLines.features.push(pathCandidate.matchedPath); } - + const expected_1a_file = 'test/geojson/sf_centerlines.sample.out.geojson'; if(BUILD_TEST_OUPUT) { var expected_1a_out:string = JSON.stringify(matchedLines); fs.writeFileSync(expected_1a_file, expected_1a_out); } - + const expected_1a_in = fs.readFileSync(expected_1a_file); const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); t.deepEqual(matchedLines, expected_1a); @@ -118,13 +119,13 @@ test("match points", async (t:any) => { t.end(); }); - test("match lines 2 -- snapping and directed edges", async (t:any) => { - + test("match lines 2 -- snapping and directed edges", async (t:any) => { + // test polygon (dc area) const content = fs.readFileSync('test/geojson/line-directed-test.in.geojson'); var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); - var cleanedLines = new CleanedLines(linesIn); + var cleanedLines = new CleanedLines(linesIn); var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); var params = new TilePathParams(); @@ -132,9 +133,9 @@ test("match points", async (t:any) => { params.tileHierarchy = 6; //test matcher point candidates - var matcher = new Graph(envelope(lines), params); + var matcher = new Graph(osrm, envelope(lines), params); await matcher.buildGraph(); - + var matchedLines = turfHelpers.featureCollection([]); for(var line of lines.features) { var pathCandidate = await matcher.matchGeom(line); @@ -147,7 +148,7 @@ test("match points", async (t:any) => { var expected_1a_out:string = JSON.stringify(matchedLines); fs.writeFileSync(expected_1a_file, expected_1a_out); } - + const expected_1a_in = fs.readFileSync(expected_1a_file); const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); @@ -178,13 +179,13 @@ test("match points", async (t:any) => { -// test("match grid", async (t:any) => { - +// test("match grid", async (t:any) => { + // // test polygon (dc area) // const content = fs.readFileSync('test/geojson/sf_centerlines.sample.geojson'); // var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); -// var cleanedLines = new CleanedLines(linesIn); +// var cleanedLines = new CleanedLines(linesIn); // var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); // var params = new TilePathParams(); @@ -194,14 +195,14 @@ test("match points", async (t:any) => { // //test matcher point candidates // var matcher = new Graph(envelope(lines), params); // await matcher.buildGraph(); - + // var matchedLines = turfHelpers.featureCollection([]); // for(var line of lines.features) { - + // var pathCandidate = await matcher.match(line); // matchedLines.features.push(pathCandidate.matchedPath); // } - + // const expected_1a_file = 'test/geojson/sf_centerlines.1a.out.geojson'; @@ -209,7 +210,7 @@ test("match points", async (t:any) => { // var expected_1a_out:string = JSON.stringify(matchedLines); // fs.writeFileSync(expected_1a_file, expected_1a_out); // } - + // const expected_1a_in = fs.readFileSync(expected_1a_file); // const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); @@ -239,13 +240,13 @@ test("match points", async (t:any) => { // }); -// test("match roundabout", async (t:any) => { - +// test("match roundabout", async (t:any) => { + // // test polygon (dc area) // const content = fs.readFileSync('test/geojson/roundabout.1a.geojson'); // var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); -// var cleanedLines = new CleanedLines(linesIn); +// var cleanedLines = new CleanedLines(linesIn); // var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); // var params = new TilePathParams(); @@ -255,7 +256,7 @@ test("match points", async (t:any) => { // //test matcher point candidates // var matcher = new Graph(envelope(lines), params); // await matcher.buildGraph(); - + // var matchedLines = turfHelpers.featureCollection([]); // for(var line of lines.features) { // var pathCandidate = await matcher.match(line); @@ -267,7 +268,7 @@ test("match points", async (t:any) => { // var expected_1a_out:string = JSON.stringify(matchedLines); // fs.writeFileSync(expected_1a_file, expected_1a_out); // } - + // const expected_1a_in = fs.readFileSync(expected_1a_file); // const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); @@ -298,14 +299,14 @@ test("match points", async (t:any) => { -// test("match long paths", async (t:any) => { - +// test("match long paths", async (t:any) => { + // // test polygon (dc area) // const content = fs.readFileSync('test/geojson/long-paths.geojson'); // var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); // console.log("1"); -// var cleanedLines = new CleanedLines(linesIn); +// var cleanedLines = new CleanedLines(linesIn); // var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); // var params = new TilePathParams(); @@ -316,7 +317,7 @@ test("match points", async (t:any) => { // var matcher = new Graph(envelope(lines), params); // matcher.searchRadius = 20; // await matcher.buildGraph(); - + // var matchedLines = turfHelpers.featureCollection([]); // for(var line of lines.features) { // if(line.properties['analysis_id'] == 1454853) @@ -324,7 +325,7 @@ test("match points", async (t:any) => { // var pathCandidate = await matcher.match(line); // //matchedLines.features.push(pathCandidate.matchedPath); // } - + // const BUILD_TEST_OUPUT = false; // // const expected_1a_file = 'test/geojson/line-directed-test-snapped.out.geojson'; @@ -332,7 +333,7 @@ test("match points", async (t:any) => { // // var expected_1a_out:string = JSON.stringify(matchedLines); // // fs.writeFileSync(expected_1a_file, expected_1a_out); // // } - + // // const expected_1a_in = fs.readFileSync(expected_1a_file); // // const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); @@ -362,14 +363,14 @@ test("match points", async (t:any) => { // }); -// test("match long paths", async (t:any) => { - +// test("match long paths", async (t:any) => { + // // test polygon (dc area) // const content = fs.readFileSync('test/geojson/expressways.geojson'); // var linesIn:turfHelpers.FeatureCollection = JSON.parse(content.toLocaleString()); // console.log("1"); -// var cleanedLines = new CleanedLines(linesIn); +// var cleanedLines = new CleanedLines(linesIn); // var lines:turfHelpers.FeatureCollection = turfHelpers.featureCollection(cleanedLines.clean); // var params = new TilePathParams(); @@ -381,7 +382,7 @@ test("match points", async (t:any) => { // matcher.graphMode = GraphMode.CAR_MOTORWAY_ONLY; // matcher.searchRadius = 20; // await matcher.buildGraph(); - + // var matchedLines = turfHelpers.featureCollection([]); // for(var line of lines.features) { // if(line.properties['analysis_id'] == 1454853) @@ -389,7 +390,7 @@ test("match points", async (t:any) => { // var pathCandidate = await matcher.match(line); // //matchedLines.features.push(pathCandidate.matchedPath); // } - + // const BUILD_TEST_OUPUT = false; // // const expected_1a_file = 'test/geojson/line-directed-test-snapped.out.geojson'; @@ -397,7 +398,7 @@ test("match points", async (t:any) => { // // var expected_1a_out:string = JSON.stringify(matchedLines); // // fs.writeFileSync(expected_1a_file, expected_1a_out); // // } - + // // const expected_1a_in = fs.readFileSync(expected_1a_file); // // const expected_1a:{} = JSON.parse(expected_1a_in.toLocaleString()); @@ -425,4 +426,3 @@ test("match points", async (t:any) => { // t.end(); // }); - From 88d047ee6b027fe461d2b1ceca9aa1aeeb002850 Mon Sep 17 00:00:00 2001 From: Kevin Webb Date: Mon, 23 Mar 2020 15:53:22 -0400 Subject: [PATCH 2/2] updated graph build process for dep injection + tests --- src/commands/match.ts | 4 +-- src/graph.ts | 61 +++++++++++++++++++++++++++---------------- test_core.ts | 1 + test_graph.ts | 3 ++- test_match.ts | 1 + 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/commands/match.ts b/src/commands/match.ts index 8b1d353..af74d3c 100644 --- a/src/commands/match.ts +++ b/src/commands/match.ts @@ -159,7 +159,7 @@ async function matchPoints(outFile, params, points, flags) { var cleanPoints = new CleanedPoints(points) - var graph:Graph = new Graph(null, params); + var graph:Graph = new Graph(null, null, params); if(flags['snap-intersections']) graph.tileIndex.addTileType(TileType.INTERSECTION); @@ -808,7 +808,7 @@ async function matchLines(outFile, params, lines, flags) { else graphMode = GraphMode.CAR_ALL; - var matcher = new Graph(extent, params, graphMode); + var matcher = new Graph(null, extent, params, graphMode); await matcher.buildGraph(); if(flags['search-radius']) diff --git a/src/graph.ts b/src/graph.ts index 46d263d..160a396 100644 --- a/src/graph.ts +++ b/src/graph.ts @@ -47,7 +47,6 @@ export enum GraphMode { BIKE = 'bike', PEDESTRIAN = 'ped' } - // interface typecheck for SharedStreetsGeometry function geomInstance(object: any): object is SharedStreetsGeometry { return 'forwardReferenceId' in object; @@ -62,6 +61,19 @@ function getReferenceLength(ref:SharedStreetsReference) { return length / 100; } +function getOSRMDirectory(osrmModule) { + + const osrmPath = require.resolve(osrmModule); + const osrmLibPath = path.dirname(osrmPath); + const osrmDirPath = path.join(osrmLibPath, '..'); + + if(fs.existsSync(osrmDirPath)) { + return osrmDirPath + } + else + return null +} + const DEFAULT_LENGTH_TOLERANCE = 0.1; const DEFUALT_CANDIDATES = 10; const DEFAULT_BEARING_TOLERANCE = 15; // 360 +/- tolerance @@ -424,6 +436,9 @@ export class Graph { tileIndex:TileIndex; graphMode:GraphMode; + osrmGraph = null; // optional OSRM graph + osrmModule = null; + // options searchRadius = DEFAULT_SEARCH_RADIUS; snapIntersections = false; @@ -433,9 +448,9 @@ export class Graph { bearingTolerance:number = DEFAULT_BEARING_TOLERANCE; tileParams; - constructor(osrm:OSRM, extent:turfHelpers.Feature, tileParams:TilePathParams, graphMode:GraphMode=GraphMode.CAR_ALL, existingTileIndex:TileIndex=null, ) { + constructor(osrmModule, extent:turfHelpers.Feature, tileParams:TilePathParams, graphMode:GraphMode=GraphMode.CAR_ALL, existingTileIndex:TileIndex=null, ) { - this.osrm = osrm; + this.osrmModule = osrmModule; this.tileParams = tileParams; this.tilePathGroup = TilePathGroup.fromPolygon(extent, 1000, tileParams); this.tilePathGroup.addType(TileType.GEOMETRY); @@ -627,33 +642,35 @@ export class Graph { async buildGraph() { // check if graph is already built; - if(this.osrm) + if(this.osrmGraph) return; try { var graphPath = path.join(SHST_GRAPH_CACHE_DIR, this.id); var dbPath = path.join(graphPath, '/db'); + const osrmDir = getOSRMDirectory(this.osrmModule); + await this.tileIndex.indexTilesByPathGroup(this.tilePathGroup) if(USE_LOCAL_CACHE && existsSync(dbPath)) { - var osrmPath = path.join(graphPath, '/graph.xml.osrm'); + var osrmGraphPath = path.join(graphPath, '/graph.xml.osrm'); console.log(chalk.keyword('lightgreen')(" loading pre-built " + this.graphMode + " graph from: " + osrmPath)); this.db = new LevelDB(dbPath); if(OPTIMIZE_GRAPH) - this.osrm = new OSRM({path:osrmPath}); + this.osrmGraph = new this.osrmModule({path:osrmGraphPath}); else - this.osrm = new OSRM({path:osrmPath, algorithm:"MLD"}); + this.osrmGraph = new this.osrmModule({path:osrmGraphPath, algorithm:"MLD"}); } else { - if(!OSRM_DIR) { + if(!osrmDir) { console.log("unable to locate OSRM module.") throw "unable to locate OSRM module." } // TODO before building, check if this graph is a subset of an existing graph - console.log(chalk.keyword('lightgreen')(" building graph using OSRM from: " + OSRM_DIR)); + console.log(chalk.keyword('lightgreen')(" building graph using OSRM from: " + osrmDir)); mkdirSync(dbPath, {recursive:true}); @@ -668,26 +685,26 @@ export class Graph { var profile; if(this.graphMode === GraphMode.CAR_ALL || this.graphMode === GraphMode.CAR_SURFACE_ONLY || this.graphMode === GraphMode.CAR_MOTORWAY_ONLY) - profile = path.join(OSRM_DIR, 'profiles/car.lua'); + profile = path.join(osrmDir, 'profiles/car.lua'); else if(this.graphMode === GraphMode.BIKE) - profile = path.join(OSRM_DIR, 'profiles/bicycle.lua'); + profile = path.join(osrmDir, 'profiles/bicycle.lua'); else if(this.graphMode === GraphMode.PEDESTRIAN) - profile = path.join(OSRM_DIR, 'profiles/foot.lua'); + profile = path.join(osrmDir, 'profiles/foot.lua'); - execSync(path.join(OSRM_DIR, 'lib/binding/osrm-extract') + ' ' + xmlPath + ' -p ' + profile); + execSync(path.join(osrmDir, 'lib/binding/osrm-extract') + ' ' + xmlPath + ' -p ' + profile); var osrmPath:any = xmlPath + '.osrm'; if(OPTIMIZE_GRAPH) { console.log(chalk.keyword('lightgreen')(" optimizing graph...")); - execSync(path.join(OSRM_DIR, 'lib/binding/osrm-contract') + ' ' + osrmPath); - this.osrm = new OSRM({path:osrmPath}); + execSync(path.join(osrmDir, 'lib/binding/osrm-contract') + ' ' + osrmPath); + this.osrmGraph = new this.osrmModule({path:osrmPath}); } else { - execSync(path.join(OSRM_DIR, 'lib/binding/osrm-partition') + ' ' + osrmPath); - execSync(path.join(OSRM_DIR, 'lib/binding/osrm-customize') + ' ' + osrmPath); + execSync(path.join(osrmDir, 'lib/binding/osrm-partition') + ' ' + osrmPath); + execSync(path.join(osrmDir, 'lib/binding/osrm-customize') + ' ' + osrmPath); console.log(chalk.keyword('lightgreen')(" skipping graph optimization...")); - this.osrm = new OSRM({path:osrmPath, algorithm:"MLD"}); + this.osrmGraph = new this.osrmModule({path:osrmPath, algorithm:"MLD"}); } } } @@ -700,7 +717,7 @@ export class Graph { async matchTrace(feature:turfHelpers.Feature) { // fall back to hmm for probabilistic path discovery - if(!this.osrm) + if(!this.osrmGraph) throw "Graph not buit. call buildGraph() before running queries." var hmmOptions = { @@ -712,7 +729,7 @@ export class Graph { try { var matches = await new Promise((resolve, reject) => { - this.osrm.match(hmmOptions, function(err, response) { + this.osrmGraph.match(hmmOptions, function(err, response) { if (err) reject(err); else @@ -811,7 +828,7 @@ export class Graph { var pathCandidates:PathCandidate[] = []; // fall back to hmm for probabilistic path discovery - if(!this.osrm) + if(!this.osrmGraph) throw "Graph not buit. call buildGraph() before running queries." @@ -824,7 +841,7 @@ export class Graph { try { var matches = await new Promise((resolve, reject) => { - this.osrm.match(hmmOptions, function(err, response) { + this.osrmGraph.match(hmmOptions, function(err, response) { if (err) reject(err); else diff --git a/test_core.ts b/test_core.ts index db15833..164acc4 100644 --- a/test_core.ts +++ b/test_core.ts @@ -19,6 +19,7 @@ import { CleanedPoints, CleanedLines } from "./src/geom"; import { execSync } from 'child_process'; const test = require('tape'); +const osrm = require('osrm'); const pt1 = [110, 45]; const pt2 = [-74.003388, 40.634538]; diff --git a/test_graph.ts b/test_graph.ts index db1a703..8f095f8 100644 --- a/test_graph.ts +++ b/test_graph.ts @@ -5,7 +5,7 @@ import * as glob from "glob"; import * as path from "path"; import * as sharedstreetsPbf from "sharedstreets-pbf"; import * as sharedstreets from "./src/index"; -import * as OSRM from "osrm" + import * as turfHelpers from '@turf/helpers'; import envelope from '@turf/envelope'; @@ -19,6 +19,7 @@ import { polygon } from "@turf/envelope/node_modules/@turf/helpers"; import { Graph, GraphMode } from "./src/graph"; const test = require('tape'); +const osrm = require('osrm'); test("sharedstreets -- graph test", async (t:any) => { diff --git a/test_match.ts b/test_match.ts index 064da28..526ade5 100644 --- a/test_match.ts +++ b/test_match.ts @@ -17,6 +17,7 @@ import { Graph, GraphMode } from "./src/index"; import envelope from "@turf/envelope"; const test = require('tape'); +const osrm = require('osrm') const BUILD_TEST_OUPUT = false;