Compare commits

..

352 Commits
3.6.0 ... main

Author SHA1 Message Date
dependabot[bot]
2c6c705018
Bump @rollup/plugin-node-resolve from 16.0.0 to 16.0.1 (#577)
Bumps [@rollup/plugin-node-resolve](https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve) from 16.0.0 to 16.0.1.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/node-resolve/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/node-resolve-v16.0.1/packages/node-resolve)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-node-resolve"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-31 14:29:28 +02:00
dependabot[bot]
dedf3ef1f7
Bump esptool-js from 0.5.3 to 0.5.4 (#556)
* Bump esptool-js from 0.5.3 to 0.5.4

Bumps [esptool-js](https://github.com/espressif/esptool-js) from 0.5.3 to 0.5.4.
- [Release notes](https://github.com/espressif/esptool-js/releases)
- [Commits](https://github.com/espressif/esptool-js/compare/v0.5.3...v0.5.4)

---
updated-dependencies:
- dependency-name: esptool-js
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* hard reset

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2025-03-07 12:52:14 -05:00
Sebastien Vermeille
11a1574849
Add nspanelmanager project to list (#551) 2025-03-07 11:54:22 -05:00
dependabot[bot]
c1b2732ca9
Bump rollup from 4.34.8 to 4.34.9 (#572) 2025-03-04 07:14:59 +01:00
dependabot[bot]
479c496240
Bump @types/w3c-web-serial from 1.0.7 to 1.0.8 (#570) 2025-03-04 07:14:40 +01:00
dependabot[bot]
003bd76912
Bump prettier from 3.5.2 to 3.5.3 (#571) 2025-03-04 07:10:03 +01:00
dependabot[bot]
789ad03a6f
Bump typescript from 5.7.3 to 5.8.2 (#569) 2025-03-03 23:06:29 +01:00
dependabot[bot]
ab718869a0
Bump prettier from 3.5.1 to 3.5.2 (#568)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-25 01:44:24 +01:00
dependabot[bot]
f301c4c055
Bump prettier from 3.4.2 to 3.5.1 (#567)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-21 00:58:50 +01:00
dependabot[bot]
50e3fe5771
Bump rollup from 4.34.1 to 4.34.8 (#566)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-21 00:58:37 +01:00
dependabot[bot]
b25f250c90
Bump @babel/preset-env from 7.26.7 to 7.26.9 (#565)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-21 00:58:27 +01:00
dependabot[bot]
c2894b8f4c
Bump typescript from 5.7.2 to 5.7.3 (#549)
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.7.2 to 5.7.3.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.7.2...v5.7.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-06 20:34:44 +01:00
dependabot[bot]
e06c3f3f1a
Bump rollup from 4.32.0 to 4.34.1 (#560)
Bumps [rollup](https://github.com/rollup/rollup) from 4.32.0 to 4.34.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.32.0...v4.34.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-06 20:32:43 +01:00
dependabot[bot]
b46f3f298d
Bump rollup from 4.29.1 to 4.32.0 (#557)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-28 14:06:04 +01:00
dependabot[bot]
7bc7959cf3
Bump @babel/preset-env from 7.26.0 to 7.26.7 (#558)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-28 14:05:02 +01:00
Ryan Kulp
bd670d1510
project - TRMNL (#547)
Co-authored-by: Ryan Kulp <ryanckulp@gmail.com>
2024-12-31 07:50:56 +13:00
Paulus Schoutsen
ce5650244d
Migrate to native reset when available (#544) 2024-12-22 23:36:34 -05:00
Paulus Schoutsen
cd74083edf
Fix missing icons (#543) 2024-12-22 14:22:41 -05:00
Paulus Schoutsen
b328166ea4
Update more branding to be OHF (#542) 2024-12-22 14:21:58 -05:00
Paulus Schoutsen
350a696012
Update esptool.js to 0.5.3 (#541) 2024-12-22 14:21:50 -05:00
Paulus Schoutsen
a7c3d303b5 10.1.0 2024-12-22 19:15:14 +00:00
Spencer Owen
f943773ae2
Add openspool logo (#531) 2024-12-17 16:50:52 -05:00
Paulus Schoutsen
32a9ff78ea
Update deps (#540) 2024-12-17 16:49:00 -05:00
dependabot[bot]
a0a98026cd
Bump prettier from 3.4.1 to 3.4.2 (#536)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-09 23:45:16 +01:00
dependabot[bot]
b3547b5abf
Bump prettier from 3.3.3 to 3.4.1 (#534)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-06 21:21:07 +01:00
dependabot[bot]
a77da4285f
Bump @babel/preset-env from 7.24.5 to 7.26.0 (#532)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-26 10:53:42 +01:00
dependabot[bot]
2ec657d2ce
Bump @rollup/plugin-node-resolve from 15.2.3 to 15.3.0 (#530)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-19 08:42:32 +01:00
dependabot[bot]
21535c6d98
Bump @rollup/plugin-typescript from 11.1.6 to 12.1.1 (#522)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-12 09:15:52 +01:00
dependabot[bot]
8c4bf5ca3b
Bump @rollup/plugin-commonjs from 25.0.7 to 28.0.1 (#524)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-12 08:57:25 +01:00
dependabot[bot]
0434b154da
Bump prettier from 3.2.5 to 3.3.3 (#523)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-12 08:51:47 +01:00
dependabot[bot]
2e3589a938
Bump serve from 14.2.3 to 14.2.4 (#525)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-12 08:27:42 +01:00
dependabot[bot]
95ab287d67
Bump typescript from 5.3.3 to 5.4.5 (#500)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-08 20:17:17 +01:00
dependabot[bot]
5d19b2d5f3
Bump serve from 14.2.1 to 14.2.3 (#511)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-08 19:21:15 +01:00
dependabot[bot]
052c7828c0
Bump @babel/preset-env from 7.23.9 to 7.24.5 (#510)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-08 19:20:58 +01:00
dependabot[bot]
c71d7a347c
Bump rollup from 4.12.0 to 4.17.2 (#512)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-08 19:19:45 +01:00
Darren Griffin
6b2ff90895
Add OHF logo to README (#519) 2024-09-30 19:16:54 +02:00
Peter Zich
b7b4b5beba
Use PORT env var to customize script/develop port (#502) 2024-06-04 21:27:01 -04:00
Peter Zich
9261c2c24e
Create TimestampTransformer and use it in EwtConsole (#501) 2024-04-18 14:43:27 +12:00
dependabot[bot]
ec35b6aa69
Bump rollup from 4.10.0 to 4.12.0 (#478)
Bumps [rollup](https://github.com/rollup/rollup) from 4.10.0 to 4.12.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.10.0...v4.12.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-24 16:55:23 -05:00
Paulus Schoutsen
10c47dc916
Update develop 2024-02-15 11:02:11 -05:00
Paulus Schoutsen
df7b4c69e0
Switch to preset-env for babel (#476) 2024-02-13 12:00:45 -05:00
Paulus Schoutsen
a69aa84df6 10.0.1 2024-02-12 16:18:31 -05:00
Paulus Schoutsen
9b50ac6e81
Transform local assignment (#475) 2024-02-12 16:18:04 -05:00
Paulus Schoutsen
df179092df 10.0.0 2024-02-12 15:57:29 -05:00
Paulus Schoutsen
7de3b6a521
Migrate to Material Web 1 (#474)
* No port pick

* Use own components again

* Migrate circular progress

* Migrate Icon Button

* Move button labels to text nodes

* Use ew-list for dashboard

* Missed one interactive

* Migrate select

* Migrate textfield

* Migrate checkbox/formfield

* Remove unused ewt-button

* Migrate text field

* Divider + dashboard icons

* Migrate dialog

* Remove mwc components

* Clean up icons

* Remove old comment

* Update connect button

* Align top level dialog icon

* Avoid scrolling when dialog active

* Allow variable for border radius

* Cleanup

* Bump dependencies

* Bump esptool.js to 0.4.1

* Add new device types

* Update readme with new device types

* Tweak launch button look
2024-02-12 15:50:33 -05:00
Paulus Schoutsen
e107f0f5b6
Bump lit to 2.8.0 (#473) 2024-02-09 21:37:27 -05:00
dependabot[bot]
93fe093c5e
Bump release-drafter/release-drafter from 5 to 6 (#472)
Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 5 to 6.
- [Release notes](https://github.com/release-drafter/release-drafter/releases)
- [Commits](https://github.com/release-drafter/release-drafter/compare/v5...v6)

---
updated-dependencies:
- dependency-name: release-drafter/release-drafter
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-09 21:32:16 -05:00
dependabot[bot]
d08bd0aac6
Bump @rollup/plugin-json from 6.0.1 to 6.1.0 (#454)
Bumps [@rollup/plugin-json](https://github.com/rollup/plugins/tree/HEAD/packages/json) from 6.0.1 to 6.1.0.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/json/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/url-v6.1.0/packages/json)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-json"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-09 21:20:36 -05:00
dependabot[bot]
86b4b88717
Bump typescript from 5.3.2 to 5.3.3 (#450)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.3.2 to 5.3.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.3.2...v5.3.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-09 21:20:24 -05:00
dependabot[bot]
fb6524c967
Bump rollup from 4.9.5 to 4.9.6 (#467)
Bumps [rollup](https://github.com/rollup/rollup) from 4.9.5 to 4.9.6.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.9.5...v4.9.6)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-09 21:20:17 -05:00
James Chaloupka
21c23206d0
Add dialout permissions instructions to no-port (#427)
* Add dialout permissions instructions to no-port

* Add OS check

* Remove || true

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2024-02-09 21:18:02 -05:00
dependabot[bot]
cb8f72e4d0
Bump prettier from 3.2.2 to 3.2.4 (#463)
Bumps [prettier](https://github.com/prettier/prettier) from 3.2.2 to 3.2.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.2.2...3.2.4)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-23 20:12:22 -05:00
dependabot[bot]
2d747f29e7
Bump @rollup/plugin-typescript from 11.1.5 to 11.1.6 (#462)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 11.1.5 to 11.1.6.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/typescript-v11.1.6/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-23 20:12:15 -05:00
dependabot[bot]
1588f60e3e
Bump rollup from 4.6.0 to 4.9.5 (#460)
Bumps [rollup](https://github.com/rollup/rollup) from 4.6.0 to 4.9.5.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.6.0...v4.9.5)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 21:03:05 -05:00
dependabot[bot]
9fd7cb9f35
Bump prettier from 3.1.0 to 3.2.2 (#459)
Bumps [prettier](https://github.com/prettier/prettier) from 3.1.0 to 3.2.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.1.0...3.2.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-17 21:02:57 -05:00
Jesse Hills
fff135bb4f
Create LICENSE (#461) 2024-01-16 20:18:05 -05:00
Keith Burzinski
4527133413
Update package.json -> 9.4.3 2023-12-04 23:37:02 -06:00
Keith Burzinski
60ea3a5e2c
Add small delay when resetting because USB JTAG, take 2 (#444) 2023-12-05 18:18:12 +13:00
Paulus Schoutsen
192dd8f47c
9.4.2 2023-11-30 16:43:40 -05:00
dependabot[bot]
ac589b2717
Bump typescript from 5.2.2 to 5.3.2 (#439)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.2.2 to 5.3.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.2.2...v5.3.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-30 16:41:54 -05:00
dependabot[bot]
e948ccf9eb
Bump rollup from 4.4.0 to 4.6.0 (#441)
Bumps [rollup](https://github.com/rollup/rollup) from 4.4.0 to 4.6.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.4.0...v4.6.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-30 16:41:44 -05:00
Keith Burzinski
0f53cc7ca9
Add small delay when resetting because USB JTAG (#443) 2023-11-30 16:41:34 -05:00
Keith Burzinski
bf0de9fdf3
Bump devcontainer Node version to 20 (#442) 2023-11-28 23:46:05 -05:00
dependabot[bot]
01119fee0c
Bump prettier from 3.0.2 to 3.1.0 (#433)
* Bump prettier from 3.0.2 to 3.1.0

Bumps [prettier](https://github.com/prettier/prettier) from 3.0.2 to 3.1.0.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.0.2...3.1.0)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* prettier --write

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-13 17:49:17 -05:00
dependabot[bot]
c00b93cc64
Bump rollup from 4.3.0 to 4.4.0 (#434)
Bumps [rollup](https://github.com/rollup/rollup) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.3.0...v4.4.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-13 17:46:58 -05:00
dependabot[bot]
60fb3f0c0e
Bump @types/w3c-web-serial from 1.0.3 to 1.0.6 (#435)
Bumps [@types/w3c-web-serial](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/w3c-web-serial) from 1.0.3 to 1.0.6.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/w3c-web-serial)

---
updated-dependencies:
- dependency-name: "@types/w3c-web-serial"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-13 17:46:46 -05:00
Paulus Schoutsen
2830666121 9.4.1 2023-11-04 21:45:23 -04:00
dependabot[bot]
a4b0c54f31
Bump rollup from 3.26.2 to 4.3.0 (#429)
* Bump rollup from 3.26.2 to 4.3.0

Bumps [rollup](https://github.com/rollup/rollup) from 3.26.2 to 4.3.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.26.2...v4.3.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Upgrade rollup plugins

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-03 21:40:11 -04:00
dependabot[bot]
2e7cd2651a
Bump @rollup/plugin-typescript from 11.1.2 to 11.1.5 (#420)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 11.1.2 to 11.1.5.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/typescript-v11.1.5/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-03 21:29:36 -04:00
dependabot[bot]
e02fd6351c
Bump actions/checkout from 3 to 4 (#412)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-03 21:29:26 -04:00
dependabot[bot]
5906467412
Bump typescript from 5.1.6 to 5.2.2 (#411)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.1.6 to 5.2.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.1.6...v5.2.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-03 21:29:16 -04:00
dependabot[bot]
98ed4d00cf
Bump actions/setup-node from 3 to 4 (#424)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-03 21:29:05 -04:00
dependabot[bot]
305b958fcf
Bump serve from 14.2.0 to 14.2.1 (#410)
Bumps [serve](https://github.com/vercel/serve) from 14.2.0 to 14.2.1.
- [Release notes](https://github.com/vercel/serve/releases)
- [Commits](https://github.com/vercel/serve/compare/14.2.0...14.2.1)

---
updated-dependencies:
- dependency-name: serve
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-03 21:28:47 -04:00
Paulus Schoutsen
f7957ff6f0
Bump to esptool-js 0.3.2 (#421)
* Bump to esptool-js 0.3.1

* esptool-js 0.3.2
2023-11-03 21:28:34 -04:00
dependabot[bot]
4465b0be6c
Bump tslib from 2.6.0 to 2.6.2 (#405)
Bumps [tslib](https://github.com/Microsoft/tslib) from 2.6.0 to 2.6.2.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/2.6.0...v2.6.2)

---
updated-dependencies:
- dependency-name: tslib
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-25 08:57:27 -04:00
dependabot[bot]
a5cb686b47
Bump prettier from 3.0.0 to 3.0.2 (#404)
Bumps [prettier](https://github.com/prettier/prettier) from 3.0.0 to 3.0.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.0.0...3.0.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-25 08:57:16 -04:00
dependabot[bot]
26b38ffc6d
Bump @rollup/plugin-node-resolve from 15.1.0 to 15.2.0 (#403)
Bumps [@rollup/plugin-node-resolve](https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve) from 15.1.0 to 15.2.0.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/node-resolve/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/node-resolve-v15.2.0/packages/node-resolve)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-node-resolve"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-25 08:52:31 -04:00
Jonas Niesner
5beb5cf4ad
Add the OpenEpaperLink project (#398) 2023-08-21 11:26:46 +12:00
dependabot[bot]
ba62801bea
Bump prettier from 2.8.8 to 3.0.0 (#394)
* Bump prettier from 2.8.8 to 3.0.0

Bumps [prettier](https://github.com/prettier/prettier) from 2.8.8 to 3.0.0.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.8...3.0.0)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Apply Prettier

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-07-11 13:53:55 -04:00
dependabot[bot]
fa1a4c5927
Bump lit from 2.7.5 to 2.7.6 (#393)
Bumps [lit](https://github.com/lit/lit/tree/HEAD/packages/lit) from 2.7.5 to 2.7.6.
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/lit/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/lit@2.7.6/packages/lit)

---
updated-dependencies:
- dependency-name: lit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-11 13:52:09 -04:00
dependabot[bot]
43d2f4df97
Bump rollup from 3.26.0 to 3.26.2 (#392)
Bumps [rollup](https://github.com/rollup/rollup) from 3.26.0 to 3.26.2.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.26.0...v3.26.2)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-11 13:51:53 -04:00
Paulus Schoutsen
1bf4bffb31 9.4.0 2023-07-07 22:45:51 -04:00
Paulus Schoutsen
f92e0988d3
Retry fetching Wi-Fi ssids (#391) 2023-07-07 22:43:07 -04:00
Paulus Schoutsen
2f736cbc80
Bump esptool-js to 0.3.0 (#390) 2023-07-07 22:30:41 -04:00
dependabot[bot]
1e4cd0d5e3
Bump tslib from 2.5.3 to 2.6.0 (#385)
Bumps [tslib](https://github.com/Microsoft/tslib) from 2.5.3 to 2.6.0.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/v2.5.3...2.6.0)

---
updated-dependencies:
- dependency-name: tslib
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-07 22:20:11 -04:00
dependabot[bot]
b3de9ecb8b
Bump rollup from 3.25.3 to 3.26.0 (#386)
Bumps [rollup](https://github.com/rollup/rollup) from 3.25.3 to 3.26.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.25.3...v3.26.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-07 22:19:58 -04:00
dependabot[bot]
36533b9c85
Bump @rollup/plugin-typescript from 11.1.1 to 11.1.2 (#387)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 11.1.1 to 11.1.2.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/typescript-v11.1.2/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-07 22:19:52 -04:00
dependabot[bot]
02c16906e9
Bump typescript from 5.1.3 to 5.1.6 (#389)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.1.3 to 5.1.6.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/commits)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-07 22:19:45 -04:00
dependabot[bot]
69c668facd
Bump rollup from 3.25.1 to 3.25.3 (#384)
Bumps [rollup](https://github.com/rollup/rollup) from 3.25.1 to 3.25.3.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.25.1...v3.25.3)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-26 22:10:27 -04:00
dependabot[bot]
2efbfbf1bc
Bump rollup from 3.24.0 to 3.25.1 (#382)
Bumps [rollup](https://github.com/rollup/rollup) from 3.24.0 to 3.25.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.24.0...v3.25.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-14 21:29:42 -04:00
Paulus Schoutsen
542b492f2b 9.3.0 2023-06-07 21:27:22 -04:00
Paulus Schoutsen
b430c71264
Bump deps (#381) 2023-06-07 21:25:19 -04:00
dependabot[bot]
867ff64e07
Bump typescript from 4.9.5 to 5.1.3 (#378)
* Bump typescript from 4.9.5 to 5.1.3

Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.5 to 5.1.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.9.5...v5.1.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* remove deprecated option

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-06-07 21:15:35 -04:00
dependabot[bot]
4694cc1d42
Bump prettier from 2.8.5 to 2.8.8 (#363)
Bumps [prettier](https://github.com/prettier/prettier) from 2.8.5 to 2.8.8.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.5...2.8.8)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-07 21:13:08 -04:00
dependabot[bot]
d3875d4f27
Bump @rollup/plugin-typescript from 11.0.0 to 11.1.1 (#373)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 11.0.0 to 11.1.1.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/typescript-v11.1.1/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-07 21:13:01 -04:00
dependabot[bot]
98f7641604
Bump rollup from 3.20.0 to 3.23.1 (#379)
Bumps [rollup](https://github.com/rollup/rollup) from 3.20.0 to 3.23.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.20.0...v3.23.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-07 21:12:44 -04:00
dependabot[bot]
c16a51bb28
Bump lit from 2.6.1 to 2.7.5 (#380)
Bumps [lit](https://github.com/lit/lit/tree/HEAD/packages/lit) from 2.6.1 to 2.7.5.
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/lit/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/lit@2.7.5/packages/lit)

---
updated-dependencies:
- dependency-name: lit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-07 21:12:36 -04:00
Davide Perini
0460a4a3f3
Add Luciferin project to the Products using ESP Web Tools (#370)
* Add files via upload

* Update index.html
2023-05-19 22:59:23 -04:00
Jonathas Barbosa
5390216549
Fix new manifest location (#367) 2023-05-19 22:49:02 -04:00
Paulus Schoutsen
e25b30551d Use manifest from firmware.esphome.io directly 2023-04-20 14:59:46 -04:00
Paulus Schoutsen
63d73f7a71
Fix firmware paths 2023-04-20 14:40:15 -04:00
Jonathas Barbosa
ac56f4dc20
Adds Clockwise logo (#360) 2023-04-15 20:36:42 -04:00
dependabot[bot]
afd9e23abe
Bump prettier from 2.8.4 to 2.8.5 (#346)
Bumps [prettier](https://github.com/prettier/prettier) from 2.8.4 to 2.8.5.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.4...2.8.5)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-20 20:15:10 -04:00
dependabot[bot]
ccf7cefe5a
Bump rollup from 3.19.1 to 3.20.0 (#347)
Bumps [rollup](https://github.com/rollup/rollup) from 3.19.1 to 3.20.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.19.1...v3.20.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-20 20:15:02 -04:00
Sven Serlier
99a6320d3e
Remove en-us from URLs (#345) 2023-03-19 05:15:58 -04:00
dependabot[bot]
74ee646590
Bump rollup from 3.18.0 to 3.19.1 (#344)
Bumps [rollup](https://github.com/rollup/rollup) from 3.18.0 to 3.19.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.18.0...v3.19.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-13 21:24:55 -04:00
dependabot[bot]
0e0bc1d65d
Bump rollup from 3.17.3 to 3.18.0 (#342)
Bumps [rollup](https://github.com/rollup/rollup) from 3.17.3 to 3.18.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.17.3...v3.18.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-06 20:14:00 -05:00
dependabot[bot]
ccf9c3be2f
Bump typescript from 4.9.4 to 4.9.5 (#329)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.4 to 4.9.5.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.9.4...v4.9.5)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-28 11:06:07 -05:00
dependabot[bot]
a2d2f6bac1
Bump prettier from 2.8.3 to 2.8.4 (#334)
Bumps [prettier](https://github.com/prettier/prettier) from 2.8.3 to 2.8.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.3...2.8.4)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-28 11:05:57 -05:00
dependabot[bot]
bccfa6c1a6
Bump rollup from 3.12.0 to 3.17.3 (#339)
Bumps [rollup](https://github.com/rollup/rollup) from 3.12.0 to 3.17.3.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.12.0...v3.17.3)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-28 11:05:46 -05:00
Paulus Schoutsen
12fc656f15
Bump esptool-js to 0.2.1 (#340)
* Bump esptool-js to 0.2.1

* 9.2.1
2023-02-28 11:05:28 -05:00
Paulus Schoutsen
38e1398e0f
Log ESP Web Tools version (#328)
* Log ESP Web Tools version

* Prettier on generated code
2023-02-02 22:37:56 -05:00
dependabot[bot]
652537eff1
Bump rollup from 3.10.1 to 3.12.0 (#327)
Bumps [rollup](https://github.com/rollup/rollup) from 3.10.1 to 3.12.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.10.1...v3.12.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-30 23:35:14 -05:00
dependabot[bot]
d06ee1a023
Bump serve from 14.1.2 to 14.2.0 (#326)
Bumps [serve](https://github.com/vercel/serve) from 14.1.2 to 14.2.0.
- [Release notes](https://github.com/vercel/serve/releases)
- [Commits](https://github.com/vercel/serve/compare/14.1.2...14.2.0)

---
updated-dependencies:
- dependency-name: serve
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-30 23:35:03 -05:00
dependabot[bot]
1570b1f117
Bump @rollup/plugin-terser from 0.3.0 to 0.4.0 (#325)
Bumps [@rollup/plugin-terser](https://github.com/rollup/plugins/tree/HEAD/packages/terser) from 0.3.0 to 0.4.0.
- [Release notes](https://github.com/rollup/plugins/releases)
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/terser/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/terser-v0.4.0/packages/terser)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-terser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-30 23:34:53 -05:00
dependabot[bot]
7c8def7663
Bump tslib from 2.4.1 to 2.5.0 (#324)
Bumps [tslib](https://github.com/Microsoft/tslib) from 2.4.1 to 2.5.0.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/2.4.1...2.5.0)

---
updated-dependencies:
- dependency-name: tslib
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-30 23:34:45 -05:00
Jesse Hills
c39d358701
Add ESP32 c3/s2/s3 variants (#323)
* Update ESPHome manifest to include esp32 c3/s2/s3 variants

* Delete static ESPHome firmwares

* Remove submodule
2023-01-30 23:34:26 -05:00
Paulus Schoutsen
06979ee419
Actually still recommend users 9 (#322) 2023-01-29 21:32:07 -05:00
Paulus Schoutsen
53094e254e
Update the docs to automatically use latest ESP Web Tools (#321) 2023-01-29 21:15:24 -05:00
dependabot[bot]
ec93a0b15d
Bump rollup from 3.10.0 to 3.10.1 (#318)
Bumps [rollup](https://github.com/rollup/rollup) from 3.10.0 to 3.10.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.10.0...v3.10.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-25 18:17:34 -05:00
Paulus Schoutsen
dbbb015d4f 9.2.0 2023-01-18 15:54:32 -05:00
Paulus Schoutsen
d09d54be4b
Update esptool-js to 0.2.0 (#317) 2023-01-18 15:53:13 -05:00
dependabot[bot]
f1fb9a2733
Bump lit from 2.6.0 to 2.6.1 (#312)
Bumps [lit](https://github.com/lit/lit/tree/HEAD/packages/lit) from 2.6.0 to 2.6.1.
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/lit/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/lit@2.6.1/packages/lit)

---
updated-dependencies:
- dependency-name: lit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-16 20:26:51 -05:00
dependabot[bot]
8e0803788f
Bump improv-wifi-serial-sdk from 2.4.0 to 2.5.0 (#313)
Bumps [improv-wifi-serial-sdk](https://github.com/improv-wifi/sdk-serial-js) from 2.4.0 to 2.5.0.
- [Release notes](https://github.com/improv-wifi/sdk-serial-js/releases)
- [Commits](https://github.com/improv-wifi/sdk-serial-js/compare/2.4.0...2.5.0)

---
updated-dependencies:
- dependency-name: improv-wifi-serial-sdk
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-16 20:26:45 -05:00
dependabot[bot]
80823261e4
Bump prettier from 2.8.2 to 2.8.3 (#314)
Bumps [prettier](https://github.com/prettier/prettier) from 2.8.2 to 2.8.3.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.2...2.8.3)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-16 20:26:39 -05:00
dependabot[bot]
495651f324
Bump rollup from 3.9.1 to 3.10.0 (#315)
Bumps [rollup](https://github.com/rollup/rollup) from 3.9.1 to 3.10.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.9.1...v3.10.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-16 20:26:31 -05:00
Paulus Schoutsen
32cdf3e752 9.1.1 2023-01-11 22:52:43 -05:00
Paulus Schoutsen
47f9543831
Code split smarter to get port picking done first (#310) 2023-01-11 22:51:59 -05:00
dependabot[bot]
2d0af6c9d5
Bump @rollup/plugin-typescript from 10.0.1 to 11.0.0 (#306)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 10.0.1 to 11.0.0.
- [Release notes](https://github.com/rollup/plugins/releases)
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/commonjs-v11.0.0/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-09 16:12:03 -05:00
dependabot[bot]
d9bcb20e3c
Bump prettier from 2.8.1 to 2.8.2 (#307)
Bumps [prettier](https://github.com/prettier/prettier) from 2.8.1 to 2.8.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.8.1...2.8.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-09 16:07:02 -05:00
dependabot[bot]
c39082f5d5
Bump lit from 2.5.0 to 2.6.0 (#308)
Bumps [lit](https://github.com/lit/lit/tree/HEAD/packages/lit) from 2.5.0 to 2.6.0.
- [Release notes](https://github.com/lit/lit/releases)
- [Changelog](https://github.com/lit/lit/blob/main/packages/lit/CHANGELOG.md)
- [Commits](https://github.com/lit/lit/commits/lit@2.6.0/packages/lit)

---
updated-dependencies:
- dependency-name: lit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-09 16:06:56 -05:00
dependabot[bot]
34b8ff2da0
Bump @rollup/plugin-terser from 0.2.1 to 0.3.0 (#309)
Bumps [@rollup/plugin-terser](https://github.com/rollup/plugins/tree/HEAD/packages/terser) from 0.2.1 to 0.3.0.
- [Release notes](https://github.com/rollup/plugins/releases)
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/terser/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/terser-v0.3.0/packages/terser)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-terser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-09 16:06:50 -05:00
Paulus Schoutsen
8a71ccaa0d 9.1.0 2023-01-03 16:00:29 -05:00
Paulus Schoutsen
ba85feb548
Configure wifi improvements (#304)
* Add timeout to improv provisioning

* Add refresh SSIDs button

* Hide password if insecured wifi

* Bump serial sdk 2.4.0
2023-01-03 15:58:37 -05:00
Paulus Schoutsen
39ae5dc40c
Update dependencies (#303)
* Migrate terser plugin

* Update dependencies
2023-01-03 14:07:48 -05:00
Paulus Schoutsen
de749bd83e
Fix console not staying at bottom if new line spanned two lines (#302) 2023-01-02 21:39:45 -05:00
Paulus Schoutsen
98891ab73f
Add Squeezelite-ESP32 to used projects (#300) 2022-12-31 12:29:18 -05:00
Paulus Schoutsen
554d1a82b3
Add note about merging files (#298)
* Add note about merging files

* Update index.html

* Update index.html

* Update index.html

* Updates

* Updates

* More tweaks
2022-12-10 20:01:14 -05:00
Paulus Schoutsen
55d6bdd1b2 9.0.5 in package.json 2022-11-29 16:29:31 -05:00
Paulus Schoutsen
9bb5e0e8e8 9.0.5 2022-11-29 16:28:51 -05:00
Paulus Schoutsen
195c8613ed
Bump esptool.js (#296) 2022-11-29 16:26:42 -05:00
Paulus Schoutsen
ffe6514d6a
9.0.4 2022-09-23 09:48:22 -04:00
Andreas Mandel
d6ce1dbc98
Fix casing of ESPLoader.js (#287) 2022-08-28 14:46:15 -04:00
dependabot[bot]
2e9a9706df
Bump lit from 2.2.8 to 2.3.0 (#282)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-15 17:34:19 -04:00
dependabot[bot]
9a7731d838
Bump @rollup/plugin-typescript from 8.3.3 to 8.3.4 (#275)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 8.3.3 to 8.3.4.
- [Release notes](https://github.com/rollup/plugins/releases)
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/typescript-v8.3.4/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-01 14:37:07 -07:00
dependabot[bot]
42aa4f0ecf
Bump rollup from 2.75.7 to 2.77.2 (#276)
Bumps [rollup](https://github.com/rollup/rollup) from 2.75.7 to 2.77.2.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v2.75.7...v2.77.2)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-01 14:36:43 -07:00
Zack Barett
882154d6ed
Add 2smart to projects that use ESP Web Tools (#274) 2022-08-02 09:32:53 +12:00
dependabot[bot]
dc739701ed
Bump lit from 2.2.7 to 2.2.8 (#272)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-25 20:49:10 -07:00
Paulus Schoutsen
9fee26fbab 9.0.3 2022-07-20 00:03:23 -07:00
Paulus Schoutsen
1a8bee6604
Add babel to rewrite class properties (#271) 2022-07-20 00:00:46 -07:00
Paulus Schoutsen
67dca17e0b 9.0.2 2022-07-19 23:44:58 -07:00
Paulus Schoutsen
a64f1f0f40 Patch esploader.js to work around unpkg bug 2022-07-19 23:43:49 -07:00
Paulus Schoutsen
5496383bb8 9.0.1 2022-07-19 23:10:14 -07:00
Paulus Schoutsen
086921e5ed 9.0.0 2022-07-19 22:57:32 -07:00
Paulus Schoutsen
8c17d20aea
Use esptool-js for installation (#269) 2022-07-19 22:55:22 -07:00
dependabot[bot]
4e19973bb1
Bump rollup from 2.76.0 to 2.77.0 (#267)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-18 20:46:45 -07:00
dependabot[bot]
42b6d3bb8f
Bump serve from 13.0.4 to 14.0.1 (#268)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-18 20:46:24 -07:00
Sven Serlier
d5be41ea57
Update SILabs URL (#265) 2022-07-12 10:56:58 -07:00
dependabot[bot]
28e3867582
Bump rollup from 2.75.7 to 2.76.0 (#263)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-11 14:56:17 -07:00
dependabot[bot]
d3ca1ba308
Bump serve from 13.0.2 to 13.0.4 (#264)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-11 14:56:09 -07:00
dependabot[bot]
df2975dbff
Bump lit from 2.2.6 to 2.2.7 (#262)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-05 10:33:37 -07:00
dependabot[bot]
26482848bd
Bump prettier from 2.6.2 to 2.7.1 (#255)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-23 21:30:04 -04:00
dependabot[bot]
8001808ddf
Bump lit from 2.2.5 to 2.2.6 (#256)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-23 21:29:17 -04:00
dependabot[bot]
0803c830fe
Bump typescript from 4.7.3 to 4.7.4 (#257)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-23 21:29:12 -04:00
dependabot[bot]
744791d3d4
Bump rollup from 2.75.6 to 2.75.7 (#258)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-23 21:29:06 -04:00
Paulus Schoutsen
013fe768ca 8.0.6 2022-06-14 10:23:08 -07:00
Paulus Schoutsen
38d6102768
better handle long firmware names (#252) 2022-06-14 10:22:16 -07:00
dependabot[bot]
d273fbfc84
Bump rollup from 2.75.5 to 2.75.6 (#250)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 14:35:14 -07:00
dependabot[bot]
7b4af648db
Bump @rollup/plugin-typescript from 8.3.2 to 8.3.3 (#251)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 14:35:04 -07:00
Paulus Schoutsen
b3f47371d7 8.0.5 2022-06-10 13:42:30 -07:00
Paulus Schoutsen
f1085f4fa4
Update driver suggestions (#249)
Co-authored-by: Stefan Agner <stefan@agner.ch>
2022-06-10 13:41:48 -07:00
Paulus Schoutsen
ac2014217c 8.0.4 2022-06-09 21:22:50 -07:00
Paulus Schoutsen
c7200294db
ESP Web Flasher 5.1.4 (#248) 2022-06-09 21:22:23 -07:00
dependabot[bot]
ce9452b214
Bump typescript from 4.7.2 to 4.7.3 (#246)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 15:22:41 -07:00
dependabot[bot]
60c7b4ec67
Bump rollup from 2.75.3 to 2.75.5 (#247)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 15:20:30 -07:00
Paulus Schoutsen
059f4a821a 8.0.3 2022-05-31 14:15:16 -07:00
Paulus Schoutsen
5ac98c6193
Always throw error when init fails (#244) 2022-05-31 14:14:23 -07:00
dependabot[bot]
63e097eb78
Bump rollup from 2.74.1 to 2.75.3 (#241)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-30 16:57:14 -07:00
dependabot[bot]
dc72cca569
Bump lit from 2.2.4 to 2.2.5 (#242)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-30 16:57:09 -07:00
dependabot[bot]
0e538c5c25
Bump typescript from 4.6.4 to 4.7.2 (#240)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-30 14:08:54 -07:00
dependabot[bot]
4125bda687
Bump rollup from 2.73.0 to 2.74.1 (#238)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-23 22:21:31 -07:00
dependabot[bot]
aedc15d4dc
Bump lit from 2.2.3 to 2.2.4 (#239)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-23 22:20:11 -07:00
Paulus Schoutsen
9b8b479e6c
Update index.html 2022-05-21 00:28:30 -07:00
Paulus Schoutsen
8709b8a0e4 8.0.2 2022-05-15 23:45:11 -07:00
Paulus Schoutsen
35af1e8401
Bump ESP Web Flasher 5.1.3 (#236) 2022-05-15 23:43:51 -07:00
dependabot[bot]
6372226a9c
Bump rollup from 2.71.1 to 2.73.0 (#235)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-15 23:12:44 -07:00
Paulus Schoutsen
90a415d669
Update MWC to 0.26.1 (#234) 2022-05-15 22:49:33 -07:00
Paulus Schoutsen
5f9a966b82 add ESP Web Flasher link 2022-05-15 22:00:28 -07:00
Paulus Schoutsen
9a58abb396 Tweaks to website text 2022-05-06 15:17:07 -07:00
dependabot[bot]
e1593936df
Bump rollup from 2.70.2 to 2.71.1 (#224)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-02 15:02:04 -07:00
dependabot[bot]
e12a4f9467
Bump lit from 2.2.2 to 2.2.3 (#225)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-02 15:01:59 -07:00
dependabot[bot]
678a9c0f06
Bump typescript from 4.6.3 to 4.6.4 (#226)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-02 15:01:54 -07:00
dependabot[bot]
9b674a4433
Bump @rollup/plugin-node-resolve from 13.2.1 to 13.3.0 (#227)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-02 15:01:37 -07:00
dependabot[bot]
c6e3cfd1c5
Bump tslib from 2.3.1 to 2.4.0 (#223)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-25 15:16:29 -07:00
Paulus Schoutsen
0cc297fe3b
Add HTML doctype 2022-04-25 07:45:42 -07:00
dependabot[bot]
7381cd456a
Bump rollup from 2.70.1 to 2.70.2 (#220)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 14:29:26 -07:00
dependabot[bot]
b91f4f167b
Bump @rollup/plugin-node-resolve from 13.2.0 to 13.2.1 (#221)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 14:29:16 -07:00
dependabot[bot]
98c5b8e158
Bump @rollup/plugin-typescript from 8.3.1 to 8.3.2 (#222)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 14:29:08 -07:00
Paulus Schoutsen
11ae293176 8.0.1 2022-04-13 14:02:29 -07:00
Paulus Schoutsen
627b106e18
Make input select/textfield work better when bad REM defined (#219) 2022-04-13 14:01:56 -07:00
Paulus Schoutsen
d87f076071
Update README.md 2022-04-13 00:14:45 -07:00
Paulus Schoutsen
e6bf67b6fd 8.0.0 2022-04-12 11:40:23 -07:00
Paulus Schoutsen
d0efbac292
Rename checkSameFirmwareVersion to checkSameFirmware (#217) 2022-04-12 11:39:21 -07:00
Paulus Schoutsen
c90e17a5ff 7.5.0 2022-04-12 10:55:14 -07:00
Paulus Schoutsen
95b8efa500
Allow specifying checkFirmware override (#216) 2022-04-12 10:54:41 -07:00
Paulus Schoutsen
22c0a1a1cb 7.4.0 2022-04-11 23:30:12 -07:00
Paulus Schoutsen
8a7176b93f
Don't base font-size on HTML page (#214) 2022-04-11 23:29:43 -07:00
Paulus Schoutsen
f34fab1c0f
Add funding URL (#213) 2022-04-11 23:24:52 -07:00
dependabot[bot]
ec2a6e7206
Bump lit from 2.2.1 to 2.2.2 (#210)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 14:09:48 -07:00
dependabot[bot]
083c43877a
Bump @rollup/plugin-node-resolve from 13.1.3 to 13.2.0 (#211)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 14:09:36 -07:00
dependabot[bot]
b46d3be794
Bump esp-web-flasher from 5.1.1 to 5.1.2 (#212)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 14:09:25 -07:00
dependabot[bot]
8a2bcd28b1
Bump prettier from 2.6.1 to 2.6.2 (#208)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-04 15:03:57 -07:00
dependabot[bot]
69d5134f91
Bump prettier from 2.6.0 to 2.6.1 (#206)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-28 14:54:22 -07:00
dependabot[bot]
bd5582619b
Bump typescript from 4.6.2 to 4.6.3 (#207)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-28 14:54:16 -07:00
Paulus Schoutsen
d09e0340e4 7.3.1 2022-03-25 15:48:36 -07:00
Paulus Schoutsen
473a9f09b7
Bump ESP Web Flasher 5.1.1 (#205) 2022-03-25 15:48:00 -07:00
Jason2866
38128d2eb0
add missing S3 (#204) 2022-03-24 17:18:06 -07:00
Jesse Hills
a06a9ddf64
Update firmwares to 2022.3.0 (#202)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2022-03-23 21:50:36 -07:00
Paulus Schoutsen
137cae89cb 7.3.0 2022-03-23 09:01:21 -07:00
Paulus Schoutsen
e9a90e6082
Improv: handle no SSID list support (#201) 2022-03-23 08:52:09 -07:00
Paulus Schoutsen
d42bae9f23
Bump ESP Web Flasher to 5.10 (#200) 2022-03-23 08:52:01 -07:00
Paulus Schoutsen
7c7618c372
Update release-drafter.yml 2022-03-21 22:59:10 -07:00
Paulus Schoutsen
ecf2cf700e
Update release-drafter.yml 2022-03-21 22:54:12 -07:00
dependabot[bot]
5639d2a806
Bump prettier from 2.5.1 to 2.6.0 (#198)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-21 15:41:41 -07:00
dependabot[bot]
b92ab703ea
Bump lit from 2.2.0 to 2.2.1 (#199)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-21 15:41:35 -07:00
dependabot[bot]
92b18e3487
Bump rollup from 2.70.0 to 2.70.1 (#194)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-14 23:12:41 -07:00
Paulus Schoutsen
1571c31aa4 Update website 2022-03-08 23:46:29 -08:00
Paulus Schoutsen
b5f82ff461
Update version in manifest.json 2022-03-08 22:44:47 -08:00
Paulus Schoutsen
0fc225990e Bump website to 7.2.0 2022-03-08 22:40:16 -08:00
Paulus Schoutsen
f5bde3d02c 7.2.0 2022-03-08 22:38:21 -08:00
Paulus Schoutsen
9eca2c2c2c
Scan for SSIDs (#192) 2022-03-08 22:37:45 -08:00
Paulus Schoutsen
edd3b9e133
Offer troubleshooting if no port selected (#190) 2022-03-07 23:42:32 -08:00
Paulus Schoutsen
3448bc17ab
Stop execution on error during initialization (#191) 2022-03-07 23:42:20 -08:00
Paulus Schoutsen
18c2053995 Fix S2 and C3 constants in docs 2022-03-07 23:33:44 -08:00
Paulus Schoutsen
176c228f86 Add video why we created ESP Web Tools 2022-03-07 22:30:03 -08:00
dependabot[bot]
4076d6f3a0
Bump rollup from 2.68.0 to 2.70.0 (#187)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-07 15:44:02 -08:00
dependabot[bot]
7e36700b82
Bump actions/checkout from 2 to 3 (#188)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-07 15:43:54 -08:00
dependabot[bot]
d5ed1ee63c
Bump typescript from 4.5.5 to 4.6.2 (#189)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-07 15:43:48 -08:00
dependabot[bot]
28ab2f91bf
Bump rollup from 2.67.3 to 2.68.0 (#182)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-28 15:37:02 -08:00
dependabot[bot]
13cf6960fc
Bump actions/setup-node from 2.5.1 to 3 (#183)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-28 15:36:55 -08:00
dependabot[bot]
0c0bfa1e25
Bump @rollup/plugin-typescript from 8.3.0 to 8.3.1 (#184)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-28 15:36:48 -08:00
dependabot[bot]
4912ba3e60
Bump rollup from 2.67.2 to 2.67.3 (#180)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-21 14:59:56 -08:00
dependabot[bot]
58f4e08770
Bump lit from 2.1.3 to 2.2.0 (#181)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-21 14:59:40 -08:00
dependabot[bot]
a7cd43840f
Bump rollup from 2.67.1 to 2.67.2 (#178)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 13:19:06 -08:00
dependabot[bot]
7bfe33c3a8
Bump rollup from 2.66.1 to 2.67.1 (#176)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 14:31:05 -08:00
dependabot[bot]
60680ee2b6
Bump improv-wifi-serial-sdk from 2.1.0 to 2.2.1 (#175)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 14:30:57 -08:00
dependabot[bot]
f96f7460dd
Bump lit from 2.1.2 to 2.1.3 (#174)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 14:30:49 -08:00
Jesse Hills
79f484d772
Updates firmwares to latest dev (#173) 2022-02-07 11:14:56 -08:00
Paulus Schoutsen
e33a975147
Update text: reset data -> erase user data (#171) 2022-02-03 22:25:49 -08:00
dependabot[bot]
27379335b8
Bump lit from 2.1.1 to 2.1.2 (#170)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 15:21:26 -08:00
dependabot[bot]
7814e30b94
Bump rollup from 2.66.0 to 2.66.1 (#169)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 15:20:24 -08:00
dependabot[bot]
eb53aa095e
Bump typescript from 4.5.4 to 4.5.5 (#167)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-24 14:01:32 -08:00
dependabot[bot]
8acb9633fa
Bump rollup from 2.64.0 to 2.66.0 (#168)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-24 14:01:24 -08:00
Paulus Schoutsen
3e01ff955b 7.1.0 2022-01-23 21:03:44 -08:00
Paulus Schoutsen
99606d75fe
Allow downloading logs (#165) 2022-01-23 21:03:09 -08:00
André Lademann
f1fdfd5e25
Fix link to the repository in package.json (#166) 2022-01-23 13:52:01 -08:00
dependabot[bot]
da840075df
Bump rollup from 2.63.0 to 2.64.0 (#163)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-17 23:03:16 -08:00
John
f2bccb67ba
Change from OK_ICON to ERROR_ICON when flash fails (#162) 2022-01-16 13:48:53 -08:00
dependabot[bot]
54a6887089
Bump lit from 2.0.2 to 2.1.1 (#159)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-10 14:53:22 -08:00
dependabot[bot]
921a17dd32
Bump rollup from 2.62.0 to 2.63.0 (#158)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-10 14:53:16 -08:00
dependabot[bot]
7903e788f0
Bump @rollup/plugin-node-resolve from 13.1.2 to 13.1.3 (#157)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-10 14:53:09 -08:00
Paulus Schoutsen
0c871f863e Update website to 7.0.0 2022-01-05 09:09:39 -08:00
Paulus Schoutsen
4005d4e846 7.0.0 2022-01-03 15:05:45 -08:00
Paulus Schoutsen
fe329ee0ec
Bump ESP Web Flasher to 5.0.0 (#155) 2022-01-03 15:04:55 -08:00
dependabot[bot]
59bdf42d31
Bump @rollup/plugin-node-resolve from 13.1.1 to 13.1.2 (#154)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 14:40:26 -08:00
dependabot[bot]
67be8d0255
Bump actions/setup-node from 2.5.0 to 2.5.1 (#153)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 14:40:20 -08:00
dependabot[bot]
c972e19e6b
Bump rollup from 2.61.1 to 2.62.0 (#150)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-30 11:23:07 -08:00
dependabot[bot]
471395d692
Bump typescript from 4.5.3 to 4.5.4 (#147)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-20 23:49:21 -08:00
Jason2866
e7fbbd0a19
correct manifest.json example (#146) 2021-12-18 21:37:21 -08:00
Paulus Schoutsen
d8e10ff8c9
Cleanups (#145) 2021-12-17 20:54:30 -08:00
Paulus Schoutsen
4f6724a74f
Align console with ESPHome (#141) 2021-12-16 13:56:44 -08:00
dependabot[bot]
64e82d2dff
Bump typescript from 4.5.2 to 4.5.3 (#142)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-13 16:15:56 -08:00
dependabot[bot]
a022af5502
Bump rollup from 2.60.2 to 2.61.1 (#143)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-13 16:15:47 -08:00
dependabot[bot]
d784aa2bd1
Bump @rollup/plugin-node-resolve from 13.0.6 to 13.1.1 (#144)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-13 16:15:32 -08:00
Paulus Schoutsen
3f60b2ed43
Interpretet timeout in seconds, not ms (#140) 2021-12-07 14:14:18 -08:00
Paulus Schoutsen
4d9f07da9f 6.1.1 2021-12-07 14:14:08 -08:00
Paulus Schoutsen
3ddcacd0ce Move import up 2021-12-07 14:06:26 -08:00
Paulus Schoutsen
014df385ad Use lite-youtube 2021-12-07 14:05:24 -08:00
Paulus Schoutsen
7e96b75c88 6.1.0 2021-12-07 10:45:13 -08:00
Paulus Schoutsen
ebef0688c8
Allow configuring improv timeout (#139) 2021-12-07 10:44:32 -08:00
dependabot[bot]
58c76e98bc
Bump prettier from 2.5.0 to 2.5.1 (#137)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-06 15:16:52 -08:00
dependabot[bot]
d81096c472
Bump rollup from 2.60.1 to 2.60.2 (#138)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-06 15:16:46 -08:00
Paulus Schoutsen
0266057a38 6.0.0 2021-11-30 08:47:16 -08:00
Paulus Schoutsen
c4daee18bc
Allow prompting for erase (#134) 2021-11-30 08:42:59 -08:00
dependabot[bot]
10816b5166
Bump actions/setup-node from 2.4.1 to 2.5.0 (#133)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-29 14:03:42 -08:00
dependabot[bot]
a5217eb799
Bump prettier from 2.4.1 to 2.5.0 (#132)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-29 14:03:34 -08:00
Paulus Schoutsen
cfd56b789f 5.3.0 2021-11-26 11:56:53 -08:00
Paulus Schoutsen
78cb70de53
Change default button label to "CONNECT" (#131) 2021-11-26 11:56:05 -08:00
dependabot[bot]
3a49857db3
Bump typescript from 4.4.4 to 4.5.2 (#128)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-22 17:22:44 -08:00
dependabot[bot]
f2008627ce
Bump rollup from 2.60.0 to 2.60.1 (#129)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-22 17:22:38 -08:00
Paulus Schoutsen
c184b5456b 5.2.1 2021-11-21 09:27:05 -08:00
Paulus Schoutsen
e0a8d753d4
Fix skip erase (#127) 2021-11-21 09:26:23 -08:00
Paulus Schoutsen
25eb15e1a2 5.2.0 2021-11-15 21:54:57 -08:00
Paulus Schoutsen
a8b75c89eb
Wait longer for Improv to respond after erase + install (#125) 2021-11-15 21:53:51 -08:00
dependabot[bot]
0a12525fb4
Bump rollup from 2.59.0 to 2.60.0 (#124)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-15 13:41:47 -08:00
Bram Kragten
e4f14746c9
Add color-scheme meta (#122) 2021-11-15 13:41:34 -08:00
Bram Kragten
f3cb744b4f
Show alert when opening serial port fails (#123) 2021-11-15 13:41:18 -08:00
Paulus Schoutsen
91169c1dfa
Set screenshot max width to 100% 2021-11-14 22:36:16 -08:00
Paulus Schoutsen
6f2bd27d16 website tweaks 2021-11-14 21:50:10 -08:00
Paulus Schoutsen
db78540213 More website tweaks 2021-11-14 21:42:33 -08:00
Paulus Schoutsen
b2cd8eaf4e Fix screenshot path 2021-11-14 10:11:57 -08:00
Paulus Schoutsen
a29b0c82da Update website 2021-11-14 10:02:52 -08:00
Paulus Schoutsen
34d73756b2 Update video 2021-11-14 09:38:55 -08:00
Paulus Schoutsen
27961ccbd4 5.1.0 2021-11-14 08:57:20 -08:00
Paulus Schoutsen
91dbdf86c1
Split out non-improv dashboard from install dialog (#120) 2021-11-14 08:56:33 -08:00
Antonio Vanegas
56b6cf1db7
CanAirIO project to Products section (#117)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-11-14 08:19:39 -08:00
Paulus Schoutsen
c0d52a4c2f Version 5.0.0 2021-11-11 21:05:11 -08:00
Paulus Schoutsen
89a3a4c54a
Upgrade to Improv Serial 2.0.0 (#116) 2021-11-11 21:04:07 -08:00
Paulus Schoutsen
ddbe525c99
Do not silently ignore errors not caused by user closing picker (#115) 2021-11-11 17:06:35 -08:00
Paulus Schoutsen
a8dc857f26
Install header + text align (#114) 2021-11-11 16:36:36 -08:00
Paulus Schoutsen
66540245c9 4.1.1 in index.html 2021-11-10 21:56:04 -08:00
Paulus Schoutsen
c33084d48a 4.1.1 2021-11-10 21:55:00 -08:00
Paulus Schoutsen
5e30f3bcd3
Add icons and rename logs (#106) 2021-11-10 21:54:28 -08:00
Paulus Schoutsen
4f2fa22a96 Update website for 4.1.0 2021-11-10 21:43:47 -08:00
Paulus Schoutsen
b81c1daf1e
Merge pull request #107 from esphome/update-builds 2021-11-10 21:42:20 -08:00
Paulus Schoutsen
f4a6d68837 Bump version to 4.1.0 2021-11-10 21:38:22 -08:00
Paulus Schoutsen
4c58f97981 Give ESP time to restart after write and disable button until initialized 2021-11-10 21:36:49 -08:00
Paulus Schoutsen
87c95de8f0 Only show 'Visit device URL' if we have a url 2021-11-10 21:36:19 -08:00
Paulus Schoutsen
2155ad6439 Remove accidentally committed new_install_skip_erase 2021-11-10 21:35:35 -08:00
Paulus Schoutsen
1a39400cfc Update builds to latest ESPHome 2021.12.0-dev 2021-11-10 21:35:11 -08:00
Paulus Schoutsen
3a90a3f3b6
Remove min width from button (#105) 2021-11-10 20:41:29 -08:00
Paulus Schoutsen
6e2976c229
Allow resetting data when firmware and version are the same (#103) 2021-11-10 20:35:15 -08:00
Paulus Schoutsen
1a18108a55
Bump improv-serial-sdk (#104) 2021-11-10 20:35:07 -08:00
Paulus Schoutsen
c0813275b0
Allow skipping erasing on new installations (#102) 2021-11-10 20:02:19 -08:00
Paulus Schoutsen
65b0fab0c5
Add support for Home Assistant domain in manifest (#101) 2021-11-10 17:10:02 -08:00
Paulus Schoutsen
eb4ebfa17b
Console updates (#99) 2021-11-10 17:07:01 -08:00
Paulus Schoutsen
971453d8a9 Update website with 4.0.2 2021-11-10 12:06:13 -08:00
Paulus Schoutsen
b89fc5c93a 4.0.2 2021-11-10 12:05:52 -08:00
Paulus Schoutsen
da4a7871e4
Finish sending commands with \r\n (#97) 2021-11-10 12:05:29 -08:00
Paulus Schoutsen
69eec42e7a
Offer setup device if device was not provisioned (#94) 2021-11-10 10:16:25 -08:00
Paulus Schoutsen
e63743bfba 4.0.1 2021-11-10 09:11:32 -08:00
Paulus Schoutsen
002b7367b8
Update README + website (#93) 2021-11-10 09:07:39 -08:00
Paulus Schoutsen
e8288b8425
Also fetch manifest property again (#92) 2021-11-10 09:02:04 -08:00
dependabot[bot]
a54682545b
Bump typescript from 4.3.5 to 4.4.4 (#77)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-09 23:54:03 -08:00
Paulus Schoutsen
74187d9f44
v4.0.0 - Next Gen (#87) 2021-11-09 23:50:18 -08:00
dependabot[bot]
8386598933
Bump serve from 12.0.1 to 13.0.2 (#89)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-08 20:44:32 -08:00
dependabot[bot]
db7533bfb8
Bump rollup from 2.58.3 to 2.59.0 (#86)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-01 21:30:17 -07:00
dependabot[bot]
88021be1c9
Bump @material/mwc-linear-progress from 0.25.2 to 0.25.3 (#80)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-31 20:37:21 -07:00
dependabot[bot]
fbbfe3e893
Bump @rollup/plugin-node-resolve from 13.0.5 to 13.0.6 (#81)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-25 15:14:33 -07:00
dependabot[bot]
9cbc26ae52
Bump rollup from 2.58.0 to 2.58.3 (#82)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-25 15:14:24 -07:00
dependabot[bot]
9747e03341
Bump @material/mwc-linear-progress from 0.25.1 to 0.25.2 (#79)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-18 14:48:44 -07:00
dependabot[bot]
45fcbb78bc
Bump @rollup/plugin-typescript from 8.2.5 to 8.3.0 (#78)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-18 14:48:38 -07:00
dependabot[bot]
60d52221d4
Bump lit from 2.0.0 to 2.0.2 (#76)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-11 20:28:15 -07:00
dependabot[bot]
8e52e766a2
Bump rollup from 2.57.0 to 2.58.0 (#75)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-04 14:10:37 -07:00
dependabot[bot]
34e90d31ca
Bump @rollup/plugin-node-resolve from 13.0.4 to 13.0.5 (#74)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-27 15:29:22 -07:00
dependabot[bot]
6d994cb6cf
Bump actions/setup-node from 2.4.0 to 2.4.1 (#71)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-27 15:28:43 -07:00
dependabot[bot]
c3bec8b0f2
Bump rollup from 2.56.3 to 2.57.0 (#70)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-27 15:28:36 -07:00
Paulus Schoutsen
f78b318f49
Upgrade material + Lit (#69) 2021-09-27 15:28:22 -07:00
dependabot[bot]
67efad4e4a
Bump prettier from 2.4.0 to 2.4.1 (#68)
Bumps [prettier](https://github.com/prettier/prettier) from 2.4.0 to 2.4.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.4.0...2.4.1)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-20 20:40:45 -07:00
dependabot[bot]
d909bb0466
Bump prettier from 2.3.2 to 2.4.0 (#64)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-13 21:46:28 -07:00
dependabot[bot]
0e3d7d04e2
Bump serve from 12.0.0 to 12.0.1 (#66)
Bumps [serve](https://github.com/vercel/serve) from 12.0.0 to 12.0.1.
- [Release notes](https://github.com/vercel/serve/releases)
- [Commits](https://github.com/vercel/serve/compare/12.0.0...12.0.1)

---
updated-dependencies:
- dependency-name: serve
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-13 21:46:17 -07:00
Paulus Schoutsen
e95f421db1
Update tsconfig.json 2021-08-30 20:36:37 -07:00
71 changed files with 10877 additions and 2446 deletions

View File

@ -4,9 +4,9 @@
"name": "Node.js & TypeScript",
"build": {
"dockerfile": "Dockerfile",
// Update 'VARIANT' to pick a Node version: 12, 14, 16
// Update 'VARIANT' to pick a Node version: 12, 14, 16, 18, 20
"args": {
"VARIANT": "16"
"VARIANT": "20"
}
},

View File

@ -1,3 +1,11 @@
categories:
- title: "Breaking Changes"
labels:
- "breaking change"
- title: "Dependencies"
collapse-after: 1
labels:
- "dependencies"
template: |
## What's Changed

View File

@ -14,9 +14,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Install jq tool
run: |
sudo apt-get update
sudo apt-get install jq
- name: Use Node.js
uses: actions/setup-node@v2.4.0
uses: actions/setup-node@v4
with:
node-version: 16
- run: npm ci

View File

@ -11,8 +11,12 @@ jobs:
publish-npm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2.4.0
- uses: actions/checkout@v4
- name: Install jq tool
run: |
sudo apt-get update
sudo apt-get install jq
- uses: actions/setup-node@v4
with:
node-version: 16
registry-url: https://registry.npmjs.org/

View File

@ -9,6 +9,6 @@ jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v5
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

201
LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

106
README.md
View File

@ -1,6 +1,6 @@
# ESP Web Tools
Allow flashing ESPHome or other ESP-based firmwares via the browser. Will automatically detect the board type and select a supported firmware.
Allow flashing ESPHome or other ESP-based firmwares via the browser. Will automatically detect the board type and select a supported firmware. [See website for full documentation.](https://esphome.github.io/esp-web-tools/)
```html
<esp-web-install-button
@ -8,111 +8,63 @@ Allow flashing ESPHome or other ESP-based firmwares via the browser. Will automa
></esp-web-install-button>
```
Manifest definition:
Example manifest:
```json
{
"name": "ESPHome",
"version": "2021.10.3",
"home_assistant_domain": "esphome",
"funding_url": "https://esphome.io/guides/supporters.html",
"builds": [
{
"chipFamily": "ESP32",
"improv": true,
"parts": [
{ "path": "bootloader.bin", "offset": 4096 },
{ "path": "bootloader_dout_40m.bin", "offset": 4096 },
{ "path": "partitions.bin", "offset": 32768 },
{ "path": "ota.bin", "offset": 57344 },
{ "path": "firmware.bin", "offset": 65536 }
{ "path": "boot_app0.bin", "offset": 57344 },
{ "path": "esp32.bin", "offset": 65536 }
]
},
{
"chipFamily": "ESP32-C3",
"parts": [
{ "path": "esp32-c3.bin", "offset": 0 },
{ "path": "bootloader_dout_40m.bin", "offset": 0 },
{ "path": "partitions.bin", "offset": 32768 },
{ "path": "boot_app0.bin", "offset": 57344 },
{ "path": "esp32-c3.bin", "offset": 65536 }
]
},
{
"chipFamily": "ESP32-S2",
"parts": [
{ "path": "esp32-s2.bin", "offset": 0 },
{ "path": "bootloader_dout_40m.bin", "offset": 4096 },
{ "path": "partitions.bin", "offset": 32768 },
{ "path": "boot_app0.bin", "offset": 57344 },
{ "path": "esp32-s2.bin", "offset": 65536 }
]
},
{
"chipFamily": "ESP32-S3",
"parts": [
{ "path": "bootloader_dout_40m.bin", "offset": 4096 },
{ "path": "partitions.bin", "offset": 32768 },
{ "path": "boot_app0.bin", "offset": 57344 },
{ "path": "esp32-s3.bin", "offset": 65536 }
]
},
{
"chipFamily": "ESP8266",
"parts": [
{ "path": "esp8266.bin", "offset": 0 },
{ "path": "esp8266.bin", "offset": 0 }
]
}
]
}
```
Allows for optionally passing an attribute to trigger an erase before installation.
```html
<esp-web-install-button
manifest="firmware_esphome/manifest.json"
erase-first
></esp-web-install-button>
```
All attributes can also be set via properties (`manifest`, `eraseFirst`)
## Styling
### Attributes
The following attributes are automatically added to `<esp-web-install-button>` and can be used for styling:
| Attribute | Description |
| -- | -- |
| `install-supported` | Added if installing firmware is supported
| `install-unsupported` | Added if installing firmware is not supported
| `active` | Added when flashing is active
You can add the following attributes or properties to change the UI elements:
| Attribute | Property | Description |
| -- | -- | -- |
| `show-log` | `showLog` | Show a log style view of the progress instead of a progress bar
| `hide-progress` | `hideProgress` | Hides all progress UI elements
### CSS custom properties (variables)
The following variables can be used to change the colors of the default UI elements:
- `--esp-tools-button-color`
- `--esp-tools-button-text-color`
- `--esp-tools-success-color`
- `--esp-tools-error-color`
- `--esp-tools-progress-color`
- `--esp-tools-log-background`
- `--esp-tools-log-text-color`
### Slots
The following slots are available:
| Slot name | Description |
| -- | -- |
| `activate` | Button to start the flash progress
| `unsupported` | Message to show when the browser is not supported
| `not-allowed` | Message to show when not a secure context
## Events
When the state of flashing changes, a `state-changed` event is fired.
A `state-changed` event contains the following information:
Field | Description
-- | --
state | The current [state](https://github.com/esphome/esp-web-tools/blob/main/src/const.ts)
message | A description of the current state
manifest | The loaded manifest
build | The manifest's build that was selected
chipFamily | The chip that was detected;&nbsp;"ESP32" \| "ESP8266" \| "ESP32-S2" \| "ESP32-C3" \| "Unknown Chip"
details | An optional extra field that is different [per state](https://github.com/esphome/esp-web-tools/blob/main/src/const.ts)
## Development
Run `script/develop`. This starts a server. Open it on http://localhost:5000.
Run `script/develop`. This starts a server. Open it on http://localhost:5001.
[![ESPHome - A project from the Open Home Foundation](https://www.openhomefoundation.org/badges/esphome.png)](https://www.openhomefoundation.org/)

View File

@ -1,3 +1,4 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
@ -33,6 +34,7 @@
name="twitter:image"
content="https://esphome.github.io/esp-web-tools/static/social.png"
/>
<meta name="color-scheme" content="dark light" />
<style>
body {
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI",
@ -46,31 +48,60 @@
margin: 0 auto;
padding: 12px;
}
.project .logo {
float: right;
h2 {
margin-top: 2em;
}
h3 {
margin-top: 1.5em;
}
.projects {
display: flex;
text-align: center;
flex-wrap: wrap;
gap: 24px;
justify-content: center;
}
.projects a {
color: initial;
text-decoration: none;
}
.project .logo img {
height: 50px;
}
.project .name {
margin-top: 8px;
}
a {
color: #03a9f4;
}
.screenshot {
text-align: center;
}
.screenshot img {
max-width: 100%;
box-shadow:
rgb(0 0 0 / 20%) 0px 2px 1px -1px,
rgb(0 0 0 / 14%) 0px 1px 1px 0px,
rgb(0 0 0 / 12%) 0px 1px 3px 0px;
border-radius: 4px;
}
.screenshot i {
margin-top: 4px;
display: block;
}
.videoWrapper {
position: relative;
padding-bottom: 56.25%; /* 16:9 */
height: 0;
margin-bottom: 25px;
background: #000;
background: #ccc;
}
.videoWrapper iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
.hidden {
display: none;
}
.content pre {
max-width: 100%;
display: block;
padding-left: 8px;
overflow-y: scroll;
}
.footer {
@ -90,13 +121,26 @@
padding: 8px;
border-bottom: 1px solid #ccc;
}
@media (prefers-color-scheme: dark) {
body {
background-color: #333;
color: #fff;
}
a {
color: #58a6ff;
}
}
</style>
<script
type="module"
src="https://unpkg.com/@justinribeiro/lite-youtube@1.4.0/lite-youtube.js"
></script>
<script module>
import(
// In development we import locally.
window.location.hostname === "localhost"
? "/dist/web/install-button.js"
: "https://unpkg.com/esp-web-tools@3.6.0/dist/web/install-button.js?module"
: "https://unpkg.com/esp-web-tools/dist/web/install-button.js?module"
);
</script>
</head>
@ -104,161 +148,334 @@
<div class="content">
<h1>ESP Web Tools</h1>
<p>
ESP Web Tools is a set of open source tools to allow working with ESP
devices in the browser.
<a href="https://github.com/esphome/esp-web-tools"
>The code is available on GitHub.</a
>
User friendly tools to manage ESP8266 and ESP32 devices in the browser:
</p>
<ul>
<li>Install &amp; update firmware</li>
<li>Connect device to the Wi-Fi network</li>
<li>Visit the device's hosted web interface</li>
<li>Access logs and send terminal commands</li>
<li>
Add devices to
<a href="https://www.home-assistant.io">Home Assistant</a>
</li>
</ul>
<div class="videoWrapper">
<lite-youtube
videoid="E8bdATqXM8c"
videotitle="ESP Web Tools in action"
></lite-youtube>
</div>
<h2 id="demo">Try a live demo</h2>
<p>
To try it out and install
<a href="https://esphome.io">the ESPHome firmware</a>, connect an ESP to
your computer and hit the button:
This demo will install
<a href="https://esphome.io">ESPHome</a>. To get started, connect an ESP
device to your computer and hit the button:
</p>
<esp-web-install-button
log-console
erase-first
manifest="static/firmware_build/manifest.json"
></esp-web-install-button>
<p>
<i>
Note, this only works in desktop Chrome and Edge. Android support
should be possible but has not been implemented yet. If you don't see
your ESP device, you might miss <a href="#drivers">drivers</a>.
manifest="https://firmware.esphome.io/esp-web-tools/manifest.json"
>
<i slot="unsupported">
The demo is not available because your browser does not support Web
Serial. Open this page in Google Chrome or Microsoft Edge instead<span
class="not-supported-i hidden"
>
(but not on your iOS device)</span
>.
</i>
</esp-web-install-button>
<h2 id="used-by">Products using ESP Web Tools</h2>
<div class="projects">
<a href="https://install.wled.me" target="_blank" class="project">
<div class="logo">
<img src="static/logos/wled.png" alt="WLED logo" />
</div>
<div class="name">WLED</div>
</a>
<a
href="https://arendst.github.io/Tasmota-firmware/"
target="_blank"
class="project"
>
<div class="logo">
<img src="static/logos/tasmota.svg" alt="Tasmota logo" />
</div>
<div class="name">Tasmota</div>
</a>
<a href="https://td-er.nl/ESPEasy/" target="_blank" class="project">
<div class="logo">
<img src="static/logos/espeasy.png" alt="ESPEasy logo" />
</div>
<div class="name">ESPEasy</div>
</a>
<a
href="https://canair.io/installer.html"
target="_blank"
class="project"
>
<div class="logo">
<img src="static/logos/canairio.png" alt="CanAirIO logo" />
</div>
<div class="name">CanAirIO</div>
</a>
<a href="https://web.esphome.io" target="_blank" class="project">
<div class="logo">
<img src="static/logos/esphome.svg" alt="ESPHome logo" />
</div>
<div class="name">ESPHome</div>
</a>
<a
href="https://sle118.github.io/squeezelite-esp32-installer/"
target="_blank"
class="project"
>
<div class="logo">
<img
src="static/logos/squeezelite-esp32.png"
alt="Squeezelite-ESP32 logo"
/>
</div>
<div class="name">Squeezelite-ESP32</div>
</a>
<a
href="https://2smart.com/docs-resources/platform-updates/platform-updates-13-07-2022"
target="_blank"
class="project"
>
<div class="logo">
<img src="static/logos/2smart.png" alt="2Smart logo" />
</div>
<div class="name">2Smart</div>
</a>
<a href="https://clockwise.page" target="_blank" class="project">
<div class="logo">
<img src="static/logos/clockwise.png" alt="Clockwise logo" />
</div>
<div class="name">Clockwise</div>
</a>
<a
href="https://sblantipodi.github.io/glow_worm_luciferin"
target="_blank"
class="project"
>
<div class="logo">
<img
src="static/logos/luciferin_logo.png"
alt="Firefly Luciferin logo"
/>
</div>
<div class="name">Luciferin</div>
</a>
<a
href="https://install.openepaperlink.de"
target="_blank"
class="project"
>
<div class="logo">
<img
src="static/logos/openepaperlink.png"
alt="OpenEpaperLink logo"
/>
</div>
<div class="name">OpenEpaperLink</div>
</a>
<a href="https://openspool.io" target="_blank" class="project">
<div class="logo">
<img src="static/logos/openspool.png" alt="OpenSpool logo" />
</div>
<div class="name">OpenSpool</div>
</a>
<a href="https://usetrmnl.com/flash" target="_blank" class="project">
<div class="logo">
<img src="static/logos/trmnl.png" alt="TRMNL logo" />
</div>
<div class="name">TRMNL</div>
</a>
<a href="https://nspanelmanager.com" target="_blank" class="project">
<div class="logo">
<img src="static/logos/nspanelmanager.svg" alt="NSPanelManager logo" />
</div>
<div class="name">NSPanel Manager</div>
</a>
</div>
<h2>How it works</h2>
<p>
ESP Web Tools works by combining
<a href="https://developer.mozilla.org/docs/Web/API/Web_Serial_API"
>Web Serial</a
>, <a href="https://www.improv-wifi.com/">Improv Wi-Fi</a> (optional),
and a manifest which describes the firmware. ESP Web Tools detects the
chipset of the connected ESP device and automatically selects the right
firmware variant from the manifest.
</p>
<p>
This works by combining
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API"
>Web Serial</a
>
with a manifest which describes the firmware. It will automatically
detect the type of the connected ESP device and find the right firmware
files in the manifest.
Web Serial is available in Google Chrome and Microsoft Edge
browsers<span class="not-supported-i hidden">
(but not on your iOS device)</span
>. Android support should be possible but has not been implemented yet.
</p>
<div class="videoWrapper">
<iframe
width="560"
height="315"
src="https://www.youtube-nocookie.com/embed/k88BS8zgWq0"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
</div>
<h2 id="used-by">Projects using ESP Web Tools</h2>
<div class="project">
<a href="https://wled.me" class="logo"
><img src="static/logos/wled.png" alt="WLED logo"
/></a>
<h3>WLED</h3>
<p>
A fast and feature-rich implementation of an ESP8266/ESP32 firmware to
control NeoPixel (WS2812B, WS2811, SK6812) LEDs or also SPI based
chipsets like the WS2801 and APA102.
</p>
<p>
<a href="https://install.wled.me" target="_blank"
>Installation Website</a
>
</p>
</div>
<div class="project">
<a href="https://tasmota.github.io" class="logo"
><img src="static/logos/tasmota.svg" alt="Tasmota logo"
/></a>
<h3>Tasmota</h3>
<p>
Alternative firmware for ESP8266 with easy configuration using webUI,
OTA updates, automation using timers or rules, expandability and
entirely local control over MQTT, HTTP, Serial or KNX.
</p>
<p>
<a href="https://arendst.github.io/Tasmota-firmware/" target="_blank"
>Installation Website</a
>
</p>
</div>
<div class="project">
<a href="http://www.espeasy.com/" class="logo"
><img src="static/logos/espeasy.png" alt="ESPEasy logo"
/></a>
<h3>ESPEasy</h3>
<p>Easy MultiSensor device based on ESP8266/ESP32.</p>
<p>
<a href="https://td-er.nl/ESPEasy/" target="_blank"
>Installation Website</a
>
</p>
</div>
<h3 id="improv">Configuring Wi-Fi</h3>
<p>
ESP Web Tools supports the
<a href="https://www.improv-wifi.com/serial"
>Improv Wi-Fi serial standard</a
>. This is an open standard to allow configuring Wi-Fi via the serial
port.
</p>
<p>
If the firmware supports Improv, a user will be asked to connect the
device to the network after installing the firmware. Once connected, the
device can send the user to a URL to finish configuration. For example,
this can be a link to the device's IP address where it serves a local
UI.
</p>
<p>
At any time in the future a user can use ESP Web Tools to find the
device link or to reconfigure the Wi-Fi settings without doing a
reinstall.
</p>
<p class="screenshot">
<img
src="./static/screenshots/dashboard.png"
alt="Screenshot showing ESP Web Tools dialog offering visting the device, adding it to Home Assistant, change Wi-Fi, show logs and console and reset data."
/>
<i>Screenshot showing the ESP Web Tools interface</i>
</p>
<h3 id="logs">Viewing logs & sending commands</h3>
<p>
ESP Web Tools allows users to open a serial console to see the logs and
send commands.
</p>
<p class="screenshot">
<img
src="./static/screenshots/logs.png"
alt="Screenshot showing ESP Web Tools dialog with a console showing ESPHome logs and a terminal prompt to sent commands."
/>
<i>Screenshot showing the ESP Web Tools logs & console</i>
</p>
<h2 id="add-website">Adding ESP Web Tools to your website</h2>
<p>
To add this to your own website, create a manifest and add the button to
your website. Make sure you update the manifest attribute to point at
your manifest.
To add this to your own website, you need to include the ESP Web Tools
JavaScript files on your website, create a manifest file and add the ESP
Web Tools button HTML.
</p>
<p>
You can import ESP Web Tools directly from the unpkg CDN or
<a href="https://unpkg.com/browse/esp-web-tools/dist/web/"
>download the files</a
<a href="https://github.com/balloob/squeezelite-esp32-install"
>Click here to see a full example.</a
>
and put them on your website.
</p>
<p>
<b>Step 1:</b> Load ESP Web Tools JavaScript on your website by adding
the following HTML snippet.
</p>
<pre>
&lt;script
type="module"
src="https://unpkg.com/esp-web-tools@3.6.0/dist/web/install-button.js?module"
>&lt;/script>
src="https://unpkg.com/esp-web-tools@10/dist/web/install-button.js?module"
>&lt;/script></pre
>
<p>
(If you prefer to locally host the JavaScript,
<a href="https://unpkg.com/browse/esp-web-tools/dist/web/"
>download it here</a
>)
</p>
<p>
<b>Step 2:</b> Find a place on your page where you want the button to
appear and include the following bit of HTML. Update the
<code>manifest</code> attribute to point at your manifest file.
</p>
<pre>
&lt;esp-web-install-button
manifest="static/firmware_build/manifest.json"
manifest="https://firmware.esphome.io/esp-web-tools/manifest.json"
>&lt;/esp-web-install-button></pre
>
<p>
Your website needs to be served over <code>https://</code>. If your
manifest is hosted on another server, make sure you configure
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS"
<b>Note:</b> ESP Web Tools requires that your website is served over
<code>https://</code> to work. This is a Web Serial security
requirement.
</p>
<p>
If your manifest or the firmware files are hosted on another server,
make sure you configure
<a href="https://developer.mozilla.org/docs/Web/HTTP/CORS"
>the CORS-headers</a
>
for your manifest and firmware files such that your website is allowed
to fetch those files by adding the header
such that your website is allowed to fetch those files by adding the
header
<code
>Access-Control-Allow-Origin: https://domain-of-your-website.com</code
>.
</p>
<p>
Add the attribute <code>erase-first</code> if you want to first fully
erase the ESP prior to installation.
ESP Web Tools can also be integrated in your projects by installing it
<a href="https://www.npmjs.com/package/esp-web-tools">via NPM</a>.
</p>
<h3 id="preparing-firmware">Preparing your firmware</h3>
<p>
If you have ESP32 firmware and are using ESP-IDF framework v4 or later,
you will need to create a merged version of your firmware before being
able to use it with ESP Web Tools. If you use ESP8266 or ESP32 with
ESP-IDF v3 or earlier, you can skip this section.
</p>
<p>
ESP Web Tools can also be integrated in your projects by installing it
via NPM:<br />
<code>npm install --save esp-web-tools</code>
ESP32 firmware is split into 4 different files. When these files are
installed using the command-line tool <code>esptool</code>, it will
patch flash frequency, flash size and flash mode to match the target
device. ESP Web Tools is not able to do this on the fly, so you will
need to use <code>esptool</code> to create the single binary file and
use that with ESP Web Tools.
</p>
<p>
Create a single binary using <code>esptool</code> with the following
command:
</p>
<pre>
esptool --chip esp32 merge_bin \
-o merged-firmware.bin \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0xe000 boot.bin \
0x10000 your_app.bin</pre
>
<p>
If your memory type is <code>opi_opi</code> or <code>opi_qspi</code>,
set your flash mode to be <code>dout</code>. Else, if your flash mode is
<code>qio</code> or <code>qout</code>, override your flash mode to be
<code>dio</code>.
</p>
<h3 id="manifest">Creating your manifest</h3>
<p>
ESP Web Tools manifest describe the firmware that you want to install.
It allows specifying different builds for the different types of ESP
devices. Current supported chip families are <code>ESP8266</code>,
<code>ESP32</code>, <code>ESP32-C3</code> and <code>ESP32-S2</code>. The
correct build will be automatically selected based on the type of the
ESP device we detect via the serial port.
Manifests describe the firmware that you want to offer the user to
install. It allows specifying different builds for the different types
of ESP devices. Current supported chip families are
<code>ESP8266</code>, <code>ESP32</code>, <code>ESP32-C2</code>,
<code>ESP32-C3</code>, <code>ESP32-C6</code>, <code>ESP32-H2</code>,
<code>ESP32-S2</code> and <code>ESP32-S3</code>. The correct build will
be automatically selected based on the type of the connected ESP device.
</p>
<pre>
{
"name": "ESPHome",
"version": "2021.11.0",
"home_assistant_domain": "esphome",
"funding_url": "https://esphome.io/guides/supporters.html",
"new_install_prompt_erase": false,
"builds": [
{
"chipFamily": "ESP32",
"improv": true,
"parts": [
{ "path": "bootloader.bin", "offset": 4096 },
{ "path": "partitions.bin", "offset": 32768 },
{ "path": "ota.bin", "offset": 57344 },
{ "path": "firmware.bin", "offset": 65536 }
{ "path": "merged-firmware.bin", "offset": 0 },
]
},
{
@ -271,35 +488,65 @@
}</pre
>
<p>
Each build contains a list of parts to be flashed to the ESP device.
Each build contains a list of parts to be installed to the ESP device.
Each part consists of a path to the file and an offset on the flash
where it should be installed. Part paths are resolved relative to the
path of the manifest, but can also be URLs to other hosts.
</p>
<p>
Each build also allows you to specify if it supports
<a href="https://www.improv-wifi.com">the Improv Wi-Fi standard</a>. If
it does, the user will be offered to configure the Wi-Fi after
installation is done as can be seen in the video below.
If your firmware is supported by Home Assistant, you can add the
optional key <code>home_assistant_domain</code>. If present, ESP Web
Tools will link the user to add this device to Home Assistant.
</p>
<div class="videoWrapper">
<iframe
width="560"
height="315"
src="https://www.youtube-nocookie.com/embed/k88BS8zgWq0?start=33"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
</div>
<p>
By default a new installation will erase all data before installation.
If you want to leave this choice to the user, set the optional manifest
key
<code>new_install_prompt_erase</code> to <code>true</code>. ESP Web
Tools offers users a new installation if it is unable to detect the
current firmware of the device (via Improv Serial) or if the detected
firmware does not match the name specififed in the manifest.
</p>
<p>
When a firmware is first installed on a device, it might need to do some
time consuming tasks like initializing the file system. By default ESP
Web Tools will wait 10 seconds to receive an Improv Serial response to
indicate that the boot is completed. You can increase this timeout by
setting the optional manifest key
<code>new_install_improv_wait_time</code> to the number of seconds to
wait. Set to <code>0</code> to disable Improv Serial detection.
</p>
<p>
If your product accepts donations you can add
<code>funding_url</code> to your manifest. This allows you to link to
your page explaining the user how they can fund development. This link
is visible in the ESP Web Tools menu when connected to a device running
your firmware (as detected via Improv).
</p>
<p>
ESP Web Tools allows you to provide your own check if the device is
running the same firmware as specified in the manifest. This check can
be setting the <code>overrides</code> property on
<code>&lt;esp-web-install-button&gt;</code>. The value is an object
containing a
<code>checkSameFirmware(manifest, improvInfo)</code> function. The
<code>manifest</code> parameter is your manifest and
<code>improvInfo</code> is the information returned from Improv:
<code>{ name, firmware, version, chipFamily }</code>. This check is only
called if the device firmware was detected via Improv.
</p>
<pre>
const button = document.querySelector('esp-web-install-button');
button.overrides = {
checkSameFirmware(manifest, improvInfo) {
const manifestFirmware = manifest.name.toLowerCase();
const deviceFirmware = improvInfo.firmware.toLowerCase();
return manifestFirmware.includes(deviceFirmware);
}
};</pre
>
<h3 id="customize">Customizing the look and feel</h3>
<p>
There are multiple options to change the look and feel of the button and
other elements.
</p>
<h4>Change colors</h4>
<p>
You can change the colors of the default UI elements with CSS custom
properties (variables), the following variables are available:
@ -307,14 +554,7 @@
<ul>
<li><code>--esp-tools-button-color</code></li>
<li><code>--esp-tools-button-text-color</code></li>
<li><code>--esp-tools-success-color</code></li>
<li><code>--esp-tools-error-color</code></li>
<li><code>--esp-tools-progress-color</code></li>
<li><code>--esp-tools-log-background</code></li>
<li><code>--esp-tools-log-text-color</code></li>
<li><code>--esp-tools-button-border-radius</code></li>
</ul>
<p>There are also some attributes that can be used for styling:</p>
<table>
@ -328,15 +568,7 @@
</td>
<td>Added if installing firmware is not supported</td>
</tr>
<tr>
<td><code>active</code></td>
<td>Added when flashing is active</td>
</tr>
</table>
<p>
When you are using a custom button, you should disable it when the
<code>active</code> attribute is present.
</p>
<h4>Replace the button and message with a custom one</h4>
<p>
You can replace both the activation button and the message that is shown
@ -346,9 +578,7 @@
</p>
<pre>
&lt;esp-web-install-button
manifest="static/firmware_build/manifest.json"
show-log
erase-first
manifest="https://firmware.esphome.io/esp-web-tools/manifest.json"
>
&lt;button slot="activate">Custom install button&lt;/button>
&lt;span slot="unsupported">Ah snap, your browser doesn't work!&lt;/span>
@ -356,126 +586,35 @@
&lt;/esp-web-install-button>
</pre
>
<h4>Show or hide the progress bar and log</h4>
<p>
By default there is a progress bar showing the state and progress of the
flashing progress, you can change this progress bar to a log view with
the <code>show-log</code> attribute.
</p>
<p>
You can also hide all progress indicators by adding the
<code>hide-progress</code>
attribute. This will hide both the progress bar and the log view. You
can then implement your own progress elements using the
<a href="#state-events">state events</a>.
</p>
<h3 id="state-events">State events</h3>
<p>
During the flash progress the button will fire
<code>state-changed</code> events for every step of the progress and to
signal progress in the writing.
</p>
<p>
With these events you can create your own progress UI or trigger certain
actions. You can also find the current state as the
<code>state</code> property of the
<code>esp-web-install-button</code> element.
</p>
<p>Events for the following states are fired:</p>
<ul>
<li>initializing</li>
<li>manifest</li>
<li>preparing</li>
<li>erasing</li>
<li>writing</li>
<li>finished</li>
<li>error</li>
</ul>
<p>
A <code>state-changed</code> event contains the following information:
</p>
<table>
<tr>
<td><code>state</code></td>
<td>The current state; one of the above</td>
</tr>
<tr>
<td><code>message</code></td>
<td>A description of the current state</td>
</tr>
<tr>
<td><code>manifest</code></td>
<td>The loaded manifest</td>
</tr>
<tr>
<td><code>build</code></td>
<td>The manifest's build that was selected</td>
</tr>
<tr>
<td><code>chipFamily</code></td>
<td>
The chip that was detected;
<code>"ESP32" | "ESP8266" | "ESP32-S2" | "Unknown Chip"</code>
</td>
</tr>
<tr>
<td><code>details</code></td>
<td>
An optional extra field that is different
<a
href="https://github.com/esphome/esp-web-tools/blob/main/src/const.ts"
>per state</a
>
</td>
</tr>
</table>
<p>An example that logs all state events:</p>
<pre>
&lt;esp-web-install-button
manifest="static/firmware_build/manifest.json"
>&lt;/esp-web-install-button>
&lt;script>
const espWebInstallButton = document.querySelector("esp-web-install-button");
espWebInstallButton.addEventListener(
"state-changed", (ev) => { console.log(ev.detail) }
);
&lt;/script>
</pre>
<h3 id="drivers">USB Serial Drivers</h3>
<p>
If the serial port is not showing up, your computer might be missing the
drivers for the USB serial chip used in your ESP device. These drivers
work for most ESP devices:
</p>
<ul>
<li>
CP2102 (square chip):
<a
href="https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers"
>driver</a
>
</li>
<li>
CH341:
<a
href="https://github.com/nodemcu/nodemcu-devkit/tree/master/Drivers"
>driver</a
>
</li>
</ul>
<h2>Why we created ESP Web Tools</h2>
<div class="videoWrapper">
<lite-youtube
videoid="6ZMXE5PXPqU"
videotitle="Why we created ESP Web Tools"
videoStartAt="1255"
></lite-youtube>
</div>
<div class="footer">
<div>
ESP Web Tools
<a href="https://github.com/esphome/esp-web-tools">GitHub</a>
</div>
<div class="initiative">
ESP Web Tools is a project by
<a href="https://esphome.io">ESPHome</a>.<br />
<a href="https://esphome.io">ESPHome</a>,
<a href="https://www.openhomefoundation.org">Open Home Foundation</a
>.<br />
Development is funded by
<a href="https://www.nabucasa.com">Nabu Casa</a>.
</div>
<div>
ESP Web Tools is
<a href="https://github.com/esphome/esp-web-tools">open source</a>.
</div>
</div>
</div>
<script>
if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {
document.querySelector(".not-supported-i").classList.remove("hidden");
}
</script>
</body>
</html>

8957
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +1,34 @@
{
"name": "esp-web-tools",
"version": "3.6.0",
"version": "10.1.0",
"description": "Web tools for ESP devices",
"main": "dist/install-button.js",
"repository": "https://github.com/esphome/web",
"repository": "https://github.com/esphome/esp-web-tools",
"author": "ESPHome maintainers",
"license": "Apache-2.0",
"scripts": {
"prepublishOnly": "script/build"
},
"devDependencies": {
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^13.0.0",
"@rollup/plugin-typescript": "^8.2.1",
"@types/w3c-web-serial": "^1.0.1",
"prettier": "^2.3.0",
"rollup": "^2.50.2",
"rollup-plugin-terser": "^7.0.2",
"serve": "^12.0.0",
"typescript": "^4.3.2"
"@babel/preset-env": "^7.26.0",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^28.0.2",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.0",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^12.1.2",
"@types/w3c-web-serial": "^1.0.7",
"prettier": "^3.4.2",
"rollup": "^4.29.1",
"serve": "^14.2.4",
"typescript": "^5.7.2"
},
"dependencies": {
"@material/mwc-linear-progress": "^0.22.1",
"esp-web-flasher": "^3.2.0",
"lit": "^2.0.0-rc.3",
"tslib": "^2.3.1"
"@material/web": "^2.2.0",
"esptool-js": "^0.5.3",
"improv-wifi-serial-sdk": "^2.5.0",
"lit": "^3.2.1",
"pako": "^2.1.0",
"tslib": "^2.8.1"
}
}

View File

@ -1,28 +0,0 @@
import { nodeResolve } from "@rollup/plugin-node-resolve";
import json from "@rollup/plugin-json";
import { terser } from "rollup-plugin-terser";
const config = {
input: "dist/install-button.js",
output: {
dir: "dist/web",
format: "module",
},
external: ["https://www.improv-wifi.com/sdk-js/launch-button.js"],
preserveEntrySignatures: false,
plugins: [nodeResolve(), json()],
};
if (process.env.NODE_ENV === "production") {
config.plugins.push(
terser({
ecma: 2019,
toplevel: true,
output: {
comments: false,
},
})
);
}
export default config;

51
rollup.config.mjs Normal file
View File

@ -0,0 +1,51 @@
import nodeResolve from "@rollup/plugin-node-resolve";
import json from "@rollup/plugin-json";
import terser from "@rollup/plugin-terser";
import babel from "@rollup/plugin-babel";
import commonjs from "@rollup/plugin-commonjs";
const config = {
input: "dist/install-button.js",
output: {
dir: "dist/web",
format: "module",
},
external: ["https://www.improv-wifi.com/sdk-js/launch-button.js"],
preserveEntrySignatures: false,
plugins: [
commonjs(),
nodeResolve({
browser: true,
preferBuiltins: false,
}),
babel({
babelHelpers: "bundled",
presets: [
[
"@babel/preset-env",
{
targets: {
// We use unpkg as CDN and it doesn't bundle modern syntax
chrome: "84",
},
},
],
],
}),
json(),
],
};
if (process.env.NODE_ENV === "production") {
config.plugins.push(
terser({
ecma: 2019,
toplevel: true,
format: {
comments: false,
},
})
);
}
export default config;

View File

@ -2,6 +2,7 @@
set -e
cd "$(dirname "$0")/.."
echo 'export const version =' `jq .version package.json`";" > src/version.ts
rm -rf dist
NODE_ENV=production npm exec -- tsc

View File

@ -1,6 +1,10 @@
# Stop on errors
set -e
if [ -z "$PORT" ]; then
PORT=5001
fi
cd "$(dirname "$0")/.."
rm -rf dist
@ -9,9 +13,8 @@ rm -rf dist
trap "kill 0" EXIT
# Run tsc once as rollup expects those files
tsc || true
npm exec -- tsc || true
npm exec -- serve &
npm exec -- serve -p "$PORT" &
npm exec -- tsc --watch &
npm exec -- rollup -c --watch &
wait
npm exec -- rollup -c --watch

View File

@ -0,0 +1,14 @@
import { Checkbox } from "@material/web/checkbox/internal/checkbox.js";
import { styles } from "@material/web/checkbox/internal/checkbox-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-checkbox": EwCheckbox;
}
}
export class EwCheckbox extends Checkbox {
static override styles = [styles];
}
customElements.define("ew-checkbox", EwCheckbox);

View File

@ -0,0 +1,14 @@
import { CircularProgress } from "@material/web/progress/internal/circular-progress.js";
import { styles } from "@material/web/progress/internal/circular-progress-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-circular-progress": EwCircularProgress;
}
}
export class EwCircularProgress extends CircularProgress {
static override styles = [styles];
}
customElements.define("ew-circular-progress", EwCircularProgress);

View File

@ -0,0 +1,14 @@
import { Dialog } from "@material/web/dialog/internal/dialog.js";
import { styles } from "@material/web/dialog/internal/dialog-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-dialog": EwDialog;
}
}
export class EwDialog extends Dialog {
static override styles = [styles];
}
customElements.define("ew-dialog", EwDialog);

View File

@ -0,0 +1,14 @@
import { Divider } from "@material/web/divider/internal/divider.js";
import { styles } from "@material/web/divider/internal/divider-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-divider": EwDivider;
}
}
export class EwDivider extends Divider {
static override styles = [styles];
}
customElements.define("ew-divider", EwDivider);

View File

@ -0,0 +1,15 @@
import { FilledSelect } from "@material/web/select/internal/filled-select.js";
import { styles } from "@material/web/select/internal/filled-select-styles.js";
import { styles as sharedStyles } from "@material/web/select/internal/shared-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-filled-select": EwFilledSelect;
}
}
export class EwFilledSelect extends FilledSelect {
static override styles = [sharedStyles, styles];
}
customElements.define("ew-filled-select", EwFilledSelect);

View File

@ -0,0 +1,17 @@
import { styles as filledStyles } from "@material/web/textfield/internal/filled-styles.js";
import { FilledTextField } from "@material/web/textfield/internal/filled-text-field.js";
import { styles as sharedStyles } from "@material/web/textfield/internal/shared-styles.js";
import { literal } from "lit/static-html.js";
declare global {
interface HTMLElementTagNameMap {
"ew-filled-text-field": EwFilledTextField;
}
}
export class EwFilledTextField extends FilledTextField {
static override styles = [sharedStyles, filledStyles];
protected override readonly fieldTag = literal`md-filled-field`;
}
customElements.define("ew-filled-text-field", EwFilledTextField);

View File

@ -0,0 +1,15 @@
import { IconButton } from "@material/web/iconbutton/internal/icon-button.js";
import { styles as sharedStyles } from "@material/web/iconbutton/internal/shared-styles.js";
import { styles } from "@material/web/iconbutton/internal/standard-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-icon-button": EwIconButton;
}
}
export class EwIconButton extends IconButton {
static override styles = [sharedStyles, styles];
}
customElements.define("ew-icon-button", EwIconButton);

View File

@ -0,0 +1,14 @@
import { ListItemEl as ListItem } from "@material/web/list/internal/listitem/list-item.js";
import { styles } from "@material/web/list/internal/listitem/list-item-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-list-item": EwListItem;
}
}
export class EwListItem extends ListItem {
static override styles = [styles];
}
customElements.define("ew-list-item", EwListItem);

14
src/components/ew-list.ts Normal file
View File

@ -0,0 +1,14 @@
import { List } from "@material/web/list/internal/list.js";
import { styles } from "@material/web/list/internal/list-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-list": EwList;
}
}
export class EwList extends List {
static override styles = [styles];
}
customElements.define("ew-list", EwList);

View File

@ -0,0 +1,14 @@
import { styles } from "@material/web/menu/internal/menuitem/menu-item-styles.js";
import { SelectOptionEl } from "@material/web/select/internal/selectoption/select-option.js";
declare global {
interface HTMLElementTagNameMap {
"ew-select-option": EwSelectOption;
}
}
export class EwSelectOption extends SelectOptionEl {
static override styles = [styles];
}
customElements.define("ew-select-option", EwSelectOption);

View File

@ -0,0 +1,15 @@
import { styles as sharedStyles } from "@material/web/button/internal/shared-styles.js";
import { TextButton } from "@material/web/button/internal/text-button.js";
import { styles as textStyles } from "@material/web/button/internal/text-styles.js";
declare global {
interface HTMLElementTagNameMap {
"ew-text-button": EwTextButton;
}
}
export class EwTextButton extends TextButton {
static override styles = [sharedStyles, textStyles];
}
customElements.define("ew-text-button", EwTextButton);

View File

@ -0,0 +1,167 @@
import { ColoredConsole, coloredConsoleStyles } from "../util/console-color";
import { sleep } from "../util/sleep";
import { LineBreakTransformer } from "../util/line-break-transformer";
import { TimestampTransformer } from "../util/timestamp-transformer";
import { Logger } from "../const";
export class EwtConsole extends HTMLElement {
public port!: SerialPort;
public logger!: Logger;
public allowInput = true;
private _console?: ColoredConsole;
private _cancelConnection?: () => Promise<void>;
public logs(): string {
return this._console?.logs() || "";
}
public connectedCallback() {
if (this._console) {
return;
}
const shadowRoot = this.attachShadow({ mode: "open" });
shadowRoot.innerHTML = `
<style>
:host, input {
background-color: #1c1c1c;
color: #ddd;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier,
monospace;
line-height: 1.45;
display: flex;
flex-direction: column;
}
form {
display: flex;
align-items: center;
padding: 0 8px 0 16px;
}
input {
flex: 1;
padding: 4px;
margin: 0 8px;
border: 0;
outline: none;
}
${coloredConsoleStyles}
</style>
<div class="log"></div>
${
this.allowInput
? `<form>
>
<input autofocus>
</form>
`
: ""
}
`;
this._console = new ColoredConsole(this.shadowRoot!.querySelector("div")!);
if (this.allowInput) {
const input = this.shadowRoot!.querySelector("input")!;
this.addEventListener("click", () => {
// Only focus input if user didn't select some text
if (getSelection()?.toString() === "") {
input.focus();
}
});
input.addEventListener("keydown", (ev) => {
if (ev.key === "Enter") {
ev.preventDefault();
ev.stopPropagation();
this._sendCommand();
}
});
}
const abortController = new AbortController();
const connection = this._connect(abortController.signal);
this._cancelConnection = () => {
abortController.abort();
return connection;
};
}
private async _connect(abortSignal: AbortSignal) {
this.logger.debug("Starting console read loop");
try {
await this.port
.readable!.pipeThrough(new TextDecoderStream(), {
signal: abortSignal,
})
.pipeThrough(new TransformStream(new LineBreakTransformer()))
.pipeThrough(new TransformStream(new TimestampTransformer()))
.pipeTo(
new WritableStream({
write: (chunk) => {
this._console!.addLine(chunk.replace("\r", ""));
},
}),
);
if (!abortSignal.aborted) {
this._console!.addLine("");
this._console!.addLine("");
this._console!.addLine("Terminal disconnected");
}
} catch (e) {
this._console!.addLine("");
this._console!.addLine("");
this._console!.addLine(`Terminal disconnected: ${e}`);
} finally {
await sleep(100);
this.logger.debug("Finished console read loop");
}
}
private async _sendCommand() {
const input = this.shadowRoot!.querySelector("input")!;
const command = input.value;
const encoder = new TextEncoder();
const writer = this.port.writable!.getWriter();
await writer.write(encoder.encode(command + "\r\n"));
this._console!.addLine(`> ${command}\r\n`);
input.value = "";
input.focus();
try {
writer.releaseLock();
} catch (err) {
console.error("Ignoring release lock error", err);
}
}
public async disconnect() {
if (this._cancelConnection) {
await this._cancelConnection();
this._cancelConnection = undefined;
}
}
public async reset() {
this.logger.debug("Triggering reset");
await this.port.setSignals({
dataTerminalReady: false,
requestToSend: true,
});
await sleep(250);
await this.port.setSignals({
dataTerminalReady: false,
requestToSend: false,
});
await sleep(250);
await new Promise((resolve) => setTimeout(resolve, 1000));
}
}
customElements.define("ewt-console", EwtConsole);
declare global {
interface HTMLElementTagNameMap {
"ewt-console": EwtConsole;
}
}

View File

@ -0,0 +1,22 @@
import { DialogBase } from "@material/mwc-dialog/mwc-dialog-base";
import { styles } from "@material/mwc-dialog/mwc-dialog.css";
import { css } from "lit";
declare global {
interface HTMLElementTagNameMap {
"ewt-dialog": EwtDialog;
}
}
export class EwtDialog extends DialogBase {
static override styles = [
styles,
css`
.mdc-dialog__title {
padding-right: 52px;
}
`,
];
}
customElements.define("ewt-dialog", EwtDialog);

61
src/components/svg.ts Normal file
View File

@ -0,0 +1,61 @@
import { svg } from "lit";
export const closeIcon = svg`
<svg width="24" height="24" viewBox="0 0 24 24">
<path
fill="currentColor"
d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"
/>
</svg>
`;
export const refreshIcon = svg`
<svg viewBox="0 0 24 24">
<path
fill="currentColor"
d="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z"
/>
</svg>
`;
export const listItemInstallIcon = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z" />
</svg>
`;
export const listItemWifi = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z" />
</svg>
`;
export const listItemConsole = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="M20,19V7H4V19H20M20,3A2,2 0 0,1 22,5V19A2,2 0 0,1 20,21H4A2,2 0 0,1 2,19V5C2,3.89 2.9,3 4,3H20M13,17V15H18V17H13M9.58,13L5.57,9H8.4L11.7,12.3C12.09,12.69 12.09,13.33 11.7,13.72L8.42,17H5.59L9.58,13Z" />
</svg>
`;
export const listItemVisitDevice = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
`;
export const listItemHomeAssistant = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="m12.151 1.5882c-.3262 0-.6523.1291-.8996.3867l-8.3848 8.7354c-.0619.0644-.1223.1368-.1807.2154-.0588.0789-.1151.1638-.1688.2534-.2593.4325-.4552.9749-.5232 1.4555-.0026.018-.0076.0369-.0094.0548-.0121.0987-.0184.1944-.0184.2857v8.0124a1.2731 1.2731 0 001.2731 1.2731h7.8313l-3.4484-3.593a1.7399 1.7399 0 111.0803-1.125l2.6847 2.7972v-10.248a1.7399 1.7399 0 111.5276-0v7.187l2.6702-2.782a1.7399 1.7399 0 111.0566 1.1505l-3.7269 3.8831v2.7299h8.174a1.2471 1.2471 0 001.2471-1.2471v-8.0375c0-.0912-.0059-.1868-.0184-.2855-.0603-.4935-.2636-1.0617-.5326-1.5105-.0537-.0896-.1101-.1745-.1684-.253-.0588-.079-.1191-.1513-.181-.2158l-8.3848-8.7363c-.2473-.2577-.5735-.3866-.8995-.3864" />
</svg>
`;
export const listItemEraseUserData = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="M15,14C17.67,14 23,15.33 23,18V20H7V18C7,15.33 12.33,14 15,14M15,12A4,4 0 0,1 11,8A4,4 0 0,1 15,4A4,4 0 0,1 19,8A4,4 0 0,1 15,12M5,9.59L7.12,7.46L8.54,8.88L6.41,11L8.54,13.12L7.12,14.54L5,12.41L2.88,14.54L1.46,13.12L3.59,11L1.46,8.88L2.88,7.46L5,9.59Z" />
</svg>
`;
export const listItemFundDevelopment = svg`
<svg slot="start" viewBox="0 0 24 24">
<path d="M12,21.35L10.55,20.03C5.4,15.36 2,12.27 2,8.5C2,5.41 4.42,3 7.5,3C9.24,3 10.91,3.81 12,5.08C13.09,3.81 14.76,3 16.5,3C19.58,3 22,5.41 22,8.5C22,12.27 18.6,15.36 13.45,20.03L12,21.35Z" />
</svg>
`;

42
src/connect.ts Normal file
View File

@ -0,0 +1,42 @@
import type { InstallButton } from "./install-button.js";
export const connect = async (button: InstallButton) => {
import("./install-dialog.js");
let port: SerialPort | undefined;
try {
port = await navigator.serial.requestPort();
} catch (err: any) {
if ((err as DOMException).name === "NotFoundError") {
import("./no-port-picked/index").then((mod) =>
mod.openNoPortPickedDialog(() => connect(button)),
);
return;
}
alert(`Error: ${err.message}`);
return;
}
if (!port) {
return;
}
try {
await port.open({ baudRate: 115200 });
} catch (err: any) {
alert(err.message);
return;
}
const el = document.createElement("ewt-install-dialog");
el.port = port;
el.manifestPath = button.manifest || button.getAttribute("manifest")!;
el.overrides = button.overrides;
el.addEventListener(
"closed",
() => {
port!.close();
},
{ once: true },
);
document.body.appendChild(el);
};

View File

@ -1,6 +1,19 @@
export interface Logger {
log(msg: string, ...args: any[]): void;
error(msg: string, ...args: any[]): void;
debug(msg: string, ...args: any[]): void;
}
export interface Build {
chipFamily: "ESP32" | "ESP8266" | "ESP32-S2" | "ESP32-C3";
improv: boolean;
chipFamily:
| "ESP32"
| "ESP32-C2"
| "ESP32-C3"
| "ESP32-C6"
| "ESP32-H2"
| "ESP32-S2"
| "ESP32-S3"
| "ESP8266";
parts: {
path: string;
offset: number;
@ -9,11 +22,19 @@ export interface Build {
export interface Manifest {
name: string;
version: string;
home_assistant_domain?: string;
funding_url?: string;
/** @deprecated use `new_install_prompt_erase` instead */
new_install_skip_erase?: boolean;
new_install_prompt_erase?: boolean;
/* Time to wait to detect Improv Wi-Fi. Set to 0 to disable. */
new_install_improv_wait_time?: number;
builds: Build[];
}
export interface BaseFlashState {
state: State;
state: FlashStateType;
message: string;
manifest?: Manifest;
build?: Build;
@ -21,51 +42,44 @@ export interface BaseFlashState {
}
export interface InitializingState extends BaseFlashState {
state: State.INITIALIZING;
details: { done: boolean };
}
export interface ManifestState extends BaseFlashState {
state: State.MANIFEST;
state: FlashStateType.INITIALIZING;
details: { done: boolean };
}
export interface PreparingState extends BaseFlashState {
state: State.PREPARING;
state: FlashStateType.PREPARING;
details: { done: boolean };
}
export interface ErasingState extends BaseFlashState {
state: State.ERASING;
state: FlashStateType.ERASING;
details: { done: boolean };
}
export interface WritingState extends BaseFlashState {
state: State.WRITING;
state: FlashStateType.WRITING;
details: { bytesTotal: number; bytesWritten: number; percentage: number };
}
export interface FinishedState extends BaseFlashState {
state: State.FINISHED;
state: FlashStateType.FINISHED;
}
export interface ErrorState extends BaseFlashState {
state: State.ERROR;
state: FlashStateType.ERROR;
details: { error: FlashError; details: string | Error };
}
export type FlashState =
| InitializingState
| ManifestState
| PreparingState
| ErasingState
| WritingState
| FinishedState
| ErrorState;
export const enum State {
export const enum FlashStateType {
INITIALIZING = "initializing",
MANIFEST = "manifest",
PREPARING = "preparing",
ERASING = "erasing",
WRITING = "writing",

View File

@ -1,138 +0,0 @@
import { css, html, HTMLTemplateResult, LitElement } from "lit";
import { customElement, state } from "lit/decorators.js";
import { classMap } from "lit/directives/class-map.js";
import { FlashState, State } from "./const";
interface Row {
state?: State;
message: HTMLTemplateResult | string;
error?: boolean;
action?: boolean;
}
@customElement("esp-web-flash-log")
export class FlashLog extends LitElement {
@state() private _rows: Row[] = [];
protected render() {
return html`${this._rows.map(
(row) =>
html`<div
class=${classMap({
error: row.error === true,
action: row.action === true,
})}
>
${row.message}
</div>`
)}`;
}
public willUpdate() {
this.toggleAttribute("hidden", !this._rows.length);
}
public clear() {
this._rows = [];
}
public processState(state: FlashState) {
if (state.state === State.ERROR) {
this.addError(state.message);
return;
}
this.addRow(state);
if (state.state === State.FINISHED) {
this.addAction(
html`<button @click=${this.clear}>Close this log</button>`
);
}
}
/**
* Add or replace a row.
*/
public addRow(row: Row) {
// If last entry has same ID, replace it.
if (
row.state &&
this._rows.length > 0 &&
this._rows[this._rows.length - 1].state === row.state
) {
const newRows = this._rows.slice(0, -1);
newRows.push(row);
this._rows = newRows;
} else {
this._rows = [...this._rows, row];
}
}
/**
* Add an error row
*/
public addError(message: Row["message"]) {
this.addRow({ message, error: true });
}
/**
* Add an action row
*/
public addAction(message: Row["message"]) {
this.addRow({ message, action: true });
}
/**
* Remove last row if state matches
*/
public removeRow(state: string) {
if (
this._rows.length > 0 &&
this._rows[this._rows.length - 1].state === state
) {
this._rows = this._rows.slice(0, -1);
}
}
static styles = css`
:host {
display: block;
margin-top: 16px;
padding: 12px 16px;
font-family: monospace;
background: var(--esp-tools-log-background, black);
color: var(--esp-tools-log-text-color, greenyellow);
font-size: 14px;
line-height: 19px;
}
:host([hidden]) {
display: none;
}
button {
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
text-align: left;
text-decoration: underline;
cursor: pointer;
}
.error {
color: var(--esp-tools-error-color, #dc3545);
}
.error,
.action {
margin-top: 1em;
}
`;
}
declare global {
interface HTMLElementTagNameMap {
"esp-web-flash-log": FlashLog;
}
}

View File

@ -1,88 +0,0 @@
import { css, html, LitElement } from "lit";
import { customElement, state } from "lit/decorators.js";
import { FlashState, State } from "./const";
import "@material/mwc-linear-progress";
import { classMap } from "lit/directives/class-map.js";
@customElement("esp-web-flash-progress")
export class FlashProgress extends LitElement {
@state() private _state?: FlashState;
@state() private _indeterminate = true;
@state() private _progress = 0;
public processState(state: FlashState) {
this._state = state;
if (this._state.state === State.WRITING) {
this._indeterminate = false;
this._progress = this._state.details.percentage / 100;
}
if (this._state.state === State.ERROR) {
this._indeterminate = false;
}
}
public clear() {
this._state = undefined;
this._progress = 0;
this._indeterminate = true;
}
protected render() {
if (!this._state) {
return;
}
return html`<h2
class=${classMap({
error: this._state.state === State.ERROR,
done: this._state.state === State.FINISHED,
})}
>
${this._state.message}
</h2>
<p>
${this._state.manifest
? html`${this._state.manifest.name}: ${this._state.chipFamily}`
: html`&nbsp;`}
</p>
<mwc-linear-progress
class=${classMap({
error: this._state.state === State.ERROR,
done: this._state.state === State.FINISHED,
})}
.indeterminate=${this._indeterminate}
.progress=${this._progress}
></mwc-linear-progress>`;
}
static styles = css`
:host {
display: block;
--mdc-theme-primary: var(--esp-tools-progress-color, #03a9f4);
}
.error {
color: var(--esp-tools-error-color, #dc3545);
--mdc-theme-primary: var(--esp-tools-error-color, #dc3545);
}
.done {
color: var(--esp-tools-success-color, #28a745);
--mdc-theme-primary: var(--esp-tools-success-color, #28a745);
}
mwc-linear-progress {
text-align: left;
}
h2 {
margin: 16px 0 0;
}
p {
margin: 4px 0;
}
`;
}
declare global {
interface HTMLElementTagNameMap {
"esp-web-flash-progress": FlashProgress;
}
}

View File

@ -1,221 +1,213 @@
import { connect, ESPLoader, Logger } from "esp-web-flasher";
import { Build, FlashError, FlashState, Manifest, State } from "./const";
import { fireEvent, getChipFamilyName, sleep } from "./util";
import { Transport, ESPLoader } from "esptool-js";
import {
Build,
FlashError,
FlashState,
Manifest,
FlashStateType,
} from "./const";
import { hardReset } from "./util/reset";
export const flash = async (
eventTarget: EventTarget,
logger: Logger,
onEvent: (state: FlashState) => void,
port: SerialPort,
manifestPath: string,
eraseFirst: boolean
manifest: Manifest,
eraseFirst: boolean,
) => {
let manifest: Manifest;
let build: Build | undefined;
let chipFamily: ReturnType<typeof getChipFamilyName>;
let chipFamily: Build["chipFamily"];
const fireStateEvent = (stateUpdate: FlashState) => {
fireEvent(eventTarget, "state-changed", {
const fireStateEvent = (stateUpdate: FlashState) =>
onEvent({
...stateUpdate,
manifest,
build,
chipFamily,
});
};
const manifestURL = new URL(manifestPath, location.toString()).toString();
const manifestProm = fetch(manifestURL).then(
(resp): Promise<Manifest> => resp.json()
);
let esploader: ESPLoader | undefined;
try {
esploader = await connect(logger);
} catch (err) {
// User pressed cancel on web serial
return;
}
const transport = new Transport(port);
const esploader = new ESPLoader({
transport,
baudrate: 115200,
romBaudrate: 115200,
enableTracing: false,
});
// For debugging
(window as any).esploader = esploader;
fireStateEvent({
state: State.INITIALIZING,
state: FlashStateType.INITIALIZING,
message: "Initializing...",
details: { done: false },
});
try {
await esploader.initialize();
} catch (err) {
logger.error(err);
if (esploader.connected) {
fireStateEvent({
state: State.ERROR,
message:
"Failed to initialize. Try resetting your device or holding the BOOT button while selecting your serial port.",
details: { error: FlashError.FAILED_INITIALIZING, details: err },
});
await esploader.disconnect();
}
await esploader.main();
await esploader.flashId();
} catch (err: any) {
console.error(err);
fireStateEvent({
state: FlashStateType.ERROR,
message:
"Failed to initialize. Try resetting your device or holding the BOOT button while clicking INSTALL.",
details: { error: FlashError.FAILED_INITIALIZING, details: err },
});
await hardReset(transport);
await transport.disconnect();
return;
}
chipFamily = getChipFamilyName(esploader);
chipFamily = esploader.chip.CHIP_NAME as any;
fireStateEvent({
state: State.INITIALIZING,
state: FlashStateType.INITIALIZING,
message: `Initialized. Found ${chipFamily}`,
details: { done: true },
});
fireStateEvent({
state: State.MANIFEST,
message: "Fetching manifest...",
details: { done: false },
});
try {
manifest = await manifestProm;
} catch (err) {
fireStateEvent({
state: State.ERROR,
message: `Unable to fetch manifest: ${err.message}`,
details: { error: FlashError.FAILED_MANIFEST_FETCH, details: err },
});
await esploader.disconnect();
return;
}
build = manifest.builds.find((b) => b.chipFamily === chipFamily);
fireStateEvent({
state: State.MANIFEST,
message: `Found manifest for ${manifest.name}`,
details: { done: true },
});
if (!build) {
fireStateEvent({
state: State.ERROR,
state: FlashStateType.ERROR,
message: `Your ${chipFamily} board is not supported.`,
details: { error: FlashError.NOT_SUPPORTED, details: chipFamily },
});
await esploader.disconnect();
await hardReset(transport);
await transport.disconnect();
return;
}
fireStateEvent({
state: State.PREPARING,
state: FlashStateType.PREPARING,
message: "Preparing installation...",
details: { done: false },
});
const manifestURL = new URL(manifestPath, location.toString()).toString();
const filePromises = build.parts.map(async (part) => {
const url = new URL(part.path, manifestURL).toString();
const resp = await fetch(url);
if (!resp.ok) {
throw new Error(
`Downlading firmware ${part.path} failed: ${resp.status}`
`Downlading firmware ${part.path} failed: ${resp.status}`,
);
}
return resp.arrayBuffer();
const reader = new FileReader();
const blob = await resp.blob();
return new Promise<string>((resolve) => {
reader.addEventListener("load", () => resolve(reader.result as string));
reader.readAsBinaryString(blob);
});
});
// Run the stub while we wait for files to download
const espStub = await esploader.runStub();
const files: ArrayBuffer[] = [];
const fileArray: Array<{ data: string; address: number }> = [];
let totalSize = 0;
for (const prom of filePromises) {
for (let part = 0; part < filePromises.length; part++) {
try {
const data = await prom;
files.push(data);
totalSize += data.byteLength;
} catch (err) {
const data = await filePromises[part];
fileArray.push({ data, address: build.parts[part].offset });
totalSize += data.length;
} catch (err: any) {
fireStateEvent({
state: State.ERROR,
message: err,
details: { error: FlashError.FAILED_FIRMWARE_DOWNLOAD, details: err },
state: FlashStateType.ERROR,
message: err.message,
details: {
error: FlashError.FAILED_FIRMWARE_DOWNLOAD,
details: err.message,
},
});
await esploader.disconnect();
await hardReset(transport);
await transport.disconnect();
return;
}
}
fireStateEvent({
state: State.PREPARING,
state: FlashStateType.PREPARING,
message: "Installation prepared",
details: { done: true },
});
if (eraseFirst) {
fireStateEvent({
state: State.ERASING,
state: FlashStateType.ERASING,
message: "Erasing device...",
details: { done: false },
});
await espStub.eraseFlash();
await esploader.eraseFlash();
fireStateEvent({
state: State.ERASING,
state: FlashStateType.ERASING,
message: "Device erased",
details: { done: true },
});
}
let lastPct = 0;
fireStateEvent({
state: State.WRITING,
message: `Writing progress: ${lastPct}%`,
state: FlashStateType.WRITING,
message: `Writing progress: 0%`,
details: {
bytesTotal: totalSize,
bytesWritten: 0,
percentage: lastPct,
percentage: 0,
},
});
let totalWritten = 0;
for (const part of build.parts) {
const file = files.shift()!;
try {
await espStub.flashData(
file,
(bytesWritten: number) => {
const newPct = Math.floor(
((totalWritten + bytesWritten) / totalSize) * 100
);
if (newPct === lastPct) {
return;
}
lastPct = newPct;
fireStateEvent({
state: State.WRITING,
message: `Writing progress: ${newPct}%`,
details: {
bytesTotal: totalSize,
bytesWritten: totalWritten + bytesWritten,
percentage: newPct,
},
});
},
part.offset,
true
);
} catch (err) {
fireStateEvent({
state: State.ERROR,
message: err,
details: { error: FlashError.WRITE_FAILED, details: err },
});
await esploader.disconnect();
return;
}
totalWritten += file.byteLength;
try {
await esploader.writeFlash({
fileArray,
flashSize: "keep",
flashMode: "keep",
flashFreq: "keep",
eraseAll: false,
compress: true,
// report progress
reportProgress: (fileIndex: number, written: number, total: number) => {
const uncompressedWritten =
(written / total) * fileArray[fileIndex].data.length;
const newPct = Math.floor(
((totalWritten + uncompressedWritten) / totalSize) * 100,
);
// we're done with this file
if (written === total) {
totalWritten += uncompressedWritten;
return;
}
fireStateEvent({
state: FlashStateType.WRITING,
message: `Writing progress: ${newPct}%`,
details: {
bytesTotal: totalSize,
bytesWritten: totalWritten + written,
percentage: newPct,
},
});
},
});
} catch (err: any) {
fireStateEvent({
state: FlashStateType.ERROR,
message: err.message,
details: { error: FlashError.WRITE_FAILED, details: err },
});
await hardReset(transport);
await transport.disconnect();
return;
}
fireStateEvent({
state: State.WRITING,
state: FlashStateType.WRITING,
message: "Writing complete",
details: {
bytesTotal: totalSize,
@ -224,12 +216,13 @@ export const flash = async (
},
});
await sleep(100);
await esploader.hardReset();
await esploader.disconnect();
await hardReset(transport);
console.log("DISCONNECT");
await transport.disconnect();
fireStateEvent({
state: State.FINISHED,
state: FlashStateType.FINISHED,
message: "All done!",
});
};

View File

@ -1,4 +1,6 @@
import { FlashState } from "./const";
import type { FlashState } from "./const";
import type { EwtInstallDialog } from "./install-dialog";
import { connect } from "./connect";
export class InstallButton extends HTMLElement {
public static isSupported = "serial" in navigator;
@ -10,12 +12,12 @@ export class InstallButton extends HTMLElement {
position: relative;
cursor: pointer;
font-size: 14px;
padding: 8px 28px;
font-weight: 500;
padding: 10px 24px;
color: var(--esp-tools-button-text-color, #fff);
background-color: var(--esp-tools-button-color, #03a9f4);
border: none;
border-radius: 4px;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2);
border-radius: var(--esp-tools-button-border-radius, 9999px);
}
button::before {
content: " ";
@ -25,10 +27,7 @@ export class InstallButton extends HTMLElement {
left: 0;
right: 0;
opacity: 0.2;
border-radius: 4px;
}
button:hover {
box-shadow: 0 4px 8px 0 rgba(0,0,0,.14), 0 1px 7px 0 rgba(0,0,0,.12), 0 3px 1px -1px rgba(0,0,0,.2);
border-radius: var(--esp-tools-button-border-radius, 9999px);
}
button:hover::before {
background-color: rgba(255,255,255,.8);
@ -49,10 +48,6 @@ export class InstallButton extends HTMLElement {
cursor: unset;
pointer-events: none;
}
improv-wifi-launch-button {
display: block;
margin-top: 16px;
}
.hidden {
display: none;
}`;
@ -71,9 +66,7 @@ export class InstallButton extends HTMLElement {
public renderRoot?: ShadowRoot;
public static preload() {
import("./start-flash");
}
public overrides: EwtInstallDialog["overrides"];
public connectedCallback() {
if (this.renderRoot) {
@ -92,28 +85,23 @@ export class InstallButton extends HTMLElement {
this.toggleAttribute("install-supported", true);
this.addEventListener("mouseover", InstallButton.preload);
const slot = document.createElement("slot");
slot.addEventListener("click", async (ev) => {
ev.preventDefault();
const mod = await import("./start-flash");
mod.startFlash(this);
connect(this);
});
slot.name = "activate";
const button = document.createElement("button");
button.innerText = "INSTALL";
button.innerText = "Connect";
slot.append(button);
if (
"adoptedStyleSheets" in Document.prototype &&
"replaceSync" in CSSStyleSheet.prototype
) {
const sheet = new CSSStyleSheet();
// @ts-expect-error
sheet.replaceSync(InstallButton.style);
// @ts-expect-error
this.renderRoot.adoptedStyleSheets = [sheet];
} else {
const styleSheet = document.createElement("style");

1108
src/install-dialog.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
import "./no-port-picked-dialog";
export const openNoPortPickedDialog = async (
doTryAgain?: () => void,
): Promise<boolean> => {
const dialog = document.createElement("ewt-no-port-picked-dialog");
dialog.doTryAgain = doTryAgain;
document.body.append(dialog);
return true;
};

View File

@ -0,0 +1,176 @@
import { LitElement, html, css, svg } from "lit";
import { customElement } from "lit/decorators.js";
import "../components/ew-dialog";
import "../components/ew-text-button";
import { dialogStyles } from "../styles";
import { getOperatingSystem } from "../util/get-operating-system";
const cloudDownload = svg`
<svg
version="1.1"
id="Capa_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px"
y="0px"
viewBox="0 0 510.322 510.322"
xml:space="preserve"
style="width: 28px; vertical-align: middle;"
>
<g>
<path
style="fill:currentColor;"
d="M429.064,159.505c0-0.151,0.086-1.057,0.086-1.057c0-75.282-61.261-136.521-136.543-136.521 c-52.244,0-97.867,30.587-120.753,76.339c-11.67-9.081-25.108-15.682-40.273-15.682c-37.166,0-67.387,30.199-67.387,67.387 c0,0,0.453,3.279,0.798,5.824C27.05,168.716,0,203.423,0,244.516c0,25.389,9.901,49.268,27.848,67.171 c17.968,17.99,41.804,27.869,67.193,27.869h130.244v46.83h-54.66l97.694,102.008l95.602-102.008h-54.66v-46.83H419.25 c50.174,0,91.072-40.855,91.072-90.986C510.3,201.827,474.428,164.639,429.064,159.505z M419.207,312.744H309.26v-55.545h-83.975 v55.545H95.019c-18.184,0-35.333-7.075-48.211-19.996c-12.878-12.878-19.953-30.005-19.953-48.189 c0-32.68,23.21-60.808,55.264-66.956l12.511-2.394l-2.092-14.431l-1.488-10.785c0-22.347,18.184-40.51,40.531-40.51 c13.266,0,25.691,6.514,33.305,17.408l15.229,21.873l8.52-25.303c15.013-44.652,56.796-74.656,103.906-74.656 c60.506,0,109.709,49.203,109.709,109.644l-1.337,25.712l15.121,0.302l3.149-0.086c35.419,0,64.216,28.797,64.216,64.216 C483.401,283.969,454.604,312.744,419.207,312.744z"
/>
</g>
</svg>
`;
@customElement("ewt-no-port-picked-dialog")
class EwtNoPortPickedDialog extends LitElement {
public doTryAgain?: () => void;
public render() {
const OS = getOperatingSystem();
return html`
<ew-dialog open @closed=${this._handleClose}>
<div slot="headline">No port selected</div>
<div slot="content">
<div>
If you didn't select a port because you didn't see your device
listed, try the following steps:
</div>
<ol>
<li>
Make sure that the device is connected to this computer (the one
that runs the browser that shows this website)
</li>
<li>
Most devices have a tiny light when it is powered on. If yours has
one, make sure it is on.
</li>
<li>
Make sure that the USB cable you use can be used for data and is
not a power-only cable.
</li>
${OS === "Linux"
? html`
<li>
If you are using a Linux flavor, make sure that your user is
part of the <code>dialout</code> group so it has permission
to access the device.
<code class="block"
>sudo usermod -a -G dialout YourUserName</code
>
You may need to log out & back in or reboot to activate the
new group access.
</li>
`
: ""}
<li>
Make sure you have the right drivers installed. Below are the
drivers for common chips used in ESP devices:
<ul>
<li>
CP2102 drivers:
<a
href="https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers"
target="_blank"
rel="noopener"
>Windows & Mac</a
>
</li>
<li>
CH342, CH343, CH9102 drivers:
<a
href="https://www.wch.cn/downloads/CH343SER_ZIP.html"
target="_blank"
rel="noopener"
>Windows</a
>,
<a
href="https://www.wch.cn/downloads/CH34XSER_MAC_ZIP.html"
target="_blank"
rel="noopener"
>Mac</a
>
<br />
(download via blue button with ${cloudDownload} icon)
</li>
<li>
CH340, CH341 drivers:
<a
href="https://www.wch.cn/downloads/CH341SER_ZIP.html"
target="_blank"
rel="noopener"
>Windows</a
>,
<a
href="https://www.wch.cn/downloads/CH341SER_MAC_ZIP.html"
target="_blank"
rel="noopener"
>Mac</a
>
<br />
(download via blue button with ${cloudDownload} icon)
</li>
</ul>
</li>
</ol>
</div>
<div slot="actions">
${this.doTryAgain
? html`
<ew-text-button @click=${this.close}>Cancel</ew-text-button>
<ew-text-button @click=${this.tryAgain}>
Try Again
</ew-text-button>
`
: html`
<ew-text-button @click=${this.close}>Close</ew-text-button>
`}
</div>
</ew-dialog>
`;
}
private tryAgain() {
this.close();
this.doTryAgain?.();
}
private close() {
this.shadowRoot!.querySelector("ew-dialog")!.close();
}
private async _handleClose() {
this.parentNode!.removeChild(this);
}
static styles = [
dialogStyles,
css`
li + li,
li > ul {
margin-top: 8px;
}
ul,
ol {
margin-bottom: 0;
padding-left: 1.5em;
}
li code.block {
display: block;
margin: 0.5em 0;
}
`,
];
}
declare global {
interface HTMLElementTagNameMap {
"ewt-no-port-picked-dialog": EwtNoPortPickedDialog;
}
}

View File

@ -0,0 +1,35 @@
import { LitElement, html, css, TemplateResult } from "lit";
import { property } from "lit/decorators.js";
class EwtPageMessage extends LitElement {
@property() icon!: string;
@property() label!: string | TemplateResult;
render() {
return html`
<div class="icon">${this.icon}</div>
${this.label}
`;
}
static styles = css`
:host {
display: flex;
flex-direction: column;
text-align: center;
}
.icon {
font-size: 50px;
line-height: 80px;
color: black;
}
`;
}
customElements.define("ewt-page-message", EwtPageMessage);
declare global {
interface HTMLElementTagNameMap {
"ewt-page-message": EwtPageMessage;
}
}

View File

@ -0,0 +1,43 @@
import { LitElement, html, css, TemplateResult } from "lit";
import { property } from "lit/decorators.js";
import "../components/ew-circular-progress";
class EwtPageProgress extends LitElement {
@property() label!: string | TemplateResult;
@property() progress: number | undefined;
render() {
return html`
<div>
<ew-circular-progress
active
?indeterminate=${this.progress === undefined}
.value=${this.progress !== undefined
? this.progress / 100
: undefined}
></ew-circular-progress>
${this.progress !== undefined ? html`<div>${this.progress}%</div>` : ""}
</div>
${this.label}
`;
}
static styles = css`
:host {
display: flex;
flex-direction: column;
text-align: center;
}
ew-circular-progress {
margin-bottom: 16px;
}
`;
}
customElements.define("ewt-page-progress", EwtPageProgress);
declare global {
interface HTMLElementTagNameMap {
"ewt-page-progress": EwtPageProgress;
}
}

View File

@ -1,154 +0,0 @@
import { flash } from "./flash";
import "./flash-log";
import "./flash-progress";
import type { FlashLog } from "./flash-log";
import type { FlashProgress } from "./flash-progress";
import type { InstallButton } from "./install-button";
import { State } from "./const";
interface FlashData {
stateListenerAdded: boolean;
logEl: FlashLog | undefined;
progressEl: FlashProgress | undefined;
improvEl: HTMLElement | undefined;
}
const getData = (button: InstallButton): FlashData => {
if (!("_flashData" in button)) {
(button as any)._flashData = {
stateListenerAdded: false,
logEl: undefined,
progressEl: undefined,
improvEl: undefined,
} as FlashData;
}
return (button as any)._flashData as FlashData;
};
const addElement = <T extends HTMLElement>(
button: InstallButton,
element: T
): T => {
button.renderRoot!.append(element);
return element;
};
export const startFlash = async (button: InstallButton) => {
if (button.hasAttribute("active")) {
return;
}
const manifest = button.manifest || button.getAttribute("manifest");
if (!manifest) {
alert("No manifest defined!");
return;
}
const data = getData(button);
let hasImprov = false;
if (!data.stateListenerAdded) {
data.stateListenerAdded = true;
button.addEventListener("state-changed", (ev) => {
const state = (button.state = ev.detail);
if (state.state === State.INITIALIZING) {
button.toggleAttribute("active", true);
} else if (state.state === State.MANIFEST && state.build?.improv) {
hasImprov = true;
// @ts-ignore
// preload improv button
import("https://www.improv-wifi.com/sdk-js/launch-button.js");
} else if (state.state === State.FINISHED) {
button.toggleAttribute("active", false);
if (hasImprov) {
startImprov(button);
}
} else if (state.state === State.ERROR) {
button.toggleAttribute("active", false);
}
data.progressEl?.processState(ev.detail);
data.logEl?.processState(ev.detail);
});
}
const logConsole = button.logConsole || button.hasAttribute("log-console");
const showLog = button.showLog || button.hasAttribute("show-log");
const showProgress =
!showLog &&
button.hideProgress !== true &&
!button.hasAttribute("hide-progress");
if (showLog && !data.logEl) {
data.logEl = addElement<FlashLog>(
button,
document.createElement("esp-web-flash-log")
);
} else if (!showLog && data.logEl) {
data.logEl.remove();
data.logEl = undefined;
}
if (showProgress && !data.progressEl) {
data.progressEl = addElement<FlashProgress>(
button,
document.createElement("esp-web-flash-progress")
);
} else if (!showProgress && data.progressEl) {
data.progressEl.remove();
data.progressEl = undefined;
}
data.logEl?.clear();
data.progressEl?.clear();
data.improvEl?.classList.toggle("hidden", true);
flash(
button,
logConsole
? console
: {
log: () => {},
error: () => {},
debug: () => {},
},
manifest,
button.eraseFirst !== undefined
? button.eraseFirst
: button.hasAttribute("erase-first")
);
};
const startImprov = async (button: InstallButton) => {
// @ts-ignore
await import("https://www.improv-wifi.com/sdk-js/launch-button.js");
const improvButtonConstructor = customElements.get(
"improv-wifi-launch-button"
);
if (
!improvButtonConstructor.isSupported ||
!improvButtonConstructor.isAllowed
) {
return;
}
const data = getData(button);
if (!data.improvEl) {
data.improvEl = document.createElement("improv-wifi-launch-button");
data.improvEl.addEventListener("state-changed", (ev: any) => {
if (ev.detail.state === "PROVISIONED") {
data.improvEl!.classList.toggle("hidden", true);
}
});
const improvButton = document.createElement("button");
improvButton.slot = "activate";
improvButton.textContent = "CLICK HERE TO FINISH SETTING UP YOUR DEVICE";
data.improvEl.appendChild(improvButton);
addElement(button, data.improvEl);
}
data.improvEl.classList.toggle("hidden", false);
};

31
src/styles.ts Normal file
View File

@ -0,0 +1,31 @@
import { css } from "lit";
// We set font-size to 16px and all the mdc typography styles
// because it defaults to rem, which means that the font-size
// of the host website would influence the ESP Web Tools dialog.
export const dialogStyles = css`
:host {
--roboto-font: Roboto, system-ui;
--text-color: rgba(0, 0, 0, 0.6);
--danger-color: #db4437;
--md-sys-color-primary: #03a9f4;
--md-sys-color-on-primary: #fff;
--md-ref-typeface-brand: var(--roboto-font);
--md-ref-typeface-plain: var(--roboto-font);
--md-sys-color-surface: #fff;
--md-sys-color-surface-container: #fff;
--md-sys-color-surface-container-high: #fff;
--md-sys-color-surface-container-highest: #f5f5f5;
--md-sys-color-secondary-container: #e0e0e0;
--md-sys-typescale-headline-font: var(--roboto-font);
--md-sys-typescale-title-font: var(--roboto-font);
}
a {
color: var(--md-sys-color-primary);
}
`;

View File

@ -1,49 +0,0 @@
import {
CHIP_FAMILY_ESP32,
CHIP_FAMILY_ESP32S2,
CHIP_FAMILY_ESP8266,
CHIP_FAMILY_ESP32C3,
ESPLoader,
} from "esp-web-flasher";
import type { BaseFlashState } from "./const";
export const getChipFamilyName = (
esploader: ESPLoader
): NonNullable<BaseFlashState["chipFamily"]> => {
switch (esploader.chipFamily) {
case CHIP_FAMILY_ESP32:
return "ESP32";
case CHIP_FAMILY_ESP8266:
return "ESP8266";
case CHIP_FAMILY_ESP32S2:
return "ESP32-S2";
case CHIP_FAMILY_ESP32C3:
return "ESP32-C3";
default:
return "Unknown Chip";
}
};
export const sleep = (time: number) =>
new Promise((resolve) => setTimeout(resolve, time));
export const fireEvent = <Event extends keyof HTMLElementEventMap>(
eventTarget: EventTarget,
type: Event,
// @ts-ignore
detail?: HTMLElementEventMap[Event]["detail"],
options?: {
bubbles?: boolean;
cancelable?: boolean;
composed?: boolean;
}
): void => {
options = options || {};
const event = new CustomEvent(type, {
bubbles: options.bubbles === undefined ? true : options.bubbles,
cancelable: Boolean(options.cancelable),
composed: options.composed === undefined ? true : options.composed,
detail,
});
eventTarget.dispatchEvent(event);
};

285
src/util/console-color.ts Normal file
View File

@ -0,0 +1,285 @@
interface ConsoleState {
bold: boolean;
italic: boolean;
underline: boolean;
strikethrough: boolean;
foregroundColor: string | null;
backgroundColor: string | null;
carriageReturn: boolean;
secret: boolean;
}
export class ColoredConsole {
public state: ConsoleState = {
bold: false,
italic: false,
underline: false,
strikethrough: false,
foregroundColor: null,
backgroundColor: null,
carriageReturn: false,
secret: false,
};
constructor(public targetElement: HTMLElement) {}
logs(): string {
return this.targetElement.innerText;
}
addLine(line: string) {
// @ts-expect-error
const re = /(?:\033|\\033)(?:\[(.*?)[@-~]|\].*?(?:\007|\033\\))/g;
let i = 0;
if (this.state.carriageReturn) {
if (line !== "\n") {
// don't remove if \r\n
this.targetElement.removeChild(this.targetElement.lastChild!);
}
this.state.carriageReturn = false;
}
if (line.includes("\r")) {
this.state.carriageReturn = true;
}
const lineSpan = document.createElement("span");
lineSpan.classList.add("line");
this.targetElement.appendChild(lineSpan);
const addSpan = (content: string) => {
if (content === "") return;
const span = document.createElement("span");
if (this.state.bold) span.classList.add("log-bold");
if (this.state.italic) span.classList.add("log-italic");
if (this.state.underline) span.classList.add("log-underline");
if (this.state.strikethrough) span.classList.add("log-strikethrough");
if (this.state.secret) span.classList.add("log-secret");
if (this.state.foregroundColor !== null)
span.classList.add(`log-fg-${this.state.foregroundColor}`);
if (this.state.backgroundColor !== null)
span.classList.add(`log-bg-${this.state.backgroundColor}`);
span.appendChild(document.createTextNode(content));
lineSpan.appendChild(span);
if (this.state.secret) {
const redacted = document.createElement("span");
redacted.classList.add("log-secret-redacted");
redacted.appendChild(document.createTextNode("[redacted]"));
lineSpan.appendChild(redacted);
}
};
while (true) {
const match = re.exec(line);
if (match === null) break;
const j = match.index;
addSpan(line.substring(i, j));
i = j + match[0].length;
if (match[1] === undefined) continue;
for (const colorCode of match[1].split(";")) {
switch (parseInt(colorCode)) {
case 0:
// reset
this.state.bold = false;
this.state.italic = false;
this.state.underline = false;
this.state.strikethrough = false;
this.state.foregroundColor = null;
this.state.backgroundColor = null;
this.state.secret = false;
break;
case 1:
this.state.bold = true;
break;
case 3:
this.state.italic = true;
break;
case 4:
this.state.underline = true;
break;
case 5:
this.state.secret = true;
break;
case 6:
this.state.secret = false;
break;
case 9:
this.state.strikethrough = true;
break;
case 22:
this.state.bold = false;
break;
case 23:
this.state.italic = false;
break;
case 24:
this.state.underline = false;
break;
case 29:
this.state.strikethrough = false;
break;
case 30:
this.state.foregroundColor = "black";
break;
case 31:
this.state.foregroundColor = "red";
break;
case 32:
this.state.foregroundColor = "green";
break;
case 33:
this.state.foregroundColor = "yellow";
break;
case 34:
this.state.foregroundColor = "blue";
break;
case 35:
this.state.foregroundColor = "magenta";
break;
case 36:
this.state.foregroundColor = "cyan";
break;
case 37:
this.state.foregroundColor = "white";
break;
case 39:
this.state.foregroundColor = null;
break;
case 41:
this.state.backgroundColor = "red";
break;
case 42:
this.state.backgroundColor = "green";
break;
case 43:
this.state.backgroundColor = "yellow";
break;
case 44:
this.state.backgroundColor = "blue";
break;
case 45:
this.state.backgroundColor = "magenta";
break;
case 46:
this.state.backgroundColor = "cyan";
break;
case 47:
this.state.backgroundColor = "white";
break;
case 40:
case 49:
this.state.backgroundColor = null;
break;
}
}
}
const atBottom =
this.targetElement.scrollTop >
this.targetElement.scrollHeight - this.targetElement.offsetHeight - 50;
addSpan(line.substring(i));
// Keep scroll at bottom
if (atBottom) {
this.targetElement.scrollTop = this.targetElement.scrollHeight;
}
}
}
export const coloredConsoleStyles = `
.log {
flex: 1;
background-color: #1c1c1c;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier,
monospace;
font-size: 12px;
padding: 16px;
overflow: auto;
line-height: 1.45;
border-radius: 3px;
white-space: pre-wrap;
overflow-wrap: break-word;
color: #ddd;
}
.log-bold {
font-weight: bold;
}
.log-italic {
font-style: italic;
}
.log-underline {
text-decoration: underline;
}
.log-strikethrough {
text-decoration: line-through;
}
.log-underline.log-strikethrough {
text-decoration: underline line-through;
}
.log-secret {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.log-secret-redacted {
opacity: 0;
width: 1px;
font-size: 1px;
}
.log-fg-black {
color: rgb(128, 128, 128);
}
.log-fg-red {
color: rgb(255, 0, 0);
}
.log-fg-green {
color: rgb(0, 255, 0);
}
.log-fg-yellow {
color: rgb(255, 255, 0);
}
.log-fg-blue {
color: rgb(0, 0, 255);
}
.log-fg-magenta {
color: rgb(255, 0, 255);
}
.log-fg-cyan {
color: rgb(0, 255, 255);
}
.log-fg-white {
color: rgb(187, 187, 187);
}
.log-bg-black {
background-color: rgb(0, 0, 0);
}
.log-bg-red {
background-color: rgb(255, 0, 0);
}
.log-bg-green {
background-color: rgb(0, 255, 0);
}
.log-bg-yellow {
background-color: rgb(255, 255, 0);
}
.log-bg-blue {
background-color: rgb(0, 0, 255);
}
.log-bg-magenta {
background-color: rgb(255, 0, 255);
}
.log-bg-cyan {
background-color: rgb(0, 255, 255);
}
.log-bg-white {
background-color: rgb(255, 255, 255);
}
`;

17
src/util/file-download.ts Normal file
View File

@ -0,0 +1,17 @@
export const fileDownload = (href: string, filename = ""): void => {
const a = document.createElement("a");
a.target = "_blank";
a.href = href;
a.download = filename;
document.body.appendChild(a);
a.dispatchEvent(new MouseEvent("click"));
document.body.removeChild(a);
};
export const textDownload = (text: string, filename = ""): void => {
const blob = new Blob([text], { type: "text/plain" });
const url = URL.createObjectURL(blob);
fileDownload(url, filename);
setTimeout(() => URL.revokeObjectURL(url), 0);
};

20
src/util/fire-event.ts Normal file
View File

@ -0,0 +1,20 @@
export const fireEvent = <Event extends keyof HTMLElementEventMap>(
eventTarget: EventTarget,
type: Event,
// @ts-ignore
detail?: HTMLElementEventMap[Event]["detail"],
options?: {
bubbles?: boolean;
cancelable?: boolean;
composed?: boolean;
},
): void => {
options = options || {};
const event = new CustomEvent(type, {
bubbles: options.bubbles === undefined ? true : options.bubbles,
cancelable: Boolean(options.cancelable),
composed: options.composed === undefined ? true : options.composed,
detail,
});
eventTarget.dispatchEvent(event);
};

View File

@ -0,0 +1,24 @@
// From https://stackoverflow.com/a/38241481
export const getOperatingSystem = () => {
const userAgent = window.navigator.userAgent;
const platform =
// @ts-expect-error
window.navigator?.userAgentData?.platform || window.navigator.platform;
const macosPlatforms = ["macOS", "Macintosh", "MacIntel", "MacPPC", "Mac68K"];
const windowsPlatforms = ["Win32", "Win64", "Windows", "WinCE"];
const iosPlatforms = ["iPhone", "iPad", "iPod"];
if (macosPlatforms.indexOf(platform) !== -1) {
return "Mac OS";
} else if (iosPlatforms.indexOf(platform) !== -1) {
return "iOS";
} else if (windowsPlatforms.indexOf(platform) !== -1) {
return "Windows";
} else if (/Android/.test(userAgent)) {
return "Android";
} else if (/Linux/.test(platform)) {
return "Linux";
}
return null;
};

View File

@ -0,0 +1,20 @@
export class LineBreakTransformer implements Transformer<string, string> {
private chunks = "";
transform(
chunk: string,
controller: TransformStreamDefaultController<string>,
) {
// Append new chunks to existing chunks.
this.chunks += chunk;
// For each line breaks in chunks, send the parsed lines out.
const lines = this.chunks.split("\r\n");
this.chunks = lines.pop()!;
lines.forEach((line) => controller.enqueue(line + "\r\n"));
}
flush(controller: TransformStreamDefaultController<string>) {
// When the stream is closed, flush any remaining chunks out.
controller.enqueue(this.chunks);
}
}

18
src/util/manifest.ts Normal file
View File

@ -0,0 +1,18 @@
import { Manifest } from "../const";
export const downloadManifest = async (manifestPath: string) => {
const manifestURL = new URL(manifestPath, location.toString()).toString();
const resp = await fetch(manifestURL);
const manifest: Manifest = await resp.json();
if ("new_install_skip_erase" in manifest) {
console.warn(
'Manifest option "new_install_skip_erase" is deprecated. Use "new_install_prompt_erase" instead.',
);
if (manifest.new_install_skip_erase) {
manifest.new_install_prompt_erase = true;
}
}
return manifest;
};

17
src/util/reset.ts Normal file
View File

@ -0,0 +1,17 @@
import { Transport } from "esptool-js";
import { sleep } from "./sleep";
export const hardReset = async (transport: Transport) => {
console.log("Triggering reset");
await transport.device.setSignals({
dataTerminalReady: false,
requestToSend: true,
});
await sleep(250);
await transport.device.setSignals({
dataTerminalReady: false,
requestToSend: false,
});
await sleep(250);
await new Promise((resolve) => setTimeout(resolve, 1000));
};

2
src/util/sleep.ts Normal file
View File

@ -0,0 +1,2 @@
export const sleep = (time: number) =>
new Promise((resolve) => setTimeout(resolve, time));

View File

@ -0,0 +1,12 @@
export class TimestampTransformer implements Transformer<string, string> {
transform(
chunk: string,
controller: TransformStreamDefaultController<string>,
) {
const date = new Date();
const h = date.getHours().toString().padStart(2, "0");
const m = date.getMinutes().toString().padStart(2, "0");
const s = date.getSeconds().toString().padStart(2, "0");
controller.enqueue(`[${h}:${m}:${s}]${chunk}`);
}
}

1
src/version.ts Normal file
View File

@ -0,0 +1 @@
export const version = "dev";

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,19 +0,0 @@
{
"name": "ESP Web Tools demo powered by ESPHome",
"builds": [
{
"chipFamily": "ESP32",
"improv": true,
"parts": [
{ "path": "bootloader.bin", "offset": 4096 },
{ "path": "partitions.bin", "offset": 32768 },
{ "path": "ota.bin", "offset": 57344 },
{ "path": "firmware.bin", "offset": 65536 }
]
},
{
"chipFamily": "ESP8266",
"parts": [{ "path": "esp8266.bin", "offset": 0 }]
}
]
}

Binary file not shown.

Binary file not shown.

BIN
static/logos/2smart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
static/logos/canairio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
static/logos/clockwise.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

1
static/logos/esphome.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 90 73"><g fill="none" fill-rule="evenodd"><path d="M72.63 16.18V12c0-1.47 1.19-2.66 2.66-2.66 1.47 0 2.66 1.19 2.66 2.66v4.18m-14.27 0V12c0-1.47 1.19-2.66 2.66-2.66A2.65 2.65 0 0 1 69 11.99v4.18m-14.28.01V12c0-1.47 1.19-2.66 2.66-2.66 1.47 0 2.66 1.19 2.66 2.66v4.18m-14.28 0V12c0-1.47 1.19-2.66 2.66-2.66 1.47 0 2.66 1.19 2.66 2.66v4.18m-14.28 0V12c0-1.47 1.19-2.66 2.66-2.66 1.47 0 2.66 1.19 2.66 2.66v4.18m-14.27 0V12c0-1.47 1.19-2.66 2.66-2.66 1.47 0 2.66 1.19 2.66 2.66v4.18M77.95 56.07v4.68c0 1.47-1.19 2.66-2.66 2.66-1.47 0-2.66-1.19-2.66-2.66v-4.68m-3.63 0v4.68c0 1.47-1.19 2.66-2.66 2.66-1.47 0-2.66-1.19-2.66-2.66v-4.68m-3.64 0v4.68c0 1.47-1.19 2.66-2.66 2.66-1.47 0-2.66-1.19-2.66-2.66v-4.68m-3.64 0v4.68c0 1.47-1.19 2.66-2.66 2.66-1.47 0-2.66-1.19-2.66-2.66v-4.68m-3.64 0v4.68c0 1.47-1.19 2.66-2.66 2.66-1.47 0-2.66-1.19-2.66-2.66v-4.68m-3.63.26v4.43c0 1.47-1.19 2.66-2.66 2.66-1.47 0-2.66-1.19-2.66-2.66v-4.43" fill="#fff" stroke="#000" stroke-width="2.178"/><path fill="#fff" stroke="#000" stroke-width="2.42" d="M79.29 16.18H26.51a.97.97 0 0 0-.97.97v37.96c0 .53.43.97.97.97h52.77c.53 0 .97-.43.97-.97V17.15c0-.54-.43-.97-.96-.97z"/><path fill="#000" fill-rule="nonzero" d="M61.6 35.42v-5.07h-1.8v3.28l-6.81-6.81-11.49 11.5h2.87v7.75h17.25v-7.75h2.87z"/><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.961" d="M61.6 35.42v-5.07h-1.8v3.28l-6.81-6.81-11.49 11.5h2.87v7.75h17.25v-7.75h2.87z"/><path d="M25.34 53.77H9.52v-3.89h11.86v-3.89H9.52v-3.88h11.86v-3.89H9.52v-3.89h11.86v-3.88H9.52V18.47" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.159"/></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="95.541344mm"
height="29.999447mm"
viewBox="0 0 95.54134 29.999447"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="logo.svg"
inkscape:export-filename="/home/erik/Documents/Projekt/NSPanel Manager/Logos/logo250.png"
inkscape:export-xdpi="76.010269"
inkscape:export-ydpi="76.010269"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="1"
inkscape:pagecheckerboard="false"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.3404872"
inkscape:cx="174.5634"
inkscape:cy="71.988753"
inkscape:window-width="1366"
inkscape:window-height="704"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="layer2"
showguides="true"
inkscape:guide-bbox="true"
fit-margin-top="5"
fit-margin-left="7"
fit-margin-right="7"
fit-margin-bottom="5" />
<defs
id="defs2" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-23.806324,-37.155967)">
<rect
style="fill:#000000;stroke:#000000;stroke-width:0.264583"
id="rect91625"
width="16.863066"
height="1.0996726"
x="30.938616"
y="59.758064" />
<rect
style="fill:#000000;stroke:#000000;stroke-width:0.473039"
id="rect91761"
width="66.510048"
height="0.89121634"
x="31.042845"
y="42.392487" />
<rect
style="fill:#000000;stroke:#000000;stroke-width:0.34752"
id="rect91763"
width="31.46484"
height="1.0167363"
x="80.709068"
y="59.79953" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
style="display:inline"
transform="translate(-23.806324,-37.155967)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:0;font-family:sans-serif;letter-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="64.189873"
y="56.76144"
id="text39249"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.4056px;line-height:0.55;font-family:Hamlin;-inkscape-font-specification:'Hamlin, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="64.189873"
y="56.76144"
id="tspan62001">NSPANEL</tspan><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;line-height:1.55;font-family:Hamlin;-inkscape-font-specification:'Hamlin Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583"
x="64.189873"
y="62.091209"
id="tspan73527">MANAGER</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 3"
transform="translate(-23.806324,-37.155967)">
<g
id="g91894"
transform="matrix(0.15910033,0,0,0.15910033,102.25849,44.830316)">
<g
inkscape:label="Layer 1"
id="layer1-1"
transform="translate(-30.269979,-9.7200098)"
style="display:inline;fill:#ffc101;fill-opacity:1">
<path
style="fill:#ffc101;fill-opacity:1;stroke-width:0.103892"
d="m 55.789326,41.355207 -7.50621,-0.0036 c -8.143469,-0.0039 -15.508914,-0.135689 -16.902471,-0.302478 -0.482408,-0.05774 -0.940146,-0.168019 -1.017198,-0.245069 -0.115522,-0.115523 -0.121188,-0.512246 -0.03231,-2.261925 0.23677,-4.661121 1.011239,-7.815267 2.954845,-12.034057 2.163281,-4.695621 5.19604,-8.340625 9.101253,-10.938592 2.710535,-1.8032 6.982591,-3.536303 9.582241,-3.887359 0.270422,-0.03652 0.543941,-0.129371 0.60782,-0.20634 0.06388,-0.07697 0.286764,-0.168201 0.495299,-0.202735 0.208537,-0.03453 0.449284,-0.09017 0.534995,-0.123628 0.168484,-0.06577 0.381034,-0.08553 1.215776,-0.112981 l 0.540477,-0.01778 0.03093,-0.649326 0.03093,-0.6493272 h 1.610329 1.610329 l 0.03093,0.6493272 0.03093,0.649326 0.540477,0.01778 c 0.834742,0.02745 1.047292,0.04721 1.215776,0.112981 0.08571,0.03346 0.326458,0.08909 0.534995,0.123628 0.208535,0.03453 0.43142,0.125765 0.495299,0.202735 0.06388,0.07697 0.337398,0.169823 0.60782,0.20634 1.199505,0.161981 3.423686,0.820696 4.997483,1.480058 3.507719,1.469604 6.221358,3.303143 8.667596,5.856479 2.140092,2.233788 3.602852,4.416791 5.018415,7.489412 1.943606,4.21879 2.718075,7.372936 2.954845,12.034057 0.08888,1.749679 0.08321,2.146402 -0.03231,2.261925 -0.07705,0.07705 -0.53479,0.187332 -1.017198,0.245069 -1.393557,0.166789 -8.759002,0.298597 -16.902471,0.302478 l -7.50621,0.0036 z"
id="path1465"
inkscape:connector-curvature="0"
inkscape:export-xdpi="15.183412"
inkscape:export-ydpi="15.183412"
sodipodi:nodetypes="csssssssssscccccccccscssssssssccc" />
</g>
<g
inkscape:label="Layer 1 copy"
id="g2878"
transform="translate(-30.269979,-9.7200098)"
style="display:inline">
<path
style="fill:#000000;fill-opacity:1;stroke-width:0.103892"
d="m 54.334834,101.13608 c -3.956539,-0.21732 -5.98252,-0.58093 -6.463066,-1.159955 -0.09761,-0.11762 -0.123549,-0.57148 -0.09916,-1.73541 0.02799,-1.33577 0.008,-1.59689 -0.130816,-1.71212 -0.09011,-0.0748 -0.16384,-0.29294 -0.16384,-0.48477 0,-0.30436 0.05486,-0.37678 0.430667,-0.5685 0.694102,-0.3541 2.301256,-0.71174 4.060659,-0.9036 l 1.638312,-0.17866 V 70.783119 c 0,-15.670705 -0.03494,-23.609951 -0.103892,-23.609951 -0.05714,0 -0.103892,-0.0935 -0.103892,-0.207784 0,-0.194592 0.06926,-0.207784 1.090868,-0.207784 0.900399,0 1.090868,-0.02721 1.090868,-0.155839 0,-0.08571 0.04675,-0.155838 0.103892,-0.155838 0.06644,0 0.103892,-3.463072 0.103892,-5.090716 l 2.493412,-2e-6 c 0,1.627644 0.03746,5.090716 0.103892,5.090716 0.05714,0 0.103892,0.07013 0.103892,0.155838 0,0.128629 0.190469,0.155839 1.090868,0.155839 1.021606,0 1.090868,0.01319 1.090868,0.207784 0,0.114281 -0.04675,0.207784 -0.103892,0.207784 -0.06896,0 -0.103892,7.939246 -0.103892,23.609951 v 23.609948 l 1.638312,0.17866 c 1.759403,0.19186 3.366557,0.54949 4.060659,0.9036 0.375812,0.19172 0.430667,0.26413 0.430667,0.5685 0,0.19183 -0.07373,0.40998 -0.16384,0.48476 -0.138668,0.11509 -0.158971,0.37643 -0.132144,1.70097 0.01743,0.86075 -0.0055,1.62411 -0.05099,1.69635 -0.27864,0.442605 -1.632284,0.804945 -3.803075,1.017985 -1.460176,0.14331 -6.726732,0.26812 -8.109225,0.19219 z"
id="path2876"
inkscape:connector-curvature="0"
inkscape:export-xdpi="15.183412"
inkscape:export-ydpi="15.183412"
sodipodi:nodetypes="ssssssscssssssccsssssscssssscsss" />
</g>
<g
id="layer3-5"
inkscape:label="Layer 3">
<circle
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:17.1351;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="path1510"
cx="34.837666"
cy="55.072739"
r="1.2872558" />
</g>
<g
id="layer2-9"
inkscape:label="Layer 2">
<rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:12.8043;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="rect1508"
width="1.3904994"
height="22.681686"
x="34.147842"
y="31.601988" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
static/logos/openspool.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

BIN
static/logos/trmnl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
static/screenshots/logs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -13,7 +13,8 @@
"noUnusedLocals": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"suppressImplicitAnyIndexErrors": true
"skipLibCheck": true,
"importHelpers": true
},
"include": ["src/*"]
}