# Javascript implementation of esptool
This repository contains a Javascript implementation of [esptool](https://github.com/espressif/esptool), a serial flasher utility for Espressif chips. `esptool-js` is based on [Web Serial API](https://wicg.github.io/serial/) and works in Google Chrome and Microsoft Edge [version 89 or later](https://developer.mozilla.org/en-US/docs/Web/API/Serial#browser_compatibility) browsers and Google Chrome on Android [version 61 or later](https://developer.mozilla.org/en-US/docs/Web/API/USB#browser_compatibility) via the [web-serial-polyfill](https://github.com/google/web-serial-polyfill) compatibility layer.
**NOTE:** Unlike the Python-based esptool, `esptool-js` doesn't implement generation of binary images out of ELF files, and doesn't include companion tools similar to [espefuse.py](https://github.com/espressif/esptool/wiki/espefuse) and [espsecure.py](https://github.com/espressif/esptool/wiki/espsecure).
## Usage
**CDN**
`https://unpkg.com/esptool-js/lib/index.js` or `https://unpkg.com/esptool-js/bundle.js` to use the single bundle JavaScript file.
**NPM**
`npm install --save esptool-js`
**Yarn**
`yarn add --save esptool-js`
Check an example project [here](https://github.com/espressif/esptool-js/tree/main/examples/typescript).
**Nightly builds** for ESPTOOL-JS
## Define port filters for device using WebSerial
```js
const portFilters: { usbVendorId?: number | undefined, usbProductId?: number | undefined }[] = [];
const device = await navigator.serial.requestPort({ filters: portFilters });
```
## Inject a Terminal to use with esptool-js
```js
// You can use any JavaScript compatible terminal by wrapping it in a helper object like this:
let espLoaderTerminal = {
clean() {
// Implement the clean function call for your terminal here.
},
writeLine(data) {
// Implement the writeLine function call for your terminal here.
},
write(data) {
// Implement the write function call for your terminal here.
},
};
```
You can pass this terminal object to `ESPLoader` constructor as shown in the [examples projects](./examples/).
## Live demo
Visit https://espressif.github.io/esptool-js/ to see this tool in action.
## Testing it locally
```sh
npm install
npm run build
cd examples/typescript
npm install
npm run dev # Run local sever with example code
```
Then open `http://localhost:1234` in a Chrome browser. The `npm run build` step builds the `lib` used in the example `examples/typescript/index.html`. Update this reference as described in [Usage](#usage) section.
## Test from Pull Request artifact
If you are testing the main branch or any Pull Request (PR) artifact you can follow these steps:
1. Get the `esptool-js-.tgz` where `` is the current version and download it.
2. Add the following line to your project's package.json dependencies
```json
"dependencies": {
"esptool-js": "file:../path/to/esptool-js-.tgz"
}
```
3. Use the package like `import "esptool-js/lib/index.js"` when added in package.json as shown before.
## License
The code in this repository is Copyright (c) 2023 Espressif Systems (Shanghai) Co. Ltd. It is licensed under Apache 2.0 license, as described in [LICENSE](https://github.com/espressif/esptool-js/blob/main/LICENSE) file.