tasmota-esp-web-tools 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/.devcontainer/Dockerfile +16 -0
  2. package/.devcontainer/devcontainer.json +44 -0
  3. package/.github/dependabot.yml +10 -0
  4. package/.github/release-drafter.yml +12 -0
  5. package/.github/workflows/ci.yml +22 -0
  6. package/.github/workflows/npmpublish.yml +22 -0
  7. package/.github/workflows/release-drafter.yml +14 -0
  8. package/.prettierignore +1 -0
  9. package/README.md +68 -0
  10. package/dist/components/ewt-button.d.ts +9 -0
  11. package/dist/components/ewt-button.js +17 -0
  12. package/dist/components/ewt-checkbox.d.ts +9 -0
  13. package/dist/components/ewt-checkbox.js +6 -0
  14. package/dist/components/ewt-circular-progress.d.ts +9 -0
  15. package/dist/components/ewt-circular-progress.js +6 -0
  16. package/dist/components/ewt-console.d.ts +20 -0
  17. package/dist/components/ewt-console.js +141 -0
  18. package/dist/components/ewt-dialog.d.ts +9 -0
  19. package/dist/components/ewt-dialog.js +14 -0
  20. package/dist/components/ewt-formfield.d.ts +9 -0
  21. package/dist/components/ewt-formfield.js +6 -0
  22. package/dist/components/ewt-icon-button.d.ts +9 -0
  23. package/dist/components/ewt-icon-button.js +6 -0
  24. package/dist/components/ewt-list-item.d.ts +9 -0
  25. package/dist/components/ewt-list-item.js +6 -0
  26. package/dist/components/ewt-select.d.ts +9 -0
  27. package/dist/components/ewt-select.js +15 -0
  28. package/dist/components/ewt-textfield.d.ts +9 -0
  29. package/dist/components/ewt-textfield.js +15 -0
  30. package/dist/components/svg.d.ts +3 -0
  31. package/dist/components/svg.js +24 -0
  32. package/dist/connect.d.ts +3 -0
  33. package/dist/connect.js +33 -0
  34. package/dist/const.d.ts +94 -0
  35. package/dist/const.js +1 -0
  36. package/dist/flash.d.ts +4 -0
  37. package/dist/flash.js +191 -0
  38. package/dist/install-button.d.ts +17 -0
  39. package/dist/install-button.js +96 -0
  40. package/dist/install-dialog.d.ts +70 -0
  41. package/dist/install-dialog.js +899 -0
  42. package/dist/no-port-picked/index.d.ts +2 -0
  43. package/dist/no-port-picked/index.js +7 -0
  44. package/dist/no-port-picked/no-port-picked-dialog.d.ts +15 -0
  45. package/dist/no-port-picked/no-port-picked-dialog.js +149 -0
  46. package/dist/pages/ewt-page-message.d.ts +14 -0
  47. package/dist/pages/ewt-page-message.js +34 -0
  48. package/dist/pages/ewt-page-progress.d.ts +14 -0
  49. package/dist/pages/ewt-page-progress.js +39 -0
  50. package/dist/styles.d.ts +1 -0
  51. package/dist/styles.js +32 -0
  52. package/dist/util/chip-family-name.d.ts +3 -0
  53. package/dist/util/chip-family-name.js +17 -0
  54. package/dist/util/console-color.d.ts +19 -0
  55. package/dist/util/console-color.js +265 -0
  56. package/dist/util/file-download.d.ts +2 -0
  57. package/dist/util/file-download.js +15 -0
  58. package/dist/util/fire-event.d.ts +5 -0
  59. package/dist/util/fire-event.js +12 -0
  60. package/dist/util/line-break-transformer.d.ts +5 -0
  61. package/dist/util/line-break-transformer.js +17 -0
  62. package/dist/util/manifest.d.ts +2 -0
  63. package/dist/util/manifest.js +12 -0
  64. package/dist/util/sleep.d.ts +1 -0
  65. package/dist/util/sleep.js +1 -0
  66. package/dist/web/connect-3012e6dd.js +886 -0
  67. package/dist/web/esp32-5f88817f.js +1 -0
  68. package/dist/web/esp32c3-596796ad.js +1 -0
  69. package/dist/web/esp32s2-f7a69530.js +1 -0
  70. package/dist/web/esp32s3-314fbacd.js +1 -0
  71. package/dist/web/esp8266-c68f89af.js +1 -0
  72. package/dist/web/index-f110c132.js +126 -0
  73. package/dist/web/install-button.js +1 -0
  74. package/package.json +36 -0
  75. package/rollup.config.js +28 -0
  76. package/script/build +8 -0
  77. package/script/develop +17 -0
  78. package/script/stubgen.py +161 -0
  79. package/src/components/ewt-button.ts +25 -0
  80. package/src/components/ewt-checkbox.ts +14 -0
  81. package/src/components/ewt-circular-progress.ts +14 -0
  82. package/src/components/ewt-console.ts +163 -0
  83. package/src/components/ewt-dialog.ts +22 -0
  84. package/src/components/ewt-formfield.ts +14 -0
  85. package/src/components/ewt-icon-button.ts +14 -0
  86. package/src/components/ewt-list-item.ts +14 -0
  87. package/src/components/ewt-select.ts +23 -0
  88. package/src/components/ewt-textfield.ts +23 -0
  89. package/src/components/svg.ts +27 -0
  90. package/src/connect.ts +42 -0
  91. package/src/const.ts +101 -0
  92. package/src/flash.ts +240 -0
  93. package/src/install-button.ts +128 -0
  94. package/src/install-dialog.ts +981 -0
  95. package/src/no-port-picked/index.ts +10 -0
  96. package/src/no-port-picked/no-port-picked-dialog.ts +158 -0
  97. package/src/pages/ewt-page-message.ts +39 -0
  98. package/src/pages/ewt-page-progress.ts +44 -0
  99. package/src/styles.ts +34 -0
  100. package/src/util/chip-family-name.ts +28 -0
  101. package/src/util/console-color.ts +283 -0
  102. package/src/util/file-download.ts +17 -0
  103. package/src/util/fire-event.ts +20 -0
  104. package/src/util/line-break-transformer.ts +20 -0
  105. package/src/util/manifest.ts +18 -0
  106. package/src/util/sleep.ts +2 -0
  107. package/static/logos/canairio.png +0 -0
  108. package/static/logos/espeasy.png +0 -0
  109. package/static/logos/esphome.svg +1 -0
  110. package/static/logos/tasmota.svg +1 -0
  111. package/static/logos/wled.png +0 -0
  112. package/static/screenshots/dashboard.png +0 -0
  113. package/static/screenshots/logs.png +0 -0
  114. package/static/social.png +0 -0
  115. package/tsconfig.json +21 -0
