diff options
author | J Blackman <blckmn@users.noreply.github.com> | 2022-09-18 02:03:21 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-18 02:03:21 +0300 |
commit | 8813538fef0c5d7769cd158b915ef132fbe3b03e (patch) | |
tree | 959c2694a75fc1ade25f4038d5bda778c616b64d | |
parent | e0692c135004f80e618a64cce94c9cf9ba400189 (diff) | |
parent | d03cdfc425a5f46c54270388925c0b7921c36c4f (diff) |
Merge pull request #2922 from freasy/feature/mdns_check_and_resolve
-rw-r--r-- | cordova/config_template.xml | 1 | ||||
-rw-r--r-- | cordova/package_template.json | 4 | ||||
-rw-r--r-- | package.json | 6 | ||||
-rw-r--r-- | src/js/port_handler.js | 121 | ||||
-rw-r--r-- | src/main.html | 20 | ||||
-rw-r--r-- | yarn.lock | 123 |
6 files changed, 241 insertions, 34 deletions
diff --git a/cordova/config_template.xml b/cordova/config_template.xml index 026bc5c6..6797a3e9 100644 --- a/cordova/config_template.xml +++ b/cordova/config_template.xml @@ -7,6 +7,7 @@ <access origin="*"/> <allow-intent href="http://*/*"/> <allow-intent href="https://*/*"/> + <allow-intent href="tcp://*/*"/> <allow-intent href="tel:*"/> <allow-intent href="sms:*"/> <allow-intent href="mailto:*"/> diff --git a/cordova/package_template.json b/cordova/package_template.json index 762a43a8..a700c829 100644 --- a/cordova/package_template.json +++ b/cordova/package_template.json @@ -27,6 +27,7 @@ "cordova-plugin-whitelist": "^1.3.4", "cordova-plugin-theme-detection": "^1.2.1", "cordova-chrome-sockets-tcp": "^1.4.0", + "cordova-plugin-zeroconf": "^1.4.2", "bf-cordovarduino": "^1.0.0", "@ionic-native/core": "^5.1.0", "@ionic-native/ionic-webview": "^5.36.0", @@ -56,7 +57,8 @@ "cordova-plugin-theme-detection": {}, "bf-cordova-plugin-appavailability": {}, "cordova-chrome-sockets-tcp": {}, - "cordova-plugin-ionic-webview": {} + "cordova-plugin-ionic-webview": {}, + "cordova-plugin-zeroconf": {} } } } diff --git a/package.json b/package.json index 95145cfa..4def1faf 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@fortawesome/fontawesome-free": "^5.13.0", "@panter/vue-i18next": "^0.15.2", "bluebird": "^3.7.2", + "bonjour": "^3.5.0", "djv": "^2.1.4", "dompurify": "^2.3.6", "i18next": "^19.0.0", @@ -66,6 +67,7 @@ "jquery-ui-npm": "^1.12.0", "lru_map": "^0.3.3", "marked": "^4.0.17", + "multicast-dns": "^7.2.4", "multiple-select": "^1.5.2", "nw-vue-devtools-prebuilt": "^0.0.10", "object-hash": "^3.0.0", @@ -75,7 +77,7 @@ "switchery-latest": "^0.8.2", "three": "~0.97.0", "universal-ga": "^1.2.0", - "vue": "2.6.12" + "vue": "^2.6.14" }, "devDependencies": { "@babel/core": "^7.18.5", @@ -139,7 +141,7 @@ "through2": "^4.0.2", "vinyl-source-stream": "^2.0.0", "vue-loader": "^15.9.8", - "vue-template-compiler": "^2.6.12", + "vue-template-compiler": "^2.6.14", "yarn": "^1.22.17" }, "optionalDependencies": { diff --git a/src/js/port_handler.js b/src/js/port_handler.js index b204ebcc..bf8508ba 100644 --- a/src/js/port_handler.js +++ b/src/js/port_handler.js @@ -1,6 +1,9 @@ 'use strict'; const TIMEOUT_CHECK = 500 ; // With 250 it seems that it produces a memory leak and slowdown in some versions, reason unknown +const MDNS_INTERVAL = 10000; +const TCP_CHECK_INTERVAL = 5000; +const TCP_TIMEOUT = 2000; const usbDevices = { filters: [ {'vendorId': 1155, 'productId': 57105}, // STM Device in DFU Mode || Digital Radio in USB mode @@ -29,6 +32,94 @@ PortHandler.initialize = function () { // fill dropdown with version numbers generateVirtualApiVersions(); + const self = this; + + self.mdnsBrowser = { + services: [], + browser: null, + init: false, + }; + + let bonjour = {}; + + if (!self.mdnsBrowser.init) { + if (GUI.isCordova()) { + const zeroconf = cordova.plugins.zeroconf; + zeroconf.registerAddressFamily = 'ipv4'; // or 'ipv6' ('any' by default) + zeroconf.watchAddressFamily = 'ipv4'; // or 'ipv6' ('any' by default) + zeroconf.watch("_http._tcp.", "local.", (result) => { + const action = result.action; + const service = result.service; + if (['added', 'resolved'].includes(action)) { + console.log("Zeroconf Service Changed", service); + self.mdnsBrowser.services.push({ + addresses: service.ipv4Addresses, + txt: service.txtRecord, + fqdn: service.hostname, + }); + } else { + console.log("Zeroconf Service Removed", service); + self.mdnsBrowser.services = mdnsBrowser.services.filter(s => s.fqdn !== service.hostname); + } + }); + } else { + bonjour = require('bonjour')(); + self.mdnsBrowser.browser = bonjour.find({ type: 'http' }, function(service) { + console.log("Found HTTP service", service); + self.mdnsBrowser.services.push({ + addresses: service.addresses, + txt: service.txt, + fqdn: service.host, + }); + }); + } + + self.mdnsBrowser.init = true; + } + + const tcpCheck = function() { + if (!self.tcpCheckLock) { + self.tcpCheckLock = true; + if (self.initialPorts?.length > 0) { + const tcpPorts = self.initialPorts.filter(p => p.path.startsWith('tcp://')); + tcpPorts.forEach(function (port) { + const removePort = () => { + self.mdnsBrowser.services = self.mdnsBrowser.services.filter(s => s.fqdn !== port.fqdn); + }; + $.get({ + host: port.path.split('//').pop(), + port: 80, + timeout: TCP_TIMEOUT, + }, (res) => res.destroy()) + .fail(removePort); + }); + + //timeout is 2000ms for every found port, so wait that time before checking again + setTimeout(() => { + self.tcpCheckLock = false; + }, Math.min(tcpPorts.length, 1) * (TCP_TIMEOUT + 1)); + } else { + self.tcpCheckLock = false; + } + } + + setTimeout(() => { + tcpCheck(); + }, TCP_CHECK_INTERVAL); + }; + + tcpCheck(); + + if (self.mdns_timer) { + clearInterval(self.mdns_timer); + } + + self.mdns_timer = setInterval(() => { + if (!GUI.connected_to && !GUI.isCordova() && self.mdnsBrowser.browser) { + self.mdnsBrowser.browser.update(); + } + }, MDNS_INTERVAL); + // start listening, check after TIMEOUT_CHECK ms this.check(); }; @@ -52,7 +143,19 @@ PortHandler.check = function () { PortHandler.check_serial_devices = function () { const self = this; - serial.getDevices(function(currentPorts) { + serial.getDevices(function(cp) { + + let currentPorts = [ + ...cp, + ...(self.mdnsBrowser?.services?.filter(s => s.txt.vendor === 'elrs' && s.txt.type === 'rx') + .map(s => s.addresses.map(a => ({ + path: `tcp://${a}`, + displayName: `${s.txt.target} - ${s.txt.version}`, + fqdn: s.fqdn, + vendorId: 0, + productId: 0, + }))).flat() ?? []), + ].filter(Boolean); // auto-select port (only during initialization) if (!self.initialPorts) { @@ -128,7 +231,7 @@ PortHandler.removePort = function(currentPorts) { // disconnect "UI" - routine can't fire during atmega32u4 reboot procedure !!! if (GUI.connected_to) { for (let i = 0; i < removePorts.length; i++) { - if (removePorts[i] === GUI.connected_to) { + if (removePorts[i].path === GUI.connected_to) { $('div#header_btns a.connect').click(); } } @@ -162,19 +265,13 @@ PortHandler.detectPort = function(currentPorts) { const newPorts = self.array_difference(currentPorts, self.initialPorts); if (newPorts.length) { - // pick last_used_port for manual tcp auto-connect or detect and select new port for serial currentPorts = self.updatePortSelect(currentPorts); console.log(`PortHandler - Found: ${JSON.stringify(newPorts)}`); - const result = ConfigStorage.get('last_used_port'); - if (result.last_used_port) { - if (result.last_used_port.includes('tcp')) { - self.portPickerElement.val('manual'); - } else if (newPorts.length === 1) { - self.portPickerElement.val(newPorts[0].path); - } else if (newPorts.length > 1) { - self.selectPort(currentPorts); - } + if (newPorts.length === 1) { + self.portPickerElement.val(newPorts[0].path); + } else if (newPorts.length > 1) { + self.selectPort(currentPorts); } self.port_available = true; diff --git a/src/main.html b/src/main.html index ec43cd6d..f08f4018 100644 --- a/src/main.html +++ b/src/main.html @@ -159,9 +159,9 @@ </div> <betaflight-logo :configurator-version="CONFIGURATOR.getDisplayVersion()" - :firmware-version="FC.CONFIG.flightControllerVersion" - :firmware-id="FC.CONFIG.flightControllerIdentifier" - :hardware-id="FC.CONFIG.hardwareName" + :firmware-version="FC.CONFIG.flightControllerVersion" + :firmware-id="FC.CONFIG.flightControllerIdentifier" + :hardware-id="FC.CONFIG.hardwareName" ></betaflight-logo> <div id="port-picker"> <div id="port-override-option"> @@ -218,7 +218,7 @@ <div class="battery-status"></div> </div> </div> - <battery-legend + <battery-legend :voltage="FC.ANALOG.voltage" :vbatmaxcellvoltage="FC.BATTERY_CONFIG.vbatmaxcellvoltage" ></battery-legend> @@ -294,9 +294,9 @@ <div class="tab_container"> <betaflight-logo :configurator-version="CONFIGURATOR.getDisplayVersion()" - :firmware-version="FC.CONFIG.flightControllerVersion" - :firmware-id="FC.CONFIG.flightControllerIdentifier" - :hardware-id="FC.CONFIG.hardwareName" + :firmware-version="FC.CONFIG.flightControllerVersion" + :firmware-id="FC.CONFIG.flightControllerIdentifier" + :hardware-id="FC.CONFIG.hardwareName" ></betaflight-logo> <div id="tabs"> <ul class="mode-disconnected"> @@ -373,9 +373,9 @@ :cpu-load="FC.CONFIG.cpuload" :configurator-version="CONFIGURATOR.getDisplayVersion()" - :firmware-version="FC.CONFIG.flightControllerVersion" - :firmware-id="FC.CONFIG.flightControllerIdentifier" - :hardware-id="FC.CONFIG.hardwareName" + :firmware-version="FC.CONFIG.flightControllerVersion" + :firmware-id="FC.CONFIG.flightControllerIdentifier" + :hardware-id="FC.CONFIG.hardwareName" ></status-bar> <div id="cache"> <div class="data-loading"> @@ -1439,6 +1439,11 @@ resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -3669,6 +3674,11 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-includes@^3.0.3: version "3.1.4" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" @@ -4220,6 +4230,18 @@ body-parser@^1.19.0: raw-body "2.4.2" type-is "~1.6.18" +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -4503,6 +4525,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -5851,6 +5878,18 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -6111,6 +6150,33 @@ djv@^2.1.4: optionalDependencies: "@korzio/djv-draft-04" "^2.0.1" +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== + dependencies: + buffer-indexof "^1.0.0" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -8937,6 +9003,11 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +ip@^1.1.0: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -11230,6 +11301,27 @@ ms@2.1.3, ms@^2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +multicast-dns@^7.2.4: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" @@ -11764,6 +11856,14 @@ object-inspect@^1.8.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -13510,7 +13610,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.1: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -15390,6 +15490,11 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" @@ -16393,10 +16498,10 @@ vue-style-loader@^4.1.0: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@^2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" - integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg== +vue-template-compiler@^2.6.14: + version "2.6.14" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763" + integrity sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g== dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -16406,10 +16511,10 @@ vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue@2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" - integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== +vue@^2.6.14: + version "2.6.14" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" + integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== walker@^1.0.7, walker@~1.0.5: version "1.0.8" |