diff options
-rw-r--r-- | .gitlab-ci.yml | 34 | ||||
-rw-r--r-- | Makefile | 6 | ||||
-rwxr-xr-x | bin/candidates.js | 197 | ||||
-rw-r--r-- | docker/candidate.Dockerfile | 7 | ||||
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | yarn.lock | 124 |
6 files changed, 364 insertions, 5 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 196c4e1..b528229 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -77,6 +77,21 @@ docker conflate: when: manual cache: {} +docker candidate: + image: docker:latest + services: + - docker:dind + stage: docker + before_script: + - echo "$CI_JOB_TOKEN" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY + script: + - docker build --pull -t "$CI_REGISTRY_IMAGE":candidate -f "docker/candidate.Dockerfile" . + - docker push "$CI_REGISTRY_IMAGE":candidate + after_script: + - docker logout $CI_REGISTRY + when: manual + cache: {} + prepare: stage: prepare image: "registry.gitlab.com/alantgeo/vicmap2osm:prepare" @@ -161,6 +176,25 @@ conflate: paths: - dist +candidate: + stage: candidate + image: "registry.gitlab.com/alantgeo/vicmap2osm:candidate" + before_script: + - ls data dist + cache: + <<: *global_cache + policy: pull + script: + - yarn install + - cp src/polygon-lookup-patch.js node_modules/polygon-lookup/index.js + - make dist/candidate + - make testUploadCandidates + when: manual + artifacts: + name: "candidate" + paths: + - dist + build compareSuburb: stage: build image: "registry.gitlab.com/alantgeo/vicmap2osm:build-osm" @@ -188,7 +188,7 @@ data/victoria-admin-level10.osm.pbf: data/victoria-admin.osm.pbf osmium tags-filter --remove-tags --output=$@ $< r/admin_level=10 data/victoria-admin-level10.osm.geojson: data/victoria-admin-level10.osm.pbf - osmium export --overwrite --geometry-types=polygon --output-format=geojsonseq --format-option=print_record_separator=false --output $@ $< + osmium export --overwrite --geometry-types=polygon --add-unique-id=type_id --output-format=geojsonseq --format-option=print_record_separator=false --output $@ $< data/victoria-admin-level10.osm.fgb: data/victoria-admin-level10.osm.geojson ogr2ogr -f FlatGeobuf $@ $< @@ -198,3 +198,7 @@ dist/vicmapSuburbDiffersWithOSM.geojson: dist/vicmap-osm.geojson data/victoria-a printDifferentSuburbs: dist/vicmapSuburbDiffersWithOSM.geojson ogr2ogr -f CSV -select '_osmSuburb,addr:suburb' /vsistdout/ $< | sort | uniq + +dist/candidates: data/victoria-admin-level10.osm.geojson dist/conflate + mkdir -p $@ + ./bin/candidates.js $^ $@ diff --git a/bin/candidates.js b/bin/candidates.js new file mode 100755 index 0000000..e350f6f --- /dev/null +++ b/bin/candidates.js @@ -0,0 +1,197 @@ +#!/usr/bin/env node + +/** + * Prepare import candidates by conflation category and suburb as OSM XML + */ + +const fs = require('fs') +const path = require('path') +const { Transform, pipeline } = require('stream') +const ndjson = require('ndjson') +const PolygonLookup = require('polygon-lookup') +const geojsontoosm = require('geojsontoosm') + +const argv = require('yargs/yargs')(process.argv.slice(2)) + .option('verbose', { + type: 'boolean', + description: 'Verbose logging' + }) + .argv + +if (argv._.length < 3) { + console.error("Usage: ./conflate.js data/victoria-admin-level10.osm.geojson dist/conflate dist/candidates") + process.exit(1) +} + +const suburbsFile = argv._[0] +const conflatePath = argv._[1] +const outputPath = argv._[2] + +if (!fs.existsSync(suburbsFile)) { + console.error(`${suburbsFile} not found`) + process.exit(1) +} + +if (!fs.existsSync(conflatePath)) { + console.error(`${conflatePath} not found`) + process.exit(1) +} + +// output GeoJSON Features by layer by suburb ID +const outputFeatures = { + 'newAddressWithoutConflicts': {}, + 'addrUnitFromHousenumber': {} +} + +for (const layer of Object.keys(outputFeatures)) { + const layerPath = path.join(outputPath, layer) + if (!fs.existsSync(layerPath)) { + fs.mkdirSync(layerPath) + } +} + +// suburb GeoJSON Features +const suburbs = [] + +// suburb ID to name +const suburbName = { + 0: 'VIC' +} + +// suburb point in polygon index +let suburbLookup + +const outsideVicSuburb = { + type: 'Feature', + id: 0, + properties: { + name: 'VIC' + }, + geometry: null +} + +// index suburbs +let suburbCount = 0 +const readSuburbs = new Transform({ + readableObjectMode: true, + writableObjectMode: true, + transform(suburb, encoding, callback) { + suburbCount++ + + if (process.stdout.isTTY && suburbCount % 1000 === 0) { + process.stdout.write(` ${suburbCount.toLocaleString()}\r`) + } + + if (!('id' in suburb)) { + console.log('Suburb missing id', suburb) + process.exit(1) + } + + for (const layer of Object.keys(outputFeatures)) { + outputFeatures[layer][suburb.id] = [] + } + + suburbName[suburb.id] = suburb.properties.name + + suburbs.push(suburb) + + callback() + } +}) + +// produce import candidates +let sourceCount = 0 +const candidates = new Transform({ + readableObjectMode: true, + writableObjectMode: true, + transform(feature, encoding, callback) { + sourceCount++ + + if (process.stdout.isTTY && sourceCount % 1000 === 0) { + process.stdout.write(` ${sourceCount.toLocaleString()}\r`) + } + + // find which suburb this address is in + const results = lookupSuburbs.search(...feature.geometry.coordinates.slice(0, 2), 1) + const suburb = results ? (results.type === 'FeatureCollection' ? (results.features ? results.features[0] : outsideVicSuburb) : results[0]) : outsideVicSuburb + + outputFeatures['newAddressWithoutConflicts'][suburb.id].push(feature) + + callback() + } +}) + +/** + * Save our candidate address data as .osm files by layer by suburb + */ +function outputCandidates() { + let i = 0 + for (const layer of Object.keys(outputFeatures)) { + i++ + let j = 0 + for (const suburbId of Object.keys(outputFeatures[layer])) { + j++ + if (process.stdout.isTTY && i % 10 === 0) { + process.stdout.write(` ${j.toLocaleString()}/${Object.keys(outputFeatures).length.toLocaleString()} - ${layer} - ${i.toLocaleString()}/${suburbs.length.toLocaleString()}\r`) + } + + const suburbFeatures = outputFeatures[layer][suburbId] + if (suburbFeatures && suburbFeatures.length) { + const xml = geojsontoosm(suburbFeatures) + fs.writeFileSync(path.join(outputPath, layer, `${suburbId}_${suburbName[suburbId]}.osm`), xml) + } // else no data for this suburb + } + } +} + +// first pass to index by geometry +console.log('Step 1/X: Reading suburbs') +pipeline( + fs.createReadStream(suburbsFile), + ndjson.parse(), + readSuburbs, + err => { + if (err) { + console.log(err) + process.exit(1) + } else { + console.log('Step 2/X: Creating index of Suburbs') + lookupSuburbs = new PolygonLookup({ + type: 'FeatureCollection', + features: suburbs + }) + + console.log('Step 3/X: noOSMAddressWithinBlock') + pipeline( + fs.createReadStream(path.join(conflatePath, 'noOSMAddressWithinBlock.geojson')), + ndjson.parse(), + candidates, + err => { + if (err) { + console.log(err) + process.exit(1) + } else { + + console.log('Step 4/X: noExactMatch') + pipeline( + fs.createReadStream(path.join(conflatePath, 'noExactMatch.geojson')), + ndjson.parse(), + candidates, + err => { + if (err) { + console.log(err) + process.exit(1) + } else { + console.log('Output candidate .osm files') + outputCandidates() + process.exit(0) + } + } + ) + } + } + ) + + } + } +) diff --git a/docker/candidate.Dockerfile b/docker/candidate.Dockerfile new file mode 100644 index 0000000..06421f7 --- /dev/null +++ b/docker/candidate.Dockerfile @@ -0,0 +1,7 @@ +FROM debian:buster-slim +RUN apt-get -y update && apt-get -y install curl gnupg make git +RUN curl -fsSL https://deb.nodesource.com/setup_15.x | bash - +RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - +RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list +RUN apt-get -y update && apt-get -y install nodejs yarn python3 +RUN git clone https://github.com/grigory-rechistov/osm-bulk-upload.git upload && sed -i s/api\.openstreetmap\.org/master.apis.dev.openstreetmap.org/g upload/*.py diff --git a/package.json b/package.json index 3689c8e..bd34415 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "clone-deep": "^4.0.1", "flatbush": "^3.3.0", "geoflatbush": "^1.0.0", + "geojsontoosm": "^0.0.3", "mktemp": "^1.0.0", "ndjson": "^2.0.0", "object.omit": "^3.0.0", @@ -93,6 +93,14 @@ "@turf/helpers" "^6.3.0" "@turf/invariant" "^6.3.0" +JSONStream@~0.7.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.7.4.tgz#734290e41511eea7c2cfe151fbf9a563a97b9786" + integrity sha1-c0KQ5BUR7qfCz+FR+/mlY6l7l4Y= + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -174,6 +182,11 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -243,7 +256,17 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -core-util-is@1.0.2: +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -453,6 +476,24 @@ geojson-rbush@3.x: "@turf/meta" "6.x" rbush "^2.0.0" +geojson-stream@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/geojson-stream/-/geojson-stream-0.0.0.tgz#e5e09a0633ad1a63a4aec5d7c5312a3b8f91a048" + integrity sha1-5eCaBjOtGmOkrsXXxTEqO4+RoEg= + dependencies: + JSONStream "~0.7.1" + through "~2.3.4" + +geojsontoosm@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/geojsontoosm/-/geojsontoosm-0.0.3.tgz#a0ebb5c14d945a99bf07f7748c9c851997beb1d5" + integrity sha512-tewr/qmOVZ5jB3bBWTqQJwWiM/TFachoQfo3HZVoxXbuhf76tIsCccISEH5nybzfMPbRZhmmd0QtkIQLZlekdQ== + dependencies: + concat-stream "^1.5.0" + geojson-stream "0.0.0" + jxon "^1.3.2" + optimist "^0.6.1" + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -533,7 +574,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -664,6 +705,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -694,6 +740,11 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -704,6 +755,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jxon@^1.3.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/jxon/-/jxon-1.6.1.tgz#ec566dc1e14bc67fa38a484fd92613ed843ea290" + integrity sha1-7FZtweFLxn+jikhP2SYT7YQ+opA= + dependencies: + xmldom "0.1.19" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -745,6 +803,11 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + mktemp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-1.0.0.tgz#b670eff23f52d6529e1dc362cb74ddf85448a9e3" @@ -816,6 +879,14 @@ once@^1.3.0: dependencies: wrappy "1" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + osm-geojson@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/osm-geojson/-/osm-geojson-0.8.4.tgz#48693374b2cceea46cc6670a334192fda0b48ce1" @@ -860,6 +931,11 @@ polygon-lookup@^2.6.0: point-in-polygon "1.0.1" rbush "^2.0.2" +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -901,6 +977,19 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + regexp.prototype.flags@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" @@ -960,6 +1049,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -1044,6 +1138,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -1081,7 +1182,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@^2.3.8, through@~2.3.4: +"through@>=2.2.7 <3", through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -1111,6 +1212,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -1135,7 +1241,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -1193,6 +1299,11 @@ which-typed-array@^1.1.2: has-symbols "^1.0.1" is-typed-array "^1.1.3" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -1207,6 +1318,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +xmldom@0.1.19: + version "0.1.19" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc" + integrity sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw= + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" |