@@ -0,0 +1,94 @@
1
+ export interface Logger {
2
+ log(msg: string, ...args: any[]): void;
3
+ error(msg: string, ...args: any[]): void;
4
+ debug(msg: string, ...args: any[]): void;
5
+ }
6
+ export interface Build {
7
+ chipFamily: "ESP32" | "ESP8266" | "ESP32-S2" | "ESP32-S3" | "ESP32-C3";
8
+ parts: {
9
+ path: string;
10
+ offset: number;
11
+ }[];
12
+ }
13
+ export interface Manifest {
14
+ name: string;
15
+ version: string;
16
+ home_assistant_domain?: string;
17
+ funding_url?: string;
18
+ /** @deprecated use `new_install_prompt_erase` instead */
19
+ new_install_skip_erase?: boolean;
20
+ new_install_prompt_erase?: boolean;
21
+ new_install_improv_wait_time?: number;
22
+ builds: Build[];
23
+ }
24
+ export interface BaseFlashState {
25
+ state: FlashStateType;
26
+ message: string;
27
+ manifest?: Manifest;
28
+ build?: Build;
29
+ chipFamily?: Build["chipFamily"] | "Unknown Chip";
30
+ }
31
+ export interface InitializingState extends BaseFlashState {
32
+ state: FlashStateType.INITIALIZING;
33
+ details: {
34
+ done: boolean;
35
+ };
36
+ }
37
+ export interface ManifestState extends BaseFlashState {
38
+ state: FlashStateType.MANIFEST;
39
+ details: {
40
+ done: boolean;
41
+ };
42
+ }
43
+ export interface PreparingState extends BaseFlashState {
44
+ state: FlashStateType.PREPARING;
45
+ details: {
46
+ done: boolean;
47
+ };
48
+ }
49
+ export interface ErasingState extends BaseFlashState {
50
+ state: FlashStateType.ERASING;
51
+ details: {
52
+ done: boolean;
53
+ };
54
+ }
55
+ export interface WritingState extends BaseFlashState {
56
+ state: FlashStateType.WRITING;
57
+ details: {
58
+ bytesTotal: number;
59
+ bytesWritten: number;
60
+ percentage: number;
61
+ };
62
+ }
63
+ export interface FinishedState extends BaseFlashState {
64
+ state: FlashStateType.FINISHED;
65
+ }
66
+ export interface ErrorState extends BaseFlashState {
67
+ state: FlashStateType.ERROR;
68
+ details: {
69
+ error: FlashError;
70
+ details: string | Error;
71
+ };
72
+ }
73
+ export type FlashState = InitializingState | ManifestState | PreparingState | ErasingState | WritingState | FinishedState | ErrorState;
74
+ export declare const enum FlashStateType {
75
+ INITIALIZING = "initializing",
76
+ MANIFEST = "manifest",
77
+ PREPARING = "preparing",
78
+ ERASING = "erasing",
79
+ WRITING = "writing",
80
+ FINISHED = "finished",
81
+ ERROR = "error"
82
+ }
83
+ export declare const enum FlashError {
84
+ FAILED_INITIALIZING = "failed_initialize",
85
+ FAILED_MANIFEST_FETCH = "fetch_manifest_failed",
86
+ NOT_SUPPORTED = "not_supported",
87
+ FAILED_FIRMWARE_DOWNLOAD = "failed_firmware_download",
88
+ WRITE_FAILED = "write_failed"
89
+ }
90
+ declare global {
91
+ interface HTMLElementEventMap {
92
+ "state-changed": CustomEvent<FlashState>;
93
+ }
94
+ }
package/dist/const.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ /// <reference types="w3c-web-serial" />
2
+ import { Logger } from "tasmota-webserial-esptool";
3
+ import { FlashState } from "./const";
4
+ export declare const flash: (onEvent: (state: FlashState) => void, port: SerialPort, logger: Logger, manifestPath: string, eraseFirst: boolean) => Promise<void>;
package/dist/flash.js ADDED
@@ -0,0 +1,191 @@
1
+ import { ESPLoader } from "tasmota-webserial-esptool";
2
+ import { getChipFamilyName } from "./util/chip-family-name";
3
+ import { sleep } from "./util/sleep";
4
+ export const flash = async (onEvent, port, logger, manifestPath, eraseFirst) => {
5
+ let manifest;
6
+ let build;
7
+ let chipFamily;
8
+ const fireStateEvent = (stateUpdate) => onEvent({
9
+ ...stateUpdate,
10
+ manifest,
11
+ build,
12
+ chipFamily,
13
+ });
14
+ const manifestURL = new URL(manifestPath, location.toString()).toString();
15
+ const manifestProm = fetch(manifestURL).then((resp) => resp.json());
16
+ const esploader = new ESPLoader(port, logger);
17
+ // For debugging
18
+ window.esploader = esploader;
19
+ fireStateEvent({
20
+ state: "initializing" /* FlashStateType.INITIALIZING */,
21
+ message: "Initializing...",
22
+ details: { done: false },
23
+ });
24
+ try {
25
+ await esploader.initialize();
26
+ }
27
+ catch (err) {
28
+ logger.error(err);
29
+ fireStateEvent({
30
+ state: "error" /* FlashStateType.ERROR */,
31
+ message: "Failed to initialize. Try resetting your device or holding the BOOT button while clicking INSTALL.",
32
+ details: { error: "failed_initialize" /* FlashError.FAILED_INITIALIZING */, details: err },
33
+ });
34
+ if (esploader.connected) {
35
+ await esploader.disconnect();
36
+ }
37
+ return;
38
+ }
39
+ chipFamily = getChipFamilyName(esploader);
40
+ fireStateEvent({
41
+ state: "initializing" /* FlashStateType.INITIALIZING */,
42
+ message: `Initialized. Found ${chipFamily}`,
43
+ details: { done: true },
44
+ });
45
+ fireStateEvent({
46
+ state: "manifest" /* FlashStateType.MANIFEST */,
47
+ message: "Fetching manifest...",
48
+ details: { done: false },
49
+ });
50
+ try {
51
+ manifest = await manifestProm;
52
+ }
53
+ catch (err) {
54
+ fireStateEvent({
55
+ state: "error" /* FlashStateType.ERROR */,
56
+ message: `Unable to fetch manifest: ${err}`,
57
+ details: { error: "fetch_manifest_failed" /* FlashError.FAILED_MANIFEST_FETCH */, details: err },
58
+ });
59
+ await esploader.disconnect();
60
+ return;
61
+ }
62
+ build = manifest.builds.find((b) => b.chipFamily === chipFamily);
63
+ fireStateEvent({
64
+ state: "manifest" /* FlashStateType.MANIFEST */,
65
+ message: `Found manifest for ${manifest.name}`,
66
+ details: { done: true },
67
+ });
68
+ if (!build) {
69
+ fireStateEvent({
70
+ state: "error" /* FlashStateType.ERROR */,
71
+ message: `Your ${chipFamily} board is not supported.`,
72
+ details: { error: "not_supported" /* FlashError.NOT_SUPPORTED */, details: chipFamily },
73
+ });
74
+ await esploader.disconnect();
75
+ return;
76
+ }
77
+ fireStateEvent({
78
+ state: "preparing" /* FlashStateType.PREPARING */,
79
+ message: "Preparing installation...",
80
+ details: { done: false },
81
+ });
82
+ const filePromises = build.parts.map(async (part) => {
83
+ const url = new URL(part.path, manifestURL).toString();
84
+ const resp = await fetch(url);
85
+ if (!resp.ok) {
86
+ throw new Error(`Downlading firmware ${part.path} failed: ${resp.status}`);
87
+ }
88
+ return resp.arrayBuffer();
89
+ });
90
+ // Run the stub while we wait for files to download
91
+ const espStub = await esploader.runStub();
92
+ const files = [];
93
+ let totalSize = 0;
94
+ for (const prom of filePromises) {
95
+ try {
96
+ const data = await prom;
97
+ files.push(data);
98
+ totalSize += data.byteLength;
99
+ }
100
+ catch (err) {
101
+ fireStateEvent({
102
+ state: "error" /* FlashStateType.ERROR */,
103
+ message: err.message,
104
+ details: {
105
+ error: "failed_firmware_download" /* FlashError.FAILED_FIRMWARE_DOWNLOAD */,
106
+ details: err.message,
107
+ },
108
+ });
109
+ await esploader.disconnect();
110
+ return;
111
+ }
112
+ }
113
+ fireStateEvent({
114
+ state: "preparing" /* FlashStateType.PREPARING */,
115
+ message: "Installation prepared",
116
+ details: { done: true },
117
+ });
118
+ if (eraseFirst) {
119
+ fireStateEvent({
120
+ state: "erasing" /* FlashStateType.ERASING */,
121
+ message: "Erasing device...",
122
+ details: { done: false },
123
+ });
124
+ await espStub.eraseFlash();
125
+ fireStateEvent({
126
+ state: "erasing" /* FlashStateType.ERASING */,
127
+ message: "Device erased",
128
+ details: { done: true },
129
+ });
130
+ }
131
+ let lastPct = 0;
132
+ fireStateEvent({
133
+ state: "writing" /* FlashStateType.WRITING */,
134
+ message: `Writing progress: ${lastPct}%`,
135
+ details: {
136
+ bytesTotal: totalSize,
137
+ bytesWritten: 0,
138
+ percentage: lastPct,
139
+ },
140
+ });
141
+ let totalWritten = 0;
142
+ for (const part of build.parts) {
143
+ const file = files.shift();
144
+ try {
145
+ await espStub.flashData(file, (bytesWritten) => {
146
+ const newPct = Math.floor(((totalWritten + bytesWritten) / totalSize) * 100);
147
+ if (newPct === lastPct) {
148
+ return;
149
+ }
150
+ lastPct = newPct;
151
+ fireStateEvent({
152
+ state: "writing" /* FlashStateType.WRITING */,
153
+ message: `Writing progress: ${newPct}%`,
154
+ details: {
155
+ bytesTotal: totalSize,
156
+ bytesWritten: totalWritten + bytesWritten,
157
+ percentage: newPct,
158
+ },
159
+ });
160
+ }, part.offset, true);
161
+ }
162
+ catch (err) {
163
+ fireStateEvent({
164
+ state: "error" /* FlashStateType.ERROR */,
165
+ message: err.message,
166
+ details: { error: "write_failed" /* FlashError.WRITE_FAILED */, details: err },
167
+ });
168
+ await esploader.disconnect();
169
+ return;
170
+ }
171
+ totalWritten += file.byteLength;
172
+ }
173
+ fireStateEvent({
174
+ state: "writing" /* FlashStateType.WRITING */,
175
+ message: "Writing complete",
176
+ details: {
177
+ bytesTotal: totalSize,
178
+ bytesWritten: totalWritten,
179
+ percentage: 100,
180
+ },
181
+ });
182
+ await sleep(100);
183
+ console.log("DISCONNECT");
184
+ await esploader.disconnect();
185
+ console.log("HARD RESET");
186
+ await esploader.hardReset();
187
+ fireStateEvent({
188
+ state: "finished" /* FlashStateType.FINISHED */,
189
+ message: "All done!",
190
+ });
191
+ };
@@ -0,0 +1,17 @@
1
+ import type { FlashState } from "./const";
2
+ import type { EwtInstallDialog } from "./install-dialog";
3
+ export declare class InstallButton extends HTMLElement {
4
+ static isSupported: boolean;
5
+ static isAllowed: boolean;
6
+ private static style;
7
+ manifest?: string;
8
+ eraseFirst?: boolean;
9
+ hideProgress?: boolean;
10
+ showLog?: boolean;
11
+ logConsole?: boolean;
12
+ state?: FlashState;
13
+ renderRoot?: ShadowRoot;
14
+ overrides: EwtInstallDialog["overrides"];
15
+ static preload(): void;
16
+ connectedCallback(): void;
17
+ }
@@ -0,0 +1,96 @@
1
+ export class InstallButton extends HTMLElement {
2
+ static preload() {
3
+ import("./connect");
4
+ }
5
+ connectedCallback() {
6
+ if (this.renderRoot) {
7
+ return;
8
+ }
9
+ this.renderRoot = this.attachShadow({ mode: "open" });
10
+ if (!InstallButton.isSupported || !InstallButton.isAllowed) {
11
+ this.toggleAttribute("install-unsupported", true);
12
+ this.renderRoot.innerHTML = !InstallButton.isAllowed
13
+ ? "<slot name='not-allowed'>You can only install ESP devices on HTTPS websites or on the localhost.</slot>"
14
+ : "<slot name='unsupported'>Your browser does not support installing things on ESP devices. Use Google Chrome or Microsoft Edge.</slot>";
15
+ return;
16
+ }
17
+ this.toggleAttribute("install-supported", true);
18
+ this.addEventListener("mouseover", InstallButton.preload);
19
+ const slot = document.createElement("slot");
20
+ slot.addEventListener("click", async (ev) => {
21
+ ev.preventDefault();
22
+ const mod = await import("./connect");
23
+ mod.connect(this);
24
+ });
25
+ slot.name = "activate";
26
+ const button = document.createElement("button");
27
+ button.innerText = "CONNECT";
28
+ slot.append(button);
29
+ if ("adoptedStyleSheets" in Document.prototype &&
30
+ "replaceSync" in CSSStyleSheet.prototype) {
31
+ const sheet = new CSSStyleSheet();
32
+ sheet.replaceSync(InstallButton.style);
33
+ this.renderRoot.adoptedStyleSheets = [sheet];
34
+ }
35
+ else {
36
+ const styleSheet = document.createElement("style");
37
+ styleSheet.innerText = InstallButton.style;
38
+ this.renderRoot.append(styleSheet);
39
+ }
40
+ this.renderRoot.append(slot);
41
+ }
42
+ }
43
+ InstallButton.isSupported = "serial" in navigator;
44
+ InstallButton.isAllowed = window.isSecureContext;
45
+ InstallButton.style = `
46
+ button {
47
+ position: relative;
48
+ cursor: pointer;
49
+ font-size: 14px;
50
+ padding: 8px 28px;
51
+ color: var(--esp-tools-button-text-color, #fff);
52
+ background-color: var(--esp-tools-button-color, #03a9f4);
53
+ border: none;
54
+ border-radius: 4px;
55
+ 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);
56
+ }
57
+ button::before {
58
+ content: " ";
59
+ position: absolute;
60
+ top: 0;
61
+ bottom: 0;
62
+ left: 0;
63
+ right: 0;
64
+ opacity: 0.2;
65
+ border-radius: 4px;
66
+ }
67
+ button:hover {
68
+ 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);
69
+ }
70
+ button:hover::before {
71
+ background-color: rgba(255,255,255,.8);
72
+ }
73
+ button:focus {
74
+ outline: none;
75
+ }
76
+ button:focus::before {
77
+ background-color: white;
78
+ }
79
+ button:active::before {
80
+ background-color: grey;
81
+ }
82
+ :host([active]) button {
83
+ color: rgba(0, 0, 0, 0.38);
84
+ background-color: rgba(0, 0, 0, 0.12);
85
+ box-shadow: none;
86
+ cursor: unset;
87
+ pointer-events: none;
88
+ }
89
+ improv-wifi-launch-button {
90
+ display: block;
91
+ margin-top: 16px;
92
+ }
93
+ .hidden {
94
+ display: none;
95
+ }`;
96
+ customElements.define("esp-web-install-button", InstallButton);
@@ -0,0 +1,70 @@
1
+ /// <reference types="w3c-web-serial" />
2
+ import { LitElement, PropertyValues, TemplateResult } from "lit";
3
+ import "./components/ewt-button";
4
+ import "./components/ewt-checkbox";
5
+ import "./components/ewt-console";
6
+ import "./components/ewt-dialog";
7
+ import "./components/ewt-formfield";
8
+ import "./components/ewt-icon-button";
9
+ import "./components/ewt-textfield";
10
+ import "./components/ewt-select";
11
+ import "./components/ewt-list-item";
12
+ import "./pages/ewt-page-progress";
13
+ import "./pages/ewt-page-message";
14
+ import { Logger, Manifest } from "./const.js";
15
+ import { ImprovSerial } from "improv-wifi-serial-sdk/dist/serial";
16
+ export declare class EwtInstallDialog extends LitElement {
17
+ port: SerialPort;
18
+ manifestPath: string;
19
+ logger: Logger;
20
+ overrides?: {
21
+ checkSameFirmware?: (manifest: Manifest, deviceImprov: ImprovSerial["info"]) => boolean;
22
+ };
23
+ private _manifest;
24
+ private _info?;
25
+ private _client?;
26
+ private _state;
27
+ private _installErase;
28
+ private _installConfirmed;
29
+ private _installState?;
30
+ private _provisionForce;
31
+ private _wasProvisioned;
32
+ private _error?;
33
+ private _busy;
34
+ private _ssids?;
35
+ private _selectedSsid;
36
+ protected render(): TemplateResult<1>;
37
+ _renderProgress(label: string | TemplateResult, progress?: number): TemplateResult<1>;
38
+ _renderError(label: string): [string, TemplateResult, boolean];
39
+ _renderDashboard(): [string, TemplateResult, boolean, boolean];
40
+ _renderDashboardNoImprov(): [string, TemplateResult, boolean, boolean];
41
+ _renderProvision(): [string | undefined, TemplateResult, boolean];
42
+ _renderAskErase(): [string | undefined, TemplateResult];
43
+ _renderInstall(): [string | undefined, TemplateResult, boolean, boolean];
44
+ _renderLogs(): [string | undefined, TemplateResult, boolean];
45
+ willUpdate(changedProps: PropertyValues): void;
46
+ protected firstUpdated(changedProps: PropertyValues): void;
47
+ protected updated(changedProps: PropertyValues): void;
48
+ private _focusFormElement;
49
+ private _initialize;
50
+ private _startInstall;
51
+ private _confirmInstall;
52
+ private _doProvision;
53
+ private _handleDisconnect;
54
+ private _handleClose;
55
+ /**
56
+ * Return if the device runs same firmware as manifest.
57
+ */
58
+ private get _isSameFirmware();
59
+ /**
60
+ * Return if the device runs same firmware and version as manifest.
61
+ */
62
+ private get _isSameVersion();
63
+ private _closeClientWithoutEvents;
64
+ static styles: import("lit").CSSResult[];
65
+ }
66
+ declare global {
67
+ interface HTMLElementTagNameMap {
68
+ "ewt-install-dialog": EwtInstallDialog;
69
+ }
70
+ }