feat: actually update micro:bit, avoid 'firmware' term

This commit is contained in:
Christopher Willis-Ford committed 2023-06-05 07:49:11 -07:00
1 parent 9695200d8f
commit 7a94d619a4
9 files changed
+526 -272

No files matched your search

+278 -211
View File
@@ -10,6 +10,7 @@
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@microbit/microbit-universal-hex": "0.2.2",
"arraybuffer-loader": "^1.0.6",
"autoprefixer": "^9.0.1",
"base64-loader": "1.0.0",
@@ -20,6 +21,7 @@
"copy-webpack-plugin": "6.4.1",
"core-js": "2.5.7",
"css-loader": "^1.0.0",
"dapjs": "2.3.0",
"es6-object-assign": "1.1.0",
"file-loader": "2.0.0",
"get-float-time-domain-data": "0.1.0",
@@ -42,9 +44,9 @@
"prop-types": "^15.5.10",
"query-string": "^5.1.1",
"raw-loader": "^0.5.1",
"react": "16.2.0",
"react": "^16.0.0",
"react-contextmenu": "2.9.4",
"react-dom": "16.2.1",
"react-dom": "^16.0.0",
"react-draggable": "3.0.5",
"react-ga": "2.5.3",
"react-intl": "2.9.0",
@@ -110,6 +112,7 @@
"selenium-webdriver": "3.6.0",
"semantic-release": "19.0.5",
"uglifyjs-webpack-plugin": "1.3.0",
"url-loader": "4.1.1",
"web-audio-test-api": "0.5.2",
"webpack": "4.46.0",
"webpack-cli": "3.3.12",
@@ -4874,12 +4877,6 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/@commitlint/config-validator/node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -5702,6 +5699,19 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@microbit/microbit-universal-hex": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@microbit/microbit-universal-hex/-/microbit-universal-hex-0.2.2.tgz",
"integrity": "sha512-qyFt8ATgxAyPkNz9Yado4HXEeCctwP/8L1/v2hFLeVUqw/HFqVqV4piJbqRMmyOefMcQ9OyVPhLXjtbKn9063Q==",
"engines": {
"node": ">=8.5",
"npm": ">=6.0",
"yarn": "^1.0"
},
"peerDependencies": {
"tslib": ">=1.11.1"
}
},
"node_modules/@nicolo-ribaudo/chokidar-2": {
"version": "2.1.8-no-fsevents.2",
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz",
@@ -7391,10 +7401,9 @@
}
},
"node_modules/@types/json-schema": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz",
"integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==",
"dev": true
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
},
"node_modules/@types/json5": {
"version": "0.0.29",
@@ -7417,8 +7426,15 @@
"node_modules/@types/node": {
"version": "12.7.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz",
"integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==",
"dev": true
"integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ=="
},
"node_modules/@types/node-hid": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@types/node-hid/-/node-hid-1.3.1.tgz",
"integrity": "sha512-VPxuGDCoDxOUKrTZPSok7IEmiK4cVLfj8Csu09FtG5uF+eqf1HETERHXQkO02Rk6j6YiiHxp0/DA9R4llvhEzQ==",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/normalize-package-data": {
"version": "2.4.1",
@@ -7438,6 +7454,19 @@
"integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
"dev": true
},
"node_modules/@types/usb": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@types/usb/-/usb-1.5.4.tgz",
"integrity": "sha512-NOUza/8yuswu6RoECQyPHEjA34qpDaeONQ72fm+bCnnN2DJjDePAY+NsmV17H88oIlq4JlJ2mD5Kh5d6R2MwTQ==",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/w3c-web-usb": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.6.tgz",
"integrity": "sha512-cSjhgrr8g4KbPnnijAr/KJDNKa/bBa+ixYkywFRvrhvi9n1WEl7yYbtRyzE6jqNQiSxxJxoAW3STaOQwJHndaw=="
},
"node_modules/@types/yargs": {
"version": "13.0.3",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz",
@@ -7815,14 +7844,18 @@
}
},
"node_modules/ajv": {
"version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dependencies": {
"fast-deep-equal": "^2.0.1",
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-errors": {
@@ -7834,9 +7867,9 @@
}
},
"node_modules/ajv-keywords": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
"integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"peerDependencies": {
"ajv": "^6.9.1"
}
@@ -8550,37 +8583,6 @@
"webpack": ">=2"
}
},
"node_modules/babel-loader/node_modules/@types/json-schema": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
"integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
"dev": true
},
"node_modules/babel-loader/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/babel-loader/node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/babel-loader/node_modules/emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
@@ -8590,12 +8592,6 @@
"node": ">= 4"
}
},
"node_modules/babel-loader/node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/babel-loader/node_modules/find-cache-dir": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
@@ -9934,6 +9930,11 @@
"node": ">=6.0"
}
},
"node_modules/chrome-trace-event/node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/chromedriver": {
"version": "112.0.0",
"resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-112.0.0.tgz",
@@ -10259,15 +10260,6 @@
"node": ">= 0.6"
}
},
"node_modules/compressible/node_modules/mime-db": {
"version": "1.45.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/compression": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
@@ -10580,34 +10572,6 @@
"webpack": "^4.37.0 || ^5.0.0"
}
},
"node_modules/copy-webpack-plugin/node_modules/@types/json-schema": {
"version": "7.0.9",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
},
"node_modules/copy-webpack-plugin/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/copy-webpack-plugin/node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/copy-webpack-plugin/node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -10671,11 +10635,6 @@
"node": ">= 4"
}
},
"node_modules/copy-webpack-plugin/node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/copy-webpack-plugin/node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -11444,6 +11403,19 @@
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
"integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
},
"node_modules/dapjs": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/dapjs/-/dapjs-2.3.0.tgz",
"integrity": "sha512-quanzq7+2xnqgGqqYgARz9o3iBcZ3Ir5r5mTA7WPsjrp9ilEqqCToSFGTL+8HuGP35dUIL7O+yMBloYHhHgZDA==",
"dependencies": {
"@types/node-hid": "^1.2.0",
"@types/usb": "^1.5.1",
"@types/w3c-web-usb": "^1.0.4"
},
"engines": {
"node": ">=8.14.0"
}
},
"node_modules/dargs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
@@ -13897,9 +13869,9 @@
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
},
"node_modules/fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/fast-glob": {
"version": "3.2.6",
@@ -19957,19 +19929,19 @@
}
},
"node_modules/mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.40.0"
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
@@ -25811,6 +25783,12 @@
"npm": ">=2.0.0"
}
},
"node_modules/rxjs/node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -29345,9 +29323,10 @@
"dev": true
},
"node_modules/tslib": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"peer": true
},
"node_modules/tty-browserify": {
"version": "0.0.0",
@@ -29917,6 +29896,74 @@
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
"dev": true
},
"node_modules/url-loader": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
"integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
"dev": true,
"dependencies": {
"loader-utils": "^2.0.0",
"mime-types": "^2.1.27",
"schema-utils": "^3.0.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"file-loader": "*",
"webpack": "^4.0.0 || ^5.0.0"
},
"peerDependenciesMeta": {
"file-loader": {
"optional": true
}
}
},
"node_modules/url-loader/node_modules/emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/url-loader/node_modules/loader-utils": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
},
"engines": {
"node": ">=8.9.0"
}
},
"node_modules/url-loader/node_modules/schema-utils": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
"integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/url-parse": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
@@ -34928,12 +34975,6 @@
"uri-js": "^4.2.2"
}
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -35550,6 +35591,12 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"@microbit/microbit-universal-hex": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@microbit/microbit-universal-hex/-/microbit-universal-hex-0.2.2.tgz",
"integrity": "sha512-qyFt8ATgxAyPkNz9Yado4HXEeCctwP/8L1/v2hFLeVUqw/HFqVqV4piJbqRMmyOefMcQ9OyVPhLXjtbKn9063Q==",
"requires": {}
},
"@nicolo-ribaudo/chokidar-2": {
"version": "2.1.8-no-fsevents.2",
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz",
@@ -36803,10 +36850,9 @@
}
},
"@types/json-schema": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz",
"integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==",
"dev": true
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
},
"@types/json5": {
"version": "0.0.29",
@@ -36829,8 +36875,15 @@
"@types/node": {
"version": "12.7.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz",
"integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==",
"dev": true
"integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ=="
},
"@types/node-hid": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@types/node-hid/-/node-hid-1.3.1.tgz",
"integrity": "sha512-VPxuGDCoDxOUKrTZPSok7IEmiK4cVLfj8Csu09FtG5uF+eqf1HETERHXQkO02Rk6j6YiiHxp0/DA9R4llvhEzQ==",
"requires": {
"@types/node": "*"
}
},
"@types/normalize-package-data": {
"version": "2.4.1",
@@ -36850,6 +36903,19 @@
"integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
"dev": true
},
"@types/usb": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@types/usb/-/usb-1.5.4.tgz",
"integrity": "sha512-NOUza/8yuswu6RoECQyPHEjA34qpDaeONQ72fm+bCnnN2DJjDePAY+NsmV17H88oIlq4JlJ2mD5Kh5d6R2MwTQ==",
"requires": {
"@types/node": "*"
}
},
"@types/w3c-web-usb": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.6.tgz",
"integrity": "sha512-cSjhgrr8g4KbPnnijAr/KJDNKa/bBa+ixYkywFRvrhvi9n1WEl7yYbtRyzE6jqNQiSxxJxoAW3STaOQwJHndaw=="
},
"@types/yargs": {
"version": "13.0.3",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz",
@@ -37181,11 +37247,11 @@
}
},
"ajv": {
"version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
@@ -37198,9 +37264,9 @@
"requires": {}
},
"ajv-keywords": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
"integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"requires": {}
},
"amdefine": {
@@ -37755,43 +37821,12 @@
"schema-utils": "^2.6.5"
},
"dependencies": {
"@types/json-schema": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
"integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
"dev": true
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"requires": {}
},
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"find-cache-dir": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
@@ -38932,6 +38967,13 @@
"integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
"requires": {
"tslib": "^1.9.0"
},
"dependencies": {
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}
}
},
"chromedriver": {
@@ -39202,14 +39244,6 @@
"dev": true,
"requires": {
"mime-db": ">= 1.43.0 < 2"
},
"dependencies": {
"mime-db": {
"version": "1.45.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
"dev": true
}
}
},
"compression": {
@@ -39465,28 +39499,6 @@
"webpack-sources": "^1.4.3"
},
"dependencies": {
"@types/json-schema": {
"version": "7.0.9",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"requires": {}
},
"array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -39535,11 +39547,6 @@
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -40131,6 +40138,16 @@
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
"integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
},
"dapjs": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/dapjs/-/dapjs-2.3.0.tgz",
"integrity": "sha512-quanzq7+2xnqgGqqYgARz9o3iBcZ3Ir5r5mTA7WPsjrp9ilEqqCToSFGTL+8HuGP35dUIL7O+yMBloYHhHgZDA==",
"requires": {
"@types/node-hid": "^1.2.0",
"@types/usb": "^1.5.1",
"@types/w3c-web-usb": "^1.0.4"
}
},
"dargs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
@@ -42101,9 +42118,9 @@
}
},
"fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-glob": {
"version": "3.2.6",
@@ -46955,16 +46972,16 @@
"dev": true
},
"mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.40.0"
"mime-db": "1.52.0"
}
},
"mimic-fn": {
@@ -51396,6 +51413,14 @@
"dev": true,
"requires": {
"tslib": "^1.9.0"
},
"dependencies": {
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
}
}
},
"safe-buffer": {
@@ -54233,9 +54258,10 @@
}
},
"tslib": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"peer": true
},
"tty-browserify": {
"version": "0.0.0",
@@ -54673,6 +54699,47 @@
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
"dev": true
},
"url-loader": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
"integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
"dev": true,
"requires": {
"loader-utils": "^2.0.0",
"mime-types": "^2.1.27",
"schema-utils": "^3.0.0"
},
"dependencies": {
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true
},
"loader-utils": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"schema-utils": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
"integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
}
}
}
},
"url-parse": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
+3
View File
@@ -33,6 +33,7 @@
}
},
"dependencies": {
"@microbit/microbit-universal-hex": "0.2.2",
"arraybuffer-loader": "^1.0.6",
"autoprefixer": "^9.0.1",
"base64-loader": "1.0.0",
@@ -43,6 +44,7 @@
"copy-webpack-plugin": "6.4.1",
"core-js": "2.5.7",
"css-loader": "^1.0.0",
"dapjs": "2.3.0",
"es6-object-assign": "1.1.0",
"file-loader": "2.0.0",
"get-float-time-domain-data": "0.1.0",
@@ -137,6 +139,7 @@
"selenium-webdriver": "3.6.0",
"semantic-release": "19.0.5",
"uglifyjs-webpack-plugin": "1.3.0",
"url-loader": "4.1.1",
"web-audio-test-api": "0.5.2",
"webpack": "4.46.0",
"webpack-cli": "3.3.12",
@@ -11,7 +11,7 @@ import ConnectingStep from './connecting-step.jsx';
import ConnectedStep from './connected-step.jsx';
import ErrorStep from './error-step.jsx';
import UnavailableStep from './unavailable-step.jsx';
import UpdateFirmwareStep from './update-firmware-step.jsx';
import UpdatePeripheralStep from './update-peripheral-step.jsx';
import styles from './connection-modal.css';
@@ -41,7 +41,7 @@ const ConnectionModalComponent = props => (
{props.phase === PHASES.connected && <ConnectedStep {...props} />}
{props.phase === PHASES.error && <ErrorStep {...props} />}
{props.phase === PHASES.unavailable && <UnavailableStep {...props} />}
{props.phase === PHASES.updateFirmware && <UpdateFirmwareStep {...props} />}
{props.phase === PHASES.updateFirmware && <UpdatePeripheralStep {...props} />}
</Box>
</Modal>
);
@@ -52,7 +52,7 @@ const ScanningStep = props => (
id="gui.connection.scanning.noPeripheralsFound"
/>
{
props.onSendFirmware && <p>
props.onUpdatePeripheral && <p>
<FormattedMessage
defaultMessage="Need to update your device to work with Scratch?"
description="Prompt for updating firmware"
@@ -60,7 +60,7 @@ const ScanningStep = props => (
/>
<button
className={classNames(styles.bottomAreaItem, styles.connectionButton)}
onClick={props.onUpdateFirmware}
onClick={props.onUpdatePeripheral}
>
<FormattedMessage
defaultMessage="Update my Device"
@@ -108,8 +108,7 @@ ScanningStep.propTypes = {
connectionSmallIconURL: PropTypes.string,
onConnecting: PropTypes.func,
onRefresh: PropTypes.func,
onSendFirmware: PropTypes.func,
onUpdateFirmware: PropTypes.func,
onUpdatePeripheral: PropTypes.func,
peripheralList: PropTypes.arrayOf(PropTypes.shape({
name: PropTypes.string,
rssi: PropTypes.number,
@@ -15,37 +15,48 @@ import styles from './connection-modal.css';
/** @enum{string} UPDATE_ACTIVITY */
const UPDATE_ACTIVITY = keyMirror({
getReady: null,
sendFirmware: null,
sendUpdate: null,
results: null
});
class UpdateFirmwareStep extends React.Component {
class UpdatePeripheralStep extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'handleUpdateFirmware'
'handleSendUpdate'
]);
this.state = {
/**
* @type {UPDATE_ACTIVITY}
*/
activity: UPDATE_ACTIVITY.getReady,
progress: 0
progress: 0,
err: null,
res: null
};
}
async handleUpdateFirmware () {
async handleSendUpdate () {
this.setState({
activity: UPDATE_ACTIVITY.sendFirmware,
progress: 0
});
const results = await this.props.onSendFirmware(progress => {
this.setState({progress});
});
this.setState({
activity: UPDATE_ACTIVITY.results,
results
activity: UPDATE_ACTIVITY.sendUpdate,
progress: 0,
err: null,
res: null
});
try {
const res = await this.props.onSendPeripheralUpdate(progress => {
this.setState({progress});
});
this.setState({
activity: UPDATE_ACTIVITY.results,
res
});
} catch (err) {
this.setState({
activity: UPDATE_ACTIVITY.results,
err
});
}
}
renderGetReady () {
@@ -53,8 +64,8 @@ class UpdateFirmwareStep extends React.Component {
<Box className={styles.centeredRow}>
<FormattedMessage
defaultMessage="This will update your {extensionName} to work with Scratch."
description="Introduction to the firmware update process for a peripheral"
id="gui.connection.updateFirmware.introduction"
description="Introduction to the peripheral update process"
id="gui.connection.updatePeripheral.introduction"
values={{
extensionName: this.props.name
}}
@@ -67,8 +78,8 @@ class UpdateFirmwareStep extends React.Component {
}
<FormattedMessage
defaultMessage="Please connect your {extensionName} to this device using a USB cable."
description="Instructions to connect the micro:bit to the computer for the firmware update process"
id="gui.connection.updateFirmware.microBitConnect"
description="Instructions to connect the micro:bit to the computer for the update process"
id="gui.connection.updatePeripheral.microBitConnect"
values={{
extensionName: this.props.name
}}
@@ -77,8 +88,8 @@ class UpdateFirmwareStep extends React.Component {
<Box className={styles.centeredRow}>
<FormattedMessage
defaultMessage="Please don't disconnect, reset, or turn off your {extensionName} during the update."
description="Notice to not disrupt the firmware update process"
id="gui.connection.updateFirmware.doNotDisconnect"
description="Notice to not disrupt the peripheral update process"
id="gui.connection.updatePeripheral.doNotDisconnect"
values={{
extensionName: this.props.name
}}
@@ -87,7 +98,7 @@ class UpdateFirmwareStep extends React.Component {
</Box>);
}
renderSendFirmware () {
renderSendUpdate () {
return (<Box className={styles.activityArea}>
<p>{'Sending update...'}</p>
<progress
@@ -107,7 +118,7 @@ class UpdateFirmwareStep extends React.Component {
return (
<Box className={styles.body}>
{(this.state.activity === UPDATE_ACTIVITY.getReady) && this.renderGetReady()}
{(this.state.activity === UPDATE_ACTIVITY.sendFirmware) && this.renderSendFirmware()}
{(this.state.activity === UPDATE_ACTIVITY.sendUpdate) && this.renderSendUpdate()}
{(this.state.activity === UPDATE_ACTIVITY.results) && this.renderResults()}
<Box className={styles.bottomArea}>
<Dots
@@ -118,7 +129,7 @@ class UpdateFirmwareStep extends React.Component {
<button
className={styles.connectionButton}
onClick={this.props.onScanning}
disabled={this.state.activity === UPDATE_ACTIVITY.sendFirmware}
disabled={this.state.activity === UPDATE_ACTIVITY.sendUpdate}
>
<img
className={classNames(styles.buttonIconLeft, styles.buttonIconBack)}
@@ -126,19 +137,19 @@ class UpdateFirmwareStep extends React.Component {
/>
<FormattedMessage
defaultMessage="Go back"
description="Button to leave the firmware update process"
id="gui.connection.updateFirmware.goBackButton"
description="Button to leave the peripheral update process"
id="gui.connection.updatePeripheral.goBackButton"
/>
</button>
<button
className={styles.connectionButton}
onClick={this.handleUpdateFirmware}
onClick={this.handleSendUpdate}
disabled={this.state.activity !== UPDATE_ACTIVITY.getReady}
>
<FormattedMessage
defaultMessage="Update now"
description="Button to start the firmware update"
id="gui.connection.updateFirmware.updateNowButton"
description="Button to start the peripheral update"
id="gui.connection.updatePeripheral.updateNowButton"
/>
</button>
</Box>
@@ -148,10 +159,10 @@ class UpdateFirmwareStep extends React.Component {
}
}
UpdateFirmwareStep.propTypes = {
UpdatePeripheralStep.propTypes = {
name: PropTypes.string.isRequired,
onScanning: PropTypes.func.isRequired,
onSendFirmware: PropTypes.func.isRequired
onSendPeripheralUpdate: PropTypes.func.isRequired
};
export default UpdateFirmwareStep;
export default UpdatePeripheralStep;
+22 -20
View File
@@ -6,7 +6,9 @@ import VM from 'scratch-vm';
import analytics from '../lib/analytics';
import extensionData from '../lib/libraries/extensions/index.jsx';
import {connect} from 'react-redux';
import {closeConnectionModal} from '../reducers/modals';
import {isMicroBitUpdateSupported, selectAndUpdateMicroBit} from '../lib/microbit-update';
class ConnectionModal extends React.Component {
constructor (props) {
@@ -19,8 +21,8 @@ class ConnectionModal extends React.Component {
'handleDisconnect',
'handleError',
'handleHelp',
'handleUpdateFirmware',
'handleSendFirmware'
'handleSendUpdate',
'handleUpdatePeripheral'
]);
this.state = {
extension: extensionData.find(ext => ext.extensionId === props.extensionId),
@@ -106,33 +108,33 @@ class ConnectionModal extends React.Component {
label: this.props.extensionId
});
}
handleUpdateFirmware () {
handleUpdatePeripheral () {
this.setState({
phase: PHASES.updateFirmware
});
analytics.event({
category: 'extensions',
action: 'update firmware',
action: 'enter peripheral update flow',
label: this.props.extensionId
});
}
handleSendFirmware (progressCallback) {
// TODO: get this functionality from the extension
// TODO: actually send firmware to the device
let progress = 0;
return new Promise(resolve => {
const interval = setInterval(() => {
progress += 0.01;
if (progress >= 1) {
clearInterval(interval);
resolve({success: true});
}
progressCallback(progress);
}, 100);
/**
* Handle sending an update to the peripheral.
* @param {function(number): void} [progressCallback] Optional callback for progress updates in the range of [0..1].
* @returns {Promise} Resolves when the update is complete.
*/
handleSendUpdate (progressCallback) {
analytics.event({
category: 'extensions',
action: 'send update to peripheral',
label: this.props.extensionId
});
// TODO: get this functionality from the extension
return selectAndUpdateMicroBit(progressCallback);
}
render () {
const canSendFirmware = this.props.extensionId === 'microbit';
const canUpdatePeripheral = (this.props.extensionId === 'microbit') && isMicroBitUpdateSupported();
return (
<ConnectionModalComponent
connectingMessage={this.state.extension && this.state.extension.connectingMessage}
@@ -151,8 +153,8 @@ class ConnectionModal extends React.Component {
onDisconnect={this.handleDisconnect}
onHelp={this.handleHelp}
onScanning={this.handleScanning}
onUpdateFirmware={this.handleUpdateFirmware}
onSendFirmware={canSendFirmware ? this.handleSendFirmware : null}
onSendPeripheralUpdate={canUpdatePeripheral ? this.handleSendUpdate : null}
onUpdatePeripheral={canUpdatePeripheral ? this.handleUpdatePeripheral : null}
/>
);
}
+2 -4
View File
@@ -62,8 +62,7 @@ class ScanningStep extends React.Component {
onConnected={this.props.onConnected}
onConnecting={this.props.onConnecting}
onRefresh={this.handleRefresh}
onSendFirmware={this.props.onSendFirmware}
onUpdateFirmware={this.props.onUpdateFirmware}
onUpdatePeripheral={this.props.onUpdatePeripheral}
/>
);
}
@@ -74,8 +73,7 @@ ScanningStep.propTypes = {
extensionId: PropTypes.string.isRequired,
onConnected: PropTypes.func.isRequired,
onConnecting: PropTypes.func.isRequired,
onSendFirmware: PropTypes.func,
onUpdateFirmware: PropTypes.func,
onUpdatePeripheral: PropTypes.func,
vm: PropTypes.instanceOf(VM).isRequired
};
+165
View File
@@ -0,0 +1,165 @@
import {
isUniversalHex,
separateUniversalHex
} from '@microbit/microbit-universal-hex';
import {WebUSB, DAPLink} from 'dapjs';
import keyMirror from 'keymirror';
import log from './log.js';
import hexUrl from '../generated/microbit-hex-url.cjs';
/**
* @typedef {import('@microbit/microbit-universal-hex').IndividualHex} IndividualHex
*/
/**
* The version of a micro:bit.
* @enum {string}
*/
const DeviceVersion = keyMirror({
V1: null,
V2: null
});
const vendorId = 0x0d28;
const productId = 0x0204;
/**
* Assumes the device is a micro:bit and determines its version.
* @param {USBDevice} device The USB device to check.
* @returns {DeviceVersion} The version of the device.
* @throws {Error} If the device is not a recognized micro:bit.
*/
const getDeviceVersion = device => {
const microBitBoardId = device?.serialNumber?.substring(0, 4) ?? '';
switch (microBitBoardId) {
case '9900':
case '9901':
return DeviceVersion.V1;
case '9903':
case '9904':
case '9905':
case '9906':
return DeviceVersion.V2;
}
throw new Error('Could not identify micro:bit board version');
};
/**
* Checks micro:bit board version targetted by the hex file.
* @param {IndividualHex} hex The hex file to check.
* @returns {DeviceVersion} The version of the hex file.
* @throws {Error} If the hex file does not target a recognized micro:bit version.
*/
const getHexVersion = hex => {
switch (hex.boardId) {
case 0x9900:
case 0x9901:
return DeviceVersion.V1;
case 0x9903:
case 0x9904:
case 0x9905:
case 0x9906:
return DeviceVersion.V2;
}
throw new Error('Could not identify hex version');
};
/**
* Fetches the hex file and returns a map of micro:bit versions to hex file contents.
* @returns {Promise<Map<DeviceVersion, Uint8Array>>} A map of micro:bit versions to hex file contents.
* @throws {Error} If the fetch fails or cannot be interpreted as text.
* @throws {Error} If the hex file is not in universal format.
*/
const getHexMap = async () => {
const response = await fetch(hexUrl);
const hex = await response.text();
if (!isUniversalHex(hex)) {
throw new Error('Hex file must be in universal format');
}
const hexMap = new Map();
for (const hexObj of separateUniversalHex(hex)) {
const version = getHexVersion(hexObj);
const binary = new TextEncoder().encode(hex);
hexMap.set(version, binary);
}
return hexMap;
};
/**
* Copy the Scratch-specific hex file to the specified micro:bit.
* @param {USBDevice} device The micro:bit to update.
* @param {function(number): void} [progress] Optional function to call with progress updates in the range of [0..1].
* @returns {Promise<void>} A Promise that resolves when the update is completed.
* @throws {Error} If anything goes wrong while fetching the hex file or updating the micro:bit.
*/
const updateMicroBit = async (device, progress) => {
log.info(`Connecting to micro:bit`);
const transport = new WebUSB(device);
const target = new DAPLink(transport);
if (progress) {
target.on(DAPLink.EVENT_PROGRESS, progress);
}
log.info(`Checking micro:bit version`);
const version = getDeviceVersion(device);
log.info(`Collecting hex file`);
const hexMap = await getHexMap();
const hexData = hexMap.get(version);
if (!hexData) {
throw new Error(`Could not find hex file for micro:bit ${version}`);
}
log.info(`Connecting to micro:bit ${version}`);
await target.connect();
log.info(`Sending hex file...`);
try {
await target.flash(hexData);
} finally {
log.info('Disconnecting');
if (target.connected) {
await target.disconnect();
} else {
log.info('Already disconnected');
}
}
};
/**
* Requests a micro:bit from the browser then updates it with the Scratch-specific hex file.
* The browser is expected to prompt the user to select a micro:bit.
* @param {function(number): void} [progress] Optional function to call with progress updates in the range of [0..1].
* @returns {Promise<void>} A Promise that resolves when the update is completed.
* @throws {Error} If anything goes wrong while fetching the hex file or updating the micro:bit.
*/
const selectAndUpdateMicroBit = async progress => {
log.info('Selecting micro:bit');
const device = await navigator.usb.requestDevice({
filters: [{vendorId, productId}]
});
if (!device) {
log.info('No device selected');
return;
}
return updateMicroBit(device, progress);
};
/**
* Checks if the browser supports updating a micro:bit.
* @returns {boolean} True if the browser appears to support updating a micro:bit.
*/
const isMicroBitUpdateSupported = () =>
!!(navigator.usb && navigator.usb.requestDevice);
export {
isMicroBitUpdateSupported,
selectAndUpdateMicroBit
};
+9
View File
@@ -79,6 +79,15 @@ const base = {
}
}
}]
},
{
test: /\.hex$/,
use: [{
loader: 'url-loader',
options: {
limit: 16 * 1024
}
}]
}]
},
optimization: {