mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-26 01:35:28 +03:00
Merge pull request #2922 from freasy/feature/mdns_check_and_resolve
This commit is contained in:
commit
8813538fef
6 changed files with 241 additions and 34 deletions
|
@ -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:*"/>
|
||||
|
|
|
@ -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": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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,20 +265,14 @@ 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) {
|
||||
if (newPorts.length === 1) {
|
||||
self.portPickerElement.val(newPorts[0].path);
|
||||
} else if (newPorts.length > 1) {
|
||||
self.selectPort(currentPorts);
|
||||
}
|
||||
}
|
||||
|
||||
self.port_available = true;
|
||||
// Signal board verification
|
||||
|
|
123
yarn.lock
123
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue