From 695a6a506ea0f41f211ec95d9c0744425de528f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 06:20:22 +0100 Subject: [PATCH 01/50] Update octokit monorepo (#24292) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 ++-- yarn.lock | 42 +++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 328b4eb9c7..e4dc26f759 100644 --- a/package.json +++ b/package.json @@ -162,8 +162,8 @@ "@bundle-stats/plugin-webpack-filter": "4.18.2", "@lokalise/node-api": "13.1.0", "@octokit/auth-oauth-device": "7.1.3", - "@octokit/plugin-retry": "7.1.3", - "@octokit/rest": "21.1.0", + "@octokit/plugin-retry": "7.1.4", + "@octokit/rest": "21.1.1", "@rsdoctor/rspack-plugin": "0.4.13", "@rspack/cli": "1.2.3", "@rspack/core": "1.2.3", diff --git a/yarn.lock b/yarn.lock index 6aa6894725..6670e1873e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3430,18 +3430,18 @@ __metadata: languageName: node linkType: hard -"@octokit/core@npm:^6.1.3": - version: 6.1.3 - resolution: "@octokit/core@npm:6.1.3" +"@octokit/core@npm:^6.1.4": + version: 6.1.4 + resolution: "@octokit/core@npm:6.1.4" dependencies: "@octokit/auth-token": "npm:^5.0.0" "@octokit/graphql": "npm:^8.1.2" - "@octokit/request": "npm:^9.1.4" - "@octokit/request-error": "npm:^6.1.6" + "@octokit/request": "npm:^9.2.1" + "@octokit/request-error": "npm:^6.1.7" "@octokit/types": "npm:^13.6.2" before-after-hook: "npm:^3.0.2" universal-user-agent: "npm:^7.0.0" - checksum: 10/623b3586c987796133fa3675865f2055726b8c49f71d4044cb74e7248500514aa28d21c6ae58f5f830cb755b83633a81cdb36551b632f21efada7e046f1665bb + checksum: 10/e6ca903ce037a854c86da93ecf4d12315963745cc3580804cfd55ef6490b4df12de5c46a5864929d88584ba6016d415375115953d15e6c7458a5e037f9282427 languageName: node linkType: hard @@ -3492,7 +3492,7 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-paginate-rest@npm:^11.4.0": +"@octokit/plugin-paginate-rest@npm:^11.4.2": version: 11.4.2 resolution: "@octokit/plugin-paginate-rest@npm:11.4.2" dependencies: @@ -3523,20 +3523,20 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-retry@npm:7.1.3": - version: 7.1.3 - resolution: "@octokit/plugin-retry@npm:7.1.3" +"@octokit/plugin-retry@npm:7.1.4": + version: 7.1.4 + resolution: "@octokit/plugin-retry@npm:7.1.4" dependencies: - "@octokit/request-error": "npm:^6.1.6" + "@octokit/request-error": "npm:^6.1.7" "@octokit/types": "npm:^13.6.2" bottleneck: "npm:^2.15.3" peerDependencies: "@octokit/core": ">=6" - checksum: 10/05ec7cd2ddf4f1423015d1033746ef40d8c68fae811e8616bea92bcd7f2bd15ab6ff04b60235cd5785d94ae0a18f9002d437eb1974a752ab588ec2a276b8831a + checksum: 10/5b1f2681c33c3ba5e99da77b077fbb7b766780fdd48321d2b8e48b78acd6b83598b3e9915e3d49f8dfbc945f802bdeb26d94ae0fc9722c2e979debd049a0eeff languageName: node linkType: hard -"@octokit/request-error@npm:^6.1.6, @octokit/request-error@npm:^6.1.7": +"@octokit/request-error@npm:^6.1.7": version: 6.1.7 resolution: "@octokit/request-error@npm:6.1.7" dependencies: @@ -3558,15 +3558,15 @@ __metadata: languageName: node linkType: hard -"@octokit/rest@npm:21.1.0": - version: 21.1.0 - resolution: "@octokit/rest@npm:21.1.0" +"@octokit/rest@npm:21.1.1": + version: 21.1.1 + resolution: "@octokit/rest@npm:21.1.1" dependencies: - "@octokit/core": "npm:^6.1.3" - "@octokit/plugin-paginate-rest": "npm:^11.4.0" + "@octokit/core": "npm:^6.1.4" + "@octokit/plugin-paginate-rest": "npm:^11.4.2" "@octokit/plugin-request-log": "npm:^5.3.1" "@octokit/plugin-rest-endpoint-methods": "npm:^13.3.0" - checksum: 10/a8dd1dc82c333ba4beadf2217f929ea3c31bc016aea82879cdd1955a42a2121ef73766951ca3819970240fae8c2dc13d4d0e8a742b2e31be376b97b0b363b148 + checksum: 10/34a0088c19a202e64bb32bfc939411b96267cf4b38773c4483957600f9d5669381bcfe86f3078d1e03cade9d289dc95e196422eac3c1d0939aaba25a78cce9a7 languageName: node linkType: hard @@ -9368,8 +9368,8 @@ __metadata: "@mdi/js": "npm:7.4.47" "@mdi/svg": "npm:7.4.47" "@octokit/auth-oauth-device": "npm:7.1.3" - "@octokit/plugin-retry": "npm:7.1.3" - "@octokit/rest": "npm:21.1.0" + "@octokit/plugin-retry": "npm:7.1.4" + "@octokit/rest": "npm:21.1.1" "@polymer/paper-item": "npm:3.0.1" "@polymer/paper-listbox": "npm:3.0.1" "@polymer/paper-tabs": "npm:3.1.0" From ee64536862675a5b468ed648eb2c2030f9fd8b2c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 06:20:42 +0100 Subject: [PATCH 02/50] Update dependency @lit-labs/motion to v1.0.8 (#24289) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e4dc26f759..801578752e 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@fullcalendar/timegrid": "6.1.15", "@lezer/highlight": "1.2.1", "@lit-labs/context": "0.4.1", - "@lit-labs/motion": "1.0.7", + "@lit-labs/motion": "1.0.8", "@lit-labs/observers": "2.0.4", "@lit-labs/virtualizer": "2.0.15", "@lrnwebcomponents/simple-tooltip": "8.0.2", diff --git a/yarn.lock b/yarn.lock index 6670e1873e..1d0090c7f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2226,12 +2226,12 @@ __metadata: languageName: node linkType: hard -"@lit-labs/motion@npm:1.0.7": - version: 1.0.7 - resolution: "@lit-labs/motion@npm:1.0.7" +"@lit-labs/motion@npm:1.0.8": + version: 1.0.8 + resolution: "@lit-labs/motion@npm:1.0.8" dependencies: lit: "npm:^3.1.2" - checksum: 10/6ac9e35b6272648299ae59d3f728e4a016b21df7d75c18d673b8a0cda2d64baad9ced61892df43c43224d5e5f69d94b148d4ecdc2eadb3d2fe26b2c93c799b63 + checksum: 10/7b7f1c195ff592eb10e549e5bde07b3d8558a14b07205dc9768bb52c7ae9881a52b9790beb95c45384827227100b4e8a9f03386627c70c6683117e513419899e languageName: node linkType: hard @@ -9334,7 +9334,7 @@ __metadata: "@fullcalendar/timegrid": "npm:6.1.15" "@lezer/highlight": "npm:1.2.1" "@lit-labs/context": "npm:0.4.1" - "@lit-labs/motion": "npm:1.0.7" + "@lit-labs/motion": "npm:1.0.8" "@lit-labs/observers": "npm:2.0.4" "@lit-labs/virtualizer": "npm:2.0.15" "@lokalise/node-api": "npm:13.1.0" From 05163588fc511c78e701aa580d8482f8057206b9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 06:21:23 +0100 Subject: [PATCH 03/50] Update dependency @lit-labs/virtualizer to v2.1.0 (#24287) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 801578752e..bc2a18215e 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@lit-labs/context": "0.4.1", "@lit-labs/motion": "1.0.8", "@lit-labs/observers": "2.0.4", - "@lit-labs/virtualizer": "2.0.15", + "@lit-labs/virtualizer": "2.1.0", "@lrnwebcomponents/simple-tooltip": "8.0.2", "@material/chips": "=14.0.0-canary.53b3cad2f.0", "@material/data-table": "=14.0.0-canary.53b3cad2f.0", diff --git a/yarn.lock b/yarn.lock index 1d0090c7f5..42b261a8ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2252,13 +2252,13 @@ __metadata: languageName: node linkType: hard -"@lit-labs/virtualizer@npm:2.0.15": - version: 2.0.15 - resolution: "@lit-labs/virtualizer@npm:2.0.15" +"@lit-labs/virtualizer@npm:2.1.0": + version: 2.1.0 + resolution: "@lit-labs/virtualizer@npm:2.1.0" dependencies: lit: "npm:^3.2.0" tslib: "npm:^2.0.3" - checksum: 10/52becfbe1ae3ee771cc873e2f47e58fbc4bc0cabdadc9caed8aa4565242ce72f59a2633f687387317ce69eb455216583e54c53d0f64ff5c9e2c843f713c35fca + checksum: 10/63837ee0728e3f4873ab604a135c78b2188e2edd15b2cdd70be1651c1bcbd3918f418e41586349d3bb92e264ba4db44fe83bdd580045beac5b43d2d0723e34de languageName: node linkType: hard @@ -9336,7 +9336,7 @@ __metadata: "@lit-labs/context": "npm:0.4.1" "@lit-labs/motion": "npm:1.0.8" "@lit-labs/observers": "npm:2.0.4" - "@lit-labs/virtualizer": "npm:2.0.15" + "@lit-labs/virtualizer": "npm:2.1.0" "@lokalise/node-api": "npm:13.1.0" "@lrnwebcomponents/simple-tooltip": "npm:8.0.2" "@material/chips": "npm:=14.0.0-canary.53b3cad2f.0" From 94a5e737cc6d52bf463cf07bb6826dd3252e6ff7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 05:32:41 +0000 Subject: [PATCH 04/50] Update dependency @lit-labs/observers to v2.0.5 (#24286) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bc2a18215e..e39a95e848 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@lezer/highlight": "1.2.1", "@lit-labs/context": "0.4.1", "@lit-labs/motion": "1.0.8", - "@lit-labs/observers": "2.0.4", + "@lit-labs/observers": "2.0.5", "@lit-labs/virtualizer": "2.1.0", "@lrnwebcomponents/simple-tooltip": "8.0.2", "@material/chips": "=14.0.0-canary.53b3cad2f.0", diff --git a/yarn.lock b/yarn.lock index 42b261a8ee..9752ceeb42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2235,13 +2235,13 @@ __metadata: languageName: node linkType: hard -"@lit-labs/observers@npm:2.0.4": - version: 2.0.4 - resolution: "@lit-labs/observers@npm:2.0.4" +"@lit-labs/observers@npm:2.0.5": + version: 2.0.5 + resolution: "@lit-labs/observers@npm:2.0.5" dependencies: "@lit/reactive-element": "npm:^1.0.0 || ^2.0.0" lit-html: "npm:^3.2.0" - checksum: 10/b1deb80e88d7de01e90e084a5b7e0a22938d6ef0ddb4e2da86a8356e37ca7be1bd7c94f5abe51883f787f650b2a9c7a024b1eef854da3ac59870a5abf7fdf74b + checksum: 10/4de55e32072f5825ca288c0b32b40e6805c09cd6101c345c44dfceb6bfd03cadf652dbfcd023252ebc2f7519f036d7e0f2f8fa1e58915abbc18733ed11218086 languageName: node linkType: hard @@ -9335,7 +9335,7 @@ __metadata: "@lezer/highlight": "npm:1.2.1" "@lit-labs/context": "npm:0.4.1" "@lit-labs/motion": "npm:1.0.8" - "@lit-labs/observers": "npm:2.0.4" + "@lit-labs/observers": "npm:2.0.5" "@lit-labs/virtualizer": "npm:2.1.0" "@lokalise/node-api": "npm:13.1.0" "@lrnwebcomponents/simple-tooltip": "npm:8.0.2" From 0b64861297c4f0fa4c20a72e5782b668f2d53428 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 18 Feb 2025 06:33:17 +0100 Subject: [PATCH 05/50] Add inline features position for tile card (#24199) * Add side features position for tile card * Add translations * Rename to inline * Simplify editor with 2 dropdowns * Use 50% width * Update src/translations/en.json Co-authored-by: Wendelin <12148533+wendevlin@users.noreply.github.com> --------- Co-authored-by: Wendelin <12148533+wendevlin@users.noreply.github.com> --- .../card-features/hui-card-features.ts | 31 +++---- .../lovelace/cards/hui-humidifier-card.ts | 1 + .../lovelace/cards/hui-thermostat-card.ts | 1 + src/panels/lovelace/cards/hui-tile-card.ts | 61 ++++++++++++-- src/panels/lovelace/cards/types.ts | 1 + .../config-elements/hui-tile-card-editor.ts | 80 ++++++++++++++++--- src/translations/en.json | 14 +++- 7 files changed, 150 insertions(+), 39 deletions(-) diff --git a/src/panels/lovelace/card-features/hui-card-features.ts b/src/panels/lovelace/card-features/hui-card-features.ts index 49e578a697..7253bb7895 100644 --- a/src/panels/lovelace/card-features/hui-card-features.ts +++ b/src/panels/lovelace/card-features/hui-card-features.ts @@ -20,40 +20,31 @@ export class HuiCardFeatures extends LitElement { return nothing; } return html` -
- ${this.features.map( - (feature) => html` - - ` - )} -
+ ${this.features.map( + (feature) => html` + + ` + )} `; } static styles = css` :host { --feature-color: var(--state-icon-color); - --feature-padding: 12px; --feature-height: 42px; --feature-border-radius: 12px; --feature-button-spacing: 12px; position: relative; width: 100%; - } - .container { - position: relative; display: flex; flex-direction: column; - padding: var(--feature-padding); - padding-top: 0px; - gap: var(--feature-padding); + gap: 12px; width: 100%; - height: 100%; box-sizing: border-box; justify-content: space-evenly; } diff --git a/src/panels/lovelace/cards/hui-humidifier-card.ts b/src/panels/lovelace/cards/hui-humidifier-card.ts index 3a6921f091..826952292e 100644 --- a/src/panels/lovelace/cards/hui-humidifier-card.ts +++ b/src/panels/lovelace/cards/hui-humidifier-card.ts @@ -256,6 +256,7 @@ export class HuiHumidifierCard extends LitElement implements LovelaceCard { hui-card-features { width: 100%; flex: none; + padding: 0 12px 12px 12px; } `; } diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index c2154bb148..57655de210 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -248,6 +248,7 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { hui-card-features { width: 100%; flex: none; + padding: 0 12px 12px 12px; } `; } diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index a6a789b3e7..c69b3c4ecf 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -100,10 +100,13 @@ export class HuiTileCard extends LitElement implements LovelaceCard { } public getCardSize(): number { + const featuresPosition = + this._config && this._featurePosition(this._config); + const featuresCount = this._config?.features?.length || 0; return ( 1 + (this._config?.vertical ? 1 : 0) + - (this._config?.features?.length || 0) + (featuresPosition === "inline" ? 0 : featuresCount) ); } @@ -111,9 +114,16 @@ export class HuiTileCard extends LitElement implements LovelaceCard { const columns = 6; let min_columns = 6; let rows = 1; - if (this._config?.features?.length) { - rows += this._config.features.length; + const featurePosition = this._config && this._featurePosition(this._config); + const featuresCount = this._config?.features?.length || 0; + if (featuresCount) { + if (featurePosition === "inline") { + min_columns = 12; + } else { + rows += featuresCount; + } } + if (this._config?.vertical) { rows++; min_columns = 3; @@ -210,6 +220,23 @@ export class HuiTileCard extends LitElement implements LovelaceCard { ); } + private _featurePosition = memoizeOne((config: TileCardConfig) => { + if (config.vertical) { + return "bottom"; + } + return config.features_position || "bottom"; + }); + + private _displayedFeatures = memoizeOne((config: TileCardConfig) => { + const features = config.features || []; + const featurePosition = this._featurePosition(config); + + if (featurePosition === "inline") { + return features.slice(0, 1); + } + return features; + }); + protected render() { if (!this._config || !this.hass) { return nothing; @@ -263,6 +290,12 @@ export class HuiTileCard extends LitElement implements LovelaceCard { ? this._getImageUrl(stateObj) : undefined; + const featurePosition = this._featurePosition(this._config); + const features = this._displayedFeatures(this._config); + + const containerOrientationClass = + featurePosition === "inline" ? "horizontal" : ""; + return html`
-
+
- ${this._config.features + ${features.length > 0 ? html` ` : nothing} @@ -372,6 +405,10 @@ export class HuiTileCard extends LitElement implements LovelaceCard { flex-direction: column; flex: 1; } + .container.horizontal { + flex-direction: row; + } + .content { position: relative; display: flex; @@ -383,6 +420,11 @@ export class HuiTileCard extends LitElement implements LovelaceCard { pointer-events: none; gap: 10px; } + + .container.horizontal .content { + width: 50%; + } + .vertical { flex-direction: column; text-align: center; @@ -413,6 +455,13 @@ export class HuiTileCard extends LitElement implements LovelaceCard { } hui-card-features { --feature-color: var(--tile-color); + padding: 0 12px 12px 12px; + } + .container.horizontal hui-card-features { + width: 50%; + --feature-height: 36px; + padding: 10px; + padding-inline-start: 0; } ha-tile-icon[data-domain="alarm_control_panel"][data-state="pending"], diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index 01ddaf2f53..c1c3f856f1 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -533,6 +533,7 @@ export interface TileCardConfig extends LovelaceCardConfig { icon_hold_action?: ActionConfig; icon_double_tap_action?: ActionConfig; features?: LovelaceCardFeatureConfig[]; + features_position?: "bottom" | "inline"; } export interface HeadingCardConfig extends LovelaceCardConfig { diff --git a/src/panels/lovelace/editor/config-elements/hui-tile-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-tile-card-editor.ts index f599b1ee1e..e2507047fc 100644 --- a/src/panels/lovelace/editor/config-elements/hui-tile-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-tile-card-editor.ts @@ -8,6 +8,7 @@ import { assert, assign, boolean, + enums, object, optional, string, @@ -15,6 +16,7 @@ import { } from "superstruct"; import type { HASSDomEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event"; +import type { LocalizeFunc } from "../../../../common/translations/localize"; import "../../../../components/ha-expansion-panel"; import "../../../../components/ha-form/ha-form"; import type { @@ -54,6 +56,7 @@ const cardConfigStruct = assign( icon_hold_action: optional(actionConfigStruct), icon_double_tap_action: optional(actionConfigStruct), features: optional(array(any())), + features_position: optional(enums(["bottom", "inline"])), }) ); @@ -109,8 +112,10 @@ export class HuiTileCardEditor private _schema = memoizeOne( ( + localize: LocalizeFunc, entityId: string | undefined, hideState: boolean, + vertical: boolean, displayActions: AdvancedActions[] = [] ) => [ @@ -148,12 +153,6 @@ export class HuiTileCardEditor boolean: {}, }, }, - { - name: "vertical", - selector: { - boolean: {}, - }, - }, { name: "hide_state", selector: { @@ -175,6 +174,43 @@ export class HuiTileCardEditor }, ] as const satisfies readonly HaFormSchema[]) : []), + { + name: "", + type: "grid", + schema: [ + { + name: "content_layout", + required: true, + selector: { + select: { + mode: "dropdown", + options: ["horizontal", "vertical"].map((value) => ({ + label: localize( + `ui.panel.lovelace.editor.card.tile.content_layout_options.${value}` + ), + value, + })), + }, + }, + }, + { + name: "features_position", + required: true, + selector: { + select: { + mode: "dropdown", + options: ["bottom", "inline"].map((value) => ({ + label: localize( + `ui.panel.lovelace.editor.card.tile.features_position_options.${value}` + ), + value, + disabled: vertical && value === "inline", + })), + }, + }, + }, + ], + }, ], }, { @@ -223,12 +259,22 @@ export class HuiTileCardEditor const stateObj = entityId ? this.hass!.states[entityId] : undefined; const schema = this._schema( + this.hass.localize, entityId, - this._config!.hide_state ?? false, + this._config.hide_state ?? false, + this._config.vertical ?? false, this._displayActions ); - const data = this._config; + const data = { + ...this._config, + content_layout: this._config.vertical ? "vertical" : "horizontal", + }; + + // Default features position to bottom and force it to bottom in vertical mode + if (!data.features_position || data.vertical) { + data.features_position = "bottom"; + } return html` Date: Tue, 18 Feb 2025 06:35:25 +0100 Subject: [PATCH 06/50] Update vaadinWebComponents monorepo to v24.6.5 (#24279) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 170 +++++++++++++++++++++++++-------------------------- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/package.json b/package.json index e39a95e848..940d61d811 100644 --- a/package.json +++ b/package.json @@ -91,8 +91,8 @@ "@polymer/polymer": "3.5.2", "@replit/codemirror-indentation-markers": "6.5.3", "@thomasloven/round-slider": "0.6.0", - "@vaadin/combo-box": "24.6.4", - "@vaadin/vaadin-themable-mixin": "24.6.4", + "@vaadin/combo-box": "24.6.5", + "@vaadin/vaadin-themable-mixin": "24.6.5", "@vibrant/color": "4.0.0", "@vue/web-component-wrapper": "1.3.0", "@webcomponents/scoped-custom-element-registry": "0.0.9", diff --git a/yarn.lock b/yarn.lock index 9752ceeb42..95109c247a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5132,131 +5132,131 @@ __metadata: languageName: node linkType: hard -"@vaadin/a11y-base@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/a11y-base@npm:24.6.4" +"@vaadin/a11y-base@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/a11y-base@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.6.4" + "@vaadin/component-base": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/5d0a9261f329fda7b28c5487999774fedd0e2edb339b6f7eecf6749acbddb137569bf730e0701812c52d6e23fe65101d393c0c860931257f5cdfbbedd537c1cd + checksum: 10/7732c9a898542874ab292548abb9bcf7bf5707a3a82745018d2c83497133968f807080be70b24c5fcb749b6900f1308785a0b10314030d6b96608d9da5540332 languageName: node linkType: hard -"@vaadin/combo-box@npm:24.6.4": - version: 24.6.4 - resolution: "@vaadin/combo-box@npm:24.6.4" +"@vaadin/combo-box@npm:24.6.5": + version: 24.6.5 + resolution: "@vaadin/combo-box@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.6.4" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/field-base": "npm:~24.6.4" - "@vaadin/input-container": "npm:~24.6.4" - "@vaadin/item": "npm:~24.6.4" - "@vaadin/lit-renderer": "npm:~24.6.4" - "@vaadin/overlay": "npm:~24.6.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.6.4" - "@vaadin/vaadin-material-styles": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" + "@vaadin/a11y-base": "npm:~24.6.5" + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/field-base": "npm:~24.6.5" + "@vaadin/input-container": "npm:~24.6.5" + "@vaadin/item": "npm:~24.6.5" + "@vaadin/lit-renderer": "npm:~24.6.5" + "@vaadin/overlay": "npm:~24.6.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.6.5" + "@vaadin/vaadin-material-styles": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/9c014ab3647a1c887e7cf2f707681c453bedcfc619580900341730b1de2588ecc139ac6dd79b614a13bd1a9fa07d8499cf8bddddffd7d4eac9f30094dca152a1 + checksum: 10/633a6aa57cc269a67bbf5df4998b9699cd7466cd5effca2da5db91be102706aab04150c9732a88798934aa5bb986b7c6afdc59d1c6c07a13f346006bfffbb7fc languageName: node linkType: hard -"@vaadin/component-base@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/component-base@npm:24.6.4" +"@vaadin/component-base@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/component-base@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" "@vaadin/vaadin-development-mode-detector": "npm:^2.0.0" "@vaadin/vaadin-usage-statistics": "npm:^2.1.0" lit: "npm:^3.0.0" - checksum: 10/e3fe5e74b06fa9496b5a448a1328c03385ac078b25125a610fc330a05bf26b82234a0264e4d4c9b2399e207b14c6a6ba65bd908afa05073053059b4a01115995 + checksum: 10/4b901f51e6894d7032d9ce20388136428b374a72ffc58ece7bb05e54d2c412a13dee38dc74d9a1a674a56720d22037d91d441fa84b221d2df5add82d12798081 languageName: node linkType: hard -"@vaadin/field-base@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/field-base@npm:24.6.4" +"@vaadin/field-base@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/field-base@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.6.4" - "@vaadin/component-base": "npm:~24.6.4" + "@vaadin/a11y-base": "npm:~24.6.5" + "@vaadin/component-base": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/ede2a08cf332e639117835dfcb2ee274b9df8c5f9af0a1611638719090cdeb29f925d11244183219c346d3bf4b6929042f8008087afe38c26ea6c6ed7d849491 + checksum: 10/8644b025a8916ffcc7bf961c0ff41af4feaf5a92ca55e90974df0ad700bbe17ad29a1bd7ccb58b078658daba175f5d9895e49b7aa41c15f598a9edac0d063ca3 languageName: node linkType: hard -"@vaadin/icon@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/icon@npm:24.6.4" +"@vaadin/icon@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/icon@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/bf611bbb43801cba77d6cebf2eb9c7de9939b238a111f1364f183d0f96775639b4312bf2e7d866684b829e028af7dca4d55b1277b780267e104b424101270daa + checksum: 10/6b29eff3c8a79feffc15cea3eb30a181a609294eb71be5a6c8555cde32be9fc8e687473955a819900622a0a9dece4bf7ed79110c2b77eb692c4d6dc54158da4e languageName: node linkType: hard -"@vaadin/input-container@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/input-container@npm:24.6.4" +"@vaadin/input-container@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/input-container@npm:24.6.5" dependencies: "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.6.4" - "@vaadin/vaadin-material-styles": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.6.5" + "@vaadin/vaadin-material-styles": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/7805a861e9f0a4644586e3b106f8a71b9c888194a212453b4856465442365c880a1655f8dbbd060d9dd5705f59ca0011dda7efdf93b4d47508d58ebcea42e4f4 + checksum: 10/aa30c001145a175d89bb76786af2733b98879a7fac62afe57a522e759776dda939fd879dd57d0383869d8c0af7d540cee58ad53a831626e68f74f41a87661087 languageName: node linkType: hard -"@vaadin/item@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/item@npm:24.6.4" +"@vaadin/item@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/item@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.6.4" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.6.4" - "@vaadin/vaadin-material-styles": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" + "@vaadin/a11y-base": "npm:~24.6.5" + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.6.5" + "@vaadin/vaadin-material-styles": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/d44f766a92aeca1a8d96dccb40fd432846c00feeb25787962a5726a5c4c44937121537e6d6b5b1cb69baba4b905faefeec2a34e5f7bd4d405508f955398d61de + checksum: 10/2dcb20b643b29426fb77072910dbe1fd0a69935369a8df5283a5c82928b7f15f5644b31a9a6a21b4a0d5e3d6ddf2d0073b5e4cb0b2cfd97092818df22861f95e languageName: node linkType: hard -"@vaadin/lit-renderer@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/lit-renderer@npm:24.6.4" +"@vaadin/lit-renderer@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/lit-renderer@npm:24.6.5" dependencies: lit: "npm:^3.0.0" - checksum: 10/ab99999f9e7d140abc62b3182ca5c4905b8ba794be84d9842fb4238d67400620dbe14e924f304cb2493e3bf7435f70fc9719b8f19c6161b32a59ead5b8bf7aa9 + checksum: 10/39a3e8efd775382bd628b15dafe9e786b5c4a3ac0a51f2ec333eee1e13fbbd566bf8e6cabfbf80cece311ccc83f26434c47e097e8a92e2b0eda2e98e6e7737f7 languageName: node linkType: hard -"@vaadin/overlay@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/overlay@npm:24.6.4" +"@vaadin/overlay@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/overlay@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.6.4" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.6.4" - "@vaadin/vaadin-material-styles": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" + "@vaadin/a11y-base": "npm:~24.6.5" + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.6.5" + "@vaadin/vaadin-material-styles": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" lit: "npm:^3.0.0" - checksum: 10/c237994571696c3fb5d2ac1661befabc301a5020cbf77302eb2c00c4b1e05483c96bd1d4f202efe2a25adab47889d5e851a80373787b9904987f0edd4c045fc1 + checksum: 10/76521a5136074f834d6a25a1c0167989b17da85f931f1595b223ca65df810cf5e5d914e67da69fdec9c6567c29e51303a3965a1eb233e4ec027f627907d7128e languageName: node linkType: hard @@ -5267,36 +5267,36 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-lumo-styles@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/vaadin-lumo-styles@npm:24.6.4" +"@vaadin/vaadin-lumo-styles@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/vaadin-lumo-styles@npm:24.6.5" dependencies: "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/icon": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" - checksum: 10/35ae45a433b864236f1bdec27111c0b25feffa16f199205c896add86d4ef1d53487cab1ef13573d60365f5b3d6cf2e0b7bcd56787a4fbe7de53d5fcfdc74e46f + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/icon": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" + checksum: 10/c6a4acce967c15f582164347a8c1919deeb28d33b7847bfeb29b988dbd51532a8ca2975315ece9fea8d7abe5cfb0da18a88164d4fb489f8d032b08f9fd1989a5 languageName: node linkType: hard -"@vaadin/vaadin-material-styles@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/vaadin-material-styles@npm:24.6.4" +"@vaadin/vaadin-material-styles@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/vaadin-material-styles@npm:24.6.5" dependencies: "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.6.4" - checksum: 10/6ce2c3017819ca03ade65107f664b3e305b4642c151f7012f769aefef50c467d5ae7f2ff92fb3d7ced9981bf8d881cf9b0c30aef561263b0348b7f215505ecb6 + "@vaadin/component-base": "npm:~24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.6.5" + checksum: 10/cb53060bf22bb74b8b297da02af61710390fc5ec810401c374856c7c26e2ec61a8b878e351925e98977230009cafd0593835c84f243d3c7a3138872c31a083a2 languageName: node linkType: hard -"@vaadin/vaadin-themable-mixin@npm:24.6.4, @vaadin/vaadin-themable-mixin@npm:~24.6.4": - version: 24.6.4 - resolution: "@vaadin/vaadin-themable-mixin@npm:24.6.4" +"@vaadin/vaadin-themable-mixin@npm:24.6.5, @vaadin/vaadin-themable-mixin@npm:~24.6.5": + version: 24.6.5 + resolution: "@vaadin/vaadin-themable-mixin@npm:24.6.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" lit: "npm:^3.0.0" - checksum: 10/05a8bee2b254dd5c30829ebfc17a04f86e53b0fac163b7e2b53a677b8487cac859afa905a1624dc7a25e15f88bb81572de601aaa4b921fc4b99dd27df7d4a249 + checksum: 10/9751426b32620e21030beea630d204d94bea6d1a46172428a7ddae9d12d04542611412e20997464eb0b3a3452d665f7c83d625e175020c9740579e69ac30ca79 languageName: node linkType: hard @@ -9398,8 +9398,8 @@ __metadata: "@types/webspeechapi": "npm:0.0.29" "@typescript-eslint/eslint-plugin": "npm:8.24.0" "@typescript-eslint/parser": "npm:8.24.0" - "@vaadin/combo-box": "npm:24.6.4" - "@vaadin/vaadin-themable-mixin": "npm:24.6.4" + "@vaadin/combo-box": "npm:24.6.5" + "@vaadin/vaadin-themable-mixin": "npm:24.6.5" "@vibrant/color": "npm:4.0.0" "@vitest/coverage-v8": "npm:3.0.5" "@vue/web-component-wrapper": "npm:1.3.0" From 4546c6f62428fe4de9dec3bbc428482df6aba525 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 06:35:47 +0100 Subject: [PATCH 07/50] Update babel monorepo to v7.26.9 (#24278) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 8 +-- yarn.lock | 142 ++++++++++++++++++++++++--------------------------- 2 files changed, 71 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index 940d61d811..ab80dc1aa4 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "license": "Apache-2.0", "type": "module", "dependencies": { - "@babel/runtime": "7.26.7", + "@babel/runtime": "7.26.9", "@braintree/sanitize-url": "7.1.1", "@codemirror/autocomplete": "6.18.6", "@codemirror/commands": "6.8.0", @@ -153,11 +153,11 @@ "xss": "1.0.15" }, "devDependencies": { - "@babel/core": "7.26.8", + "@babel/core": "7.26.9", "@babel/helper-define-polyfill-provider": "0.6.3", "@babel/plugin-proposal-decorators": "7.25.9", - "@babel/plugin-transform-runtime": "7.26.8", - "@babel/preset-env": "7.26.8", + "@babel/plugin-transform-runtime": "7.26.9", + "@babel/preset-env": "7.26.9", "@babel/preset-typescript": "7.26.0", "@bundle-stats/plugin-webpack-filter": "4.18.2", "@lokalise/node-api": "13.1.0", diff --git a/yarn.lock b/yarn.lock index 95109c247a..d0e9bb11e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -69,40 +69,39 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.26.8, @babel/core@npm:^7.24.4": - version: 7.26.8 - resolution: "@babel/core@npm:7.26.8" +"@babel/core@npm:7.26.9, @babel/core@npm:^7.24.4": + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.8" + "@babel/generator": "npm:^7.26.9" "@babel/helper-compilation-targets": "npm:^7.26.5" "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.7" - "@babel/parser": "npm:^7.26.8" - "@babel/template": "npm:^7.26.8" - "@babel/traverse": "npm:^7.26.8" - "@babel/types": "npm:^7.26.8" - "@types/gensync": "npm:^1.0.0" + "@babel/helpers": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/a70d903dfd2c97e044b27fb480584fab6111954ced6987c6628ee4d37071ca446eca7830d72763a8d16a0da64eb83e02e3073d16c09e9eefa4a4ab38162636b4 + checksum: 10/ceed199dbe25f286a0a59a2ea7879aed37c1f3bb289375d061eda4752cab2ba365e7f9e969c7fd3b9b95c930493db6eeb5a6d6f017dd135fb5a4503449aad753 languageName: node linkType: hard -"@babel/generator@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/generator@npm:7.26.8" +"@babel/generator@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" dependencies: - "@babel/parser": "npm:^7.26.8" - "@babel/types": "npm:^7.26.8" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/8c5af0f74aad2e575f2f833af0a9a38dda5abe0574752b5e0812677c78e5dc713b6b0c9ac3b30799ba6ef883614f9f0ef79d3aa10ba8f0e54f7f0284381b0059 + checksum: 10/95075dd6158a49efcc71d7f2c5d20194fcf245348de7723ca35e37cd5800587f1d4de2be6c4ba87b5f5fbb967c052543c109eaab14b43f6a73eb05ccd9a5bb44 languageName: node linkType: hard @@ -290,13 +289,13 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/helpers@npm:7.26.7" +"@babel/helpers@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/helpers@npm:7.26.9" dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.7" - checksum: 10/97593a0c9b3c5e2e7cf824e549b5f6fa6dc739593ad93d5bb36d06883d8124beac63ee2154c9a514dbee68a169d5683ab463e0ac6713ad92fb4854cea35ed4d4 + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10/267dfa7d04dff7720610497f466aa7b60652b7ec8dde5914527879350c9d655271e892117c5b2f0f083d92d2a8e5e2cf9832d4f98cd7fb72d78f796002af19a1 languageName: node linkType: hard @@ -312,14 +311,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.23.5, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/parser@npm:7.26.8" +"@babel/parser@npm:^7.23.5, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" dependencies: - "@babel/types": "npm:^7.26.8" + "@babel/types": "npm:^7.26.9" bin: parser: ./bin/babel-parser.js - checksum: 10/0dd9d6b2022806b696b7a9ffb50b147f13525c497663d758a95adcc3ca0fa1d1bbb605fcc0604acc1cade60c3dbf2c1e0dd22b7aed17f8ad1c58c954208ffe7a + checksum: 10/cb84fe3ba556d6a4360f3373cf7eb0901c46608c8d77330cc1ca021d60f5d6ebb4056a8e7f9dd0ef231923ef1fe69c87b11ce9e160d2252e089a20232a2b942b languageName: node linkType: hard @@ -661,15 +660,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-for-of@npm:7.25.9" +"@babel/plugin-transform-for-of@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/plugin-transform-for-of@npm:7.26.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.26.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/63a2db7fe06c2e3f5fc1926f478dac66a5f7b3eaeb4a0ffae577e6f3cb3d822cb1ed2ed3798f70f5cb1aa06bc2ad8bcd1f557342f5c425fd83c37a8fc1cfd2ba + checksum: 10/25df1ea3bcecc1bcef99f273fbd8f4a73a509ab7ef3db93629817cb02f9d24868ca3760347f864c8fa4ab79ffa86fb09b2f2de1f2ba1f73f27dbe0c3973c6868 languageName: node linkType: hard @@ -955,9 +954,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.26.8": - version: 7.26.8 - resolution: "@babel/plugin-transform-runtime@npm:7.26.8" +"@babel/plugin-transform-runtime@npm:7.26.9": + version: 7.26.9 + resolution: "@babel/plugin-transform-runtime@npm:7.26.9" dependencies: "@babel/helper-module-imports": "npm:^7.25.9" "@babel/helper-plugin-utils": "npm:^7.26.5" @@ -967,7 +966,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2292a98b764165423768a4d2dc9e916a89930854c015d551eaf448f0662bcc36edaefc8dc67e390929a5f2e9006aad5883ec9e82ffddf11af3c6aa7d9af5e779 + checksum: 10/7893c3501474ef19af778d02c711edc511b82df2cd4500c575f1c61565026253b024a6c9868808ea8fc3c67168e3c8bfda3b943b0d3ac3e870ada5a2dff4a77a languageName: node linkType: hard @@ -1089,9 +1088,9 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.26.8, @babel/preset-env@npm:^7.11.0": - version: 7.26.8 - resolution: "@babel/preset-env@npm:7.26.8" +"@babel/preset-env@npm:7.26.9, @babel/preset-env@npm:^7.11.0": + version: 7.26.9 + resolution: "@babel/preset-env@npm:7.26.9" dependencies: "@babel/compat-data": "npm:^7.26.8" "@babel/helper-compilation-targets": "npm:^7.26.5" @@ -1122,7 +1121,7 @@ __metadata: "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" "@babel/plugin-transform-exponentiation-operator": "npm:^7.26.3" "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" - "@babel/plugin-transform-for-of": "npm:^7.25.9" + "@babel/plugin-transform-for-of": "npm:^7.26.9" "@babel/plugin-transform-function-name": "npm:^7.25.9" "@babel/plugin-transform-json-strings": "npm:^7.25.9" "@babel/plugin-transform-literals": "npm:^7.25.9" @@ -1164,7 +1163,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0f2b5c252b6ee1298f3a3f28ae6a85551cf062b2397cf4f2b11d5235c7bba58b8db2aa651ea42f7642f7c79024684a40da0f53035c820afa03bc37850bc28cbf + checksum: 10/ac6fad331760c0bc25ed428b7696b297bad7046a75f30e544b392acfb33709f12316b9a5b0c8606f933d5756e1b9d527b46fda09693db52e851325443dd6a574 languageName: node linkType: hard @@ -1196,48 +1195,48 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.26.7, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.8.4": - version: 7.26.7 - resolution: "@babel/runtime@npm:7.26.7" +"@babel/runtime@npm:7.26.9, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.8.4": + version: 7.26.9 + resolution: "@babel/runtime@npm:7.26.9" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/c7a661a6836b332d9d2e047cba77ba1862c1e4f78cec7146db45808182ef7636d8a7170be9797e5d8fd513180bffb9fa16f6ca1c69341891efec56113cf22bfc + checksum: 10/08edd07d774eafbf157fdc8450ed6ddd22416fdd8e2a53e4a00349daba1b502c03ab7f7ad3ad3a7c46b9a24d99b5697591d0f852ee2f84642082ef7dda90b83d languageName: node linkType: hard -"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/template@npm:7.26.8" +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" dependencies: "@babel/code-frame": "npm:^7.26.2" - "@babel/parser": "npm:^7.26.8" - "@babel/types": "npm:^7.26.8" - checksum: 10/bc45db0fd4e92d35813c2a8e8fa80b8a887c275b323537b8ebd9c64228c1614e81c74236d08f744017a6562987e48b10501688f7a8be5d6a53fb6acb61aa01c8 + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10/240288cebac95b1cc1cb045ad143365643da0470e905e11731e63280e43480785bd259924f4aea83898ef68e9fa7c176f5f2d1e8b0a059b27966e8ca0b41a1b6 languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/traverse@npm:7.26.8" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" dependencies: "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.8" - "@babel/parser": "npm:^7.26.8" - "@babel/template": "npm:^7.26.8" - "@babel/types": "npm:^7.26.8" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/2785718e54d7a243a4c1b92fe9c2cec0d3b8725b095061b8fdb9812bbcf1b94b743b39d96312644efa05692f9c2646772a8154c89625f428aa6b568cebf4ecf9 + checksum: 10/c16a79522eafa0a7e40eb556bf1e8a3d50dbb0ff943a80f2c06cee2ec7ff87baa0c5d040a5cff574d9bcb3bed05e7d8c6f13b238a931c97267674b02c6cf45b4 languageName: node linkType: hard -"@babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.7, @babel/types@npm:^7.26.8, @babel/types@npm:^7.4.4": - version: 7.26.8 - resolution: "@babel/types@npm:7.26.8" +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.4.4": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/e6889246889706ee5e605cbfe62657c829427e0ddef0e4d18679a0d989bdb23e700b5a851d84821c2bdce3ded9ae5b9285fe1028562201b28f816e3ade6c3d0d + checksum: 10/11b62ea7ed64ef7e39cc9b33852c1084064c3b970ae0eaa5db659241cfb776577d1e68cbff4de438bada885d3a827b52cc0f3746112d8e1bc672bb99a8eb5b56 languageName: node linkType: hard @@ -4645,13 +4644,6 @@ __metadata: languageName: node linkType: hard -"@types/gensync@npm:^1.0.0": - version: 1.0.4 - resolution: "@types/gensync@npm:1.0.4" - checksum: 10/99c3aa0d3f1198973c7e51bea5947b815f3338ce89ce09a39ac8abb41cd844c5b95189da254ea45e50a395fe25fd215664d8ca76c5438814963597afb01f686e - languageName: node - linkType: hard - "@types/geojson@npm:*": version: 7946.0.15 resolution: "@types/geojson@npm:7946.0.15" @@ -9300,13 +9292,13 @@ __metadata: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": "npm:7.26.8" + "@babel/core": "npm:7.26.9" "@babel/helper-define-polyfill-provider": "npm:0.6.3" "@babel/plugin-proposal-decorators": "npm:7.25.9" - "@babel/plugin-transform-runtime": "npm:7.26.8" - "@babel/preset-env": "npm:7.26.8" + "@babel/plugin-transform-runtime": "npm:7.26.9" + "@babel/preset-env": "npm:7.26.9" "@babel/preset-typescript": "npm:7.26.0" - "@babel/runtime": "npm:7.26.7" + "@babel/runtime": "npm:7.26.9" "@braintree/sanitize-url": "npm:7.1.1" "@bundle-stats/plugin-webpack-filter": "npm:4.18.2" "@codemirror/autocomplete": "npm:6.18.6" From cdd17eed2e61c531af80d903f09857740a9edbaa Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:36:53 -0800 Subject: [PATCH 08/50] Fix untracked energy rendering at the base of the bar stack (#24288) --- .../hui-energy-devices-detail-graph-card.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts index 82ae3d31a4..9ece46a8d2 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts @@ -327,17 +327,19 @@ export class HuiEnergyDevicesDetailGraphCard ); const untrackedConsumption: BarSeriesOption["data"] = []; - Object.keys(consumptionData.total).forEach((time) => { - const ts = Number(time); - const value = - consumptionData.total[time] - (totalDeviceConsumption[time] || 0); - const dataPoint: number[] = [ts, value]; - if (compare) { - dataPoint[2] = dataPoint[0]; - dataPoint[0] = compareTransform(new Date(ts)).getTime(); - } - untrackedConsumption.push(dataPoint); - }); + Object.keys(consumptionData.total) + .sort((a, b) => Number(a) - Number(b)) + .forEach((time) => { + const ts = Number(time); + const value = + consumptionData.total[time] - (totalDeviceConsumption[time] || 0); + const dataPoint: number[] = [ts, value]; + if (compare) { + dataPoint[2] = dataPoint[0]; + dataPoint[0] = compareTransform(new Date(ts)).getTime(); + } + untrackedConsumption.push(dataPoint); + }); // random id to always add untracked at the end const order = Date.now(); const dataset: BarSeriesOption = { From c52217c1ce9c9a138e28af3bbcc26e5b5bd02196 Mon Sep 17 00:00:00 2001 From: Petar Petrov Date: Tue, 18 Feb 2025 08:57:07 +0200 Subject: [PATCH 09/50] Make part of the chart rendering async for large datasets (#24260) --- src/components/chart/ha-chart-base.ts | 41 ++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/components/chart/ha-chart-base.ts b/src/components/chart/ha-chart-base.ts index 78902bc018..deb89d24d2 100644 --- a/src/components/chart/ha-chart-base.ts +++ b/src/components/chart/ha-chart-base.ts @@ -6,7 +6,6 @@ import type { DataZoomComponentOption } from "echarts/components"; import type { EChartsType } from "echarts/core"; import type { ECElementEvent, - SetOptionOpts, XAXisOption, YAXisOption, } from "echarts/types/dist/shared"; @@ -25,6 +24,7 @@ import type { HomeAssistant } from "../../types"; import { isMac } from "../../util/is_mac"; import "../ha-icon-button"; import { formatTimeLabel } from "./axis-label"; +import { ensureArray } from "../../common/array/ensure-array"; export const MIN_TIME_BETWEEN_UPDATES = 60 * 5 * 1000; @@ -68,12 +68,16 @@ export class HaChartBase extends LitElement { private _listeners: (() => void)[] = []; + private _originalZrFlush?: () => void; + public disconnectedCallback() { super.disconnectedCallback(); while (this._listeners.length) { this._listeners.pop()!(); } this.chart?.dispose(); + this.chart = undefined; + this._originalZrFlush = undefined; } public connectedCallback() { @@ -86,7 +90,7 @@ export class HaChartBase extends LitElement { listenMediaQuery("(prefers-reduced-motion)", (matches) => { if (this._reducedMotion !== matches) { this._reducedMotion = matches; - this.chart?.setOption({ animation: !this._reducedMotion }); + this._setChartOptions({ animation: !this._reducedMotion }); } }) ); @@ -96,7 +100,7 @@ export class HaChartBase extends LitElement { if ((isMac && ev.key === "Meta") || (!isMac && ev.key === "Control")) { this._modifierPressed = true; if (!this.options?.dataZoom) { - this.chart?.setOption({ dataZoom: this._getDataZoomConfig() }); + this._setChartOptions({ dataZoom: this._getDataZoomConfig() }); } } }; @@ -105,7 +109,7 @@ export class HaChartBase extends LitElement { if ((isMac && ev.key === "Meta") || (!isMac && ev.key === "Control")) { this._modifierPressed = false; if (!this.options?.dataZoom) { - this.chart?.setOption({ dataZoom: this._getDataZoomConfig() }); + this._setChartOptions({ dataZoom: this._getDataZoomConfig() }); } } }; @@ -131,10 +135,8 @@ export class HaChartBase extends LitElement { return; } let chartOptions: ECOption = {}; - const chartUpdateParams: SetOptionOpts = { lazyUpdate: true }; if (changedProps.has("data")) { chartOptions.series = this.data; - chartUpdateParams.replaceMerge = ["series"]; } if (changedProps.has("options")) { chartOptions = { ...chartOptions, ...this._createOptions() }; @@ -142,7 +144,7 @@ export class HaChartBase extends LitElement { chartOptions.dataZoom = this._getDataZoomConfig(); } if (Object.keys(chartOptions).length > 0) { - this.chart.setOption(chartOptions, chartUpdateParams); + this._setChartOptions(chartOptions); } } @@ -509,6 +511,31 @@ export class HaChartBase extends LitElement { return Math.max(this.clientWidth / 2, 200); } + private _setChartOptions(options: ECOption) { + if (!this.chart) { + return; + } + if (!this._originalZrFlush) { + const dataSize = ensureArray(this.data).reduce( + (acc, series) => acc + (series.data as any[]).length, + 0 + ); + if (dataSize > 10000) { + // for large datasets zr.flush takes 30-40% of the render time + // so we delay it a bit to avoid blocking the main thread + const zr = this.chart.getZr(); + this._originalZrFlush = zr.flush.bind(zr); + zr.flush = () => { + setTimeout(() => { + this._originalZrFlush?.(); + }, 10); + }; + } + } + const replaceMerge = options.series ? ["series"] : []; + this.chart.setOption(options, { replaceMerge }); + } + private _handleZoomReset() { this.chart?.dispatchAction({ type: "dataZoom", start: 0, end: 100 }); } From 0256da511dbba043dc4d4562e1f22ea5fdc93b29 Mon Sep 17 00:00:00 2001 From: Adam Kapos Date: Tue, 18 Feb 2025 14:04:46 +0700 Subject: [PATCH 10/50] Fix theme2hex with custom theme colors (#24282) --- src/common/color/convert-color.ts | 19 +++++++++++++------ test/common/color/convert-color.test.ts | 12 ++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/common/color/convert-color.ts b/src/common/color/convert-color.ts index 5afac322e8..2253b0fe24 100644 --- a/src/common/color/convert-color.ts +++ b/src/common/color/convert-color.ts @@ -136,11 +136,18 @@ export function theme2hex(themeColor: string): string { } const rgbFromColorName = colors[themeColor]; - if (!rgbFromColorName) { - // We have a named color, and there's nothing in the table, - // so nothing further we can do with it. - // Compare/border/background color will all be the same. - return themeColor; + if (rgbFromColorName) { + return rgb2hex(rgbFromColorName); } - return rgb2hex(rgbFromColorName); + + const rgbMatch = themeColor.match(/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/); + if (rgbMatch) { + const [, r, g, b] = rgbMatch.map(Number); + return rgb2hex([r, g, b]); + } + + // We have a named color, and there's nothing in the table, + // so nothing further we can do with it. + // Compare/border/background color will all be the same. + return themeColor; } diff --git a/test/common/color/convert-color.test.ts b/test/common/color/convert-color.test.ts index c04e995b2c..f3cc873109 100644 --- a/test/common/color/convert-color.test.ts +++ b/test/common/color/convert-color.test.ts @@ -51,4 +51,16 @@ describe("Color Conversion Tests", () => { expect(theme2hex("#ff0000")).toBe("#ff0000"); expect(theme2hex("unicorn")).toBe("unicorn"); }); + + it("should convert rgb theme color to hex", () => { + expect(theme2hex("rgb( 255, 0, 0)")).toBe("#ff0000"); + expect(theme2hex("rgb(0,255, 0)")).toBe("#00ff00"); + expect(theme2hex("rgb(0, 0,255 )")).toBe("#0000ff"); + }); + + it("should convert rgba theme color to hex by ignoring alpha", () => { + expect(theme2hex("rgba( 255, 0, 0, 0.5)")).toBe("#ff0000"); + expect(theme2hex("rgba(0,255, 0, 0.3)")).toBe("#00ff00"); + expect(theme2hex("rgba(0, 0,255 , 0.7)")).toBe("#0000ff"); + }); }); From 1363884773f8020b74767db84f20e3e6d1ae76f9 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 17 Feb 2025 23:16:10 -0800 Subject: [PATCH 11/50] Fix error handling/flickering in markdown card (#24280) --- src/panels/lovelace/cards/hui-markdown-card.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-markdown-card.ts b/src/panels/lovelace/cards/hui-markdown-card.ts index 77cb23f734..9e6883fc94 100644 --- a/src/panels/lovelace/cards/hui-markdown-card.ts +++ b/src/panels/lovelace/cards/hui-markdown-card.ts @@ -135,7 +135,7 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { this._tryConnect(); } const shouldBeHidden = - this._templateResult && + !!this._templateResult && this._config.show_empty === false && this._templateResult.result.length === 0; if (shouldBeHidden !== this.hidden) { From 347ee2a4c35df4d3476039688a003ceb1318fd70 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 18 Feb 2025 10:51:56 +0100 Subject: [PATCH 12/50] Improve-dev-container (#24296) * Add gh cli to dev container * Add develop and serve vscode task --- .devcontainer/devcontainer.json | 2 +- .devcontainer/post_create.sh | 22 +++++++++++++++++ .vscode/tasks.json | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100755 .devcontainer/post_create.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index be773f9ba8..cb654867b5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,7 +5,7 @@ "context": ".." }, "appPort": "8124:8123", - "postCreateCommand": "sudo apt update && sudo apt upgrade -y && sudo apt install -y libpcap-dev", + "postCreateCommand": "./.devcontainer/post_create.sh", "postStartCommand": "script/bootstrap", "containerEnv": { "DEV_CONTAINER": "1", diff --git a/.devcontainer/post_create.sh b/.devcontainer/post_create.sh new file mode 100755 index 0000000000..f71a688f30 --- /dev/null +++ b/.devcontainer/post_create.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# This script will run after the container is created + +# add github cli +(type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \ + && sudo mkdir -p -m 755 /etc/apt/keyrings \ + && out=$(mktemp) && wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \ + && cat $out | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null + +# Update package lists +sudo apt-get update + +sudo apt upgrade -y + +# Install necessary packages +sudo apt-get install -y libpcap-dev gh + +# Display a message +echo "Post-create script has been executed successfully." \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 676e27e6d9..401f183930 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,6 +1,42 @@ { "version": "2.0.0", "tasks": [ + { + "label": "Develop and serve Frontend", + "type": "shell", + "command": "script/develop_and_serve -c ${input:coreUrl}", + // Sync changes here to other tasks until issue resolved + // https://github.com/Microsoft/vscode/issues/61497 + "problemMatcher": { + "owner": "ha-build", + "source": "ha-build", + "fileLocation": "absolute", + "severity": "error", + "pattern": [ + { + "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", + "severity": 1, + "file": 2, + "message": 3, + "line": 4, + "column": 5 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Changes detected. Starting compilation", + "endsPattern": "Build done @" + } + }, + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "runOptions": { + "instanceLimit": 1 + } + }, { "label": "Develop Frontend", "type": "gulp", @@ -241,6 +277,12 @@ "id": "supervisorToken", "type": "promptString", "description": "The token for the Remote API proxy add-on" + }, + { + "id": "coreUrl", + "type": "promptString", + "description": "The URL of the Home Assistant Core instance", + "default": "http://127.0.0.1:8123" } ] } From d387f19a311b3ed4bddadd814a535b244abdab88 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 18 Feb 2025 14:02:53 +0100 Subject: [PATCH 13/50] Backup tweaks (#24165) * Backup tweaks * Show progress in fab * Revert unused changes --------- Co-authored-by: Wendelin --- src/data/backup.ts | 9 ++++- .../config/ha-backup-config-agents.ts | 2 +- .../config/backup/ha-config-backup-backups.ts | 24 ++++++++++-- .../backup/ha-config-backup-overview.ts | 37 ++++++++++++++++++- .../backup/ha-config-backup-settings.ts | 33 ++++++++++++++++- src/panels/config/backup/ha-config-backup.ts | 10 ++--- src/translations/en.json | 5 ++- 7 files changed, 106 insertions(+), 14 deletions(-) diff --git a/src/data/backup.ts b/src/data/backup.ts index 54424f0b21..b65ce73611 100644 --- a/src/data/backup.ts +++ b/src/data/backup.ts @@ -12,6 +12,7 @@ import type { HomeAssistant } from "../types"; import { fileDownload } from "../util/file_download"; import { domainToName } from "./integration"; import type { FrontendLocaleData } from "./translation"; +import type { BackupManagerState, ManagerStateEvent } from "./backup_manager"; import checkValidDate from "../common/datetime/check_valid_date"; import { handleFetchPromise } from "../util/hass-call-api"; @@ -130,7 +131,13 @@ export interface BackupContentExtended extends BackupContent, BackupData {} export interface BackupInfo { backups: BackupContent[]; - backing_up: boolean; + agent_errors: Record; + last_attempted_automatic_backup: string | null; + last_completed_automatic_backup: string | null; + last_non_idle_event: ManagerStateEvent | null; + next_automatic_backup: string | null; + next_automatic_backup_additional: boolean; + state: BackupManagerState; } export interface BackupDetails { diff --git a/src/panels/config/backup/components/config/ha-backup-config-agents.ts b/src/panels/config/backup/components/config/ha-backup-config-agents.ts index 4444e917a2..687321f7c5 100644 --- a/src/panels/config/backup/components/config/ha-backup-config-agents.ts +++ b/src/panels/config/backup/components/config/ha-backup-config-agents.ts @@ -4,6 +4,7 @@ import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../../common/dom/fire_event"; import { computeDomain } from "../../../../../common/entity/compute_domain"; +import { navigate } from "../../../../../common/navigate"; import "../../../../../components/ha-icon-button"; import "../../../../../components/ha-md-list"; import "../../../../../components/ha-md-list-item"; @@ -22,7 +23,6 @@ import { import type { CloudStatus } from "../../../../../data/cloud"; import type { HomeAssistant } from "../../../../../types"; import { brandsUrl } from "../../../../../util/brands-url"; -import { navigate } from "../../../../../common/navigate"; const DEFAULT_AGENTS = []; diff --git a/src/panels/config/backup/ha-config-backup-backups.ts b/src/panels/config/backup/ha-config-backup-backups.ts index 6caa2190af..9690a89f9b 100644 --- a/src/panels/config/backup/ha-config-backup-backups.ts +++ b/src/panels/config/backup/ha-config-backup-backups.ts @@ -8,7 +8,7 @@ import { mdiUpload, } from "@mdi/js"; import type { CSSResultGroup, TemplateResult } from "lit"; -import { html, LitElement, nothing } from "lit"; +import { css, html, LitElement, nothing } from "lit"; import { customElement, property, query, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; @@ -27,6 +27,7 @@ import type { } from "../../../components/data-table/ha-data-table"; import "../../../components/ha-button"; import "../../../components/ha-button-menu"; +import "../../../components/ha-circular-progress"; import "../../../components/ha-fab"; import "../../../components/ha-filter-states"; import "../../../components/ha-icon"; @@ -460,7 +461,17 @@ class HaConfigBackupBackups extends SubscribeMixin(LitElement) { extended @click=${this._newBackup} > - + ${backupInProgress + ? html`
+ +
` + : html``} ` : nothing} @@ -605,7 +616,14 @@ class HaConfigBackupBackups extends SubscribeMixin(LitElement) { } static get styles(): CSSResultGroup { - return haStyle; + return [ + haStyle, + css` + ha-circular-progress { + --md-sys-color-primary: var(--mdc-theme-on-secondary); + } + `, + ]; } } diff --git a/src/panels/config/backup/ha-config-backup-overview.ts b/src/panels/config/backup/ha-config-backup-overview.ts index 8d23b61b66..e9c75d935f 100644 --- a/src/panels/config/backup/ha-config-backup-overview.ts +++ b/src/panels/config/backup/ha-config-backup-overview.ts @@ -8,6 +8,7 @@ import "../../../components/ha-button"; import "../../../components/ha-button-menu"; import "../../../components/ha-card"; import "../../../components/ha-fab"; +import "../../../components/ha-circular-progress"; import "../../../components/ha-icon"; import "../../../components/ha-icon-next"; import "../../../components/ha-icon-overflow-menu"; @@ -17,8 +18,10 @@ import type { BackupAgent, BackupConfig, BackupContent, + BackupInfo, } from "../../../data/backup"; import { + computeBackupAgentName, generateBackup, generateBackupWithAutomaticSettings, } from "../../../data/backup"; @@ -50,6 +53,8 @@ class HaConfigBackupOverview extends LitElement { @property({ attribute: false }) public manager!: ManagerStateEvent; + @property({ attribute: false }) public info?: BackupInfo; + @property({ attribute: false }) public backups: BackupContent[] = []; @property({ attribute: false }) public fetching = false; @@ -151,6 +156,26 @@ class HaConfigBackupOverview extends LitElement {
+ ${this.info && Object.keys(this.info.agent_errors).length + ? html`${Object.entries(this.info.agent_errors).map( + ([agentId, error]) => + html` + ${error} + ` + )}` + : nothing} ${backupInProgress ? html` - + ${backupInProgress + ? html`
+ +
` + : html``} `; @@ -231,6 +263,9 @@ class HaConfigBackupOverview extends LitElement { padding-left: 0; padding-right: 0; } + ha-circular-progress { + --md-sys-color-primary: var(--mdc-theme-on-secondary); + } `, ]; } diff --git a/src/panels/config/backup/ha-config-backup-settings.ts b/src/panels/config/backup/ha-config-backup-settings.ts index d7bb4266da..e841b872aa 100644 --- a/src/panels/config/backup/ha-config-backup-settings.ts +++ b/src/panels/config/backup/ha-config-backup-settings.ts @@ -1,4 +1,4 @@ -import { mdiDotsVertical, mdiHarddisk } from "@mdi/js"; +import { mdiDotsVertical, mdiHarddisk, mdiOpenInNew } from "@mdi/js"; import type { PropertyValues } from "lit"; import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; @@ -28,6 +28,7 @@ import "./components/config/ha-backup-config-encryption-key"; import "./components/config/ha-backup-config-schedule"; import type { BackupConfigSchedule } from "./components/config/ha-backup-config-schedule"; import { showLocalBackupLocationDialog } from "./dialogs/show-dialog-local-backup-location"; +import { documentationUrl } from "../../../util/documentation-url"; @customElement("ha-config-backup-settings") class HaConfigBackupSettings extends LitElement { @@ -98,6 +99,8 @@ class HaConfigBackupSettings extends LitElement { return nothing; } + const supervisor = isComponentLoaded(this.hass, "hassio"); + return html` - ${isComponentLoaded(this.hass, "hassio") + ${supervisor ? html` +
@@ -342,6 +368,9 @@ class HaConfigBackupSettings extends LitElement { .card-content { padding-bottom: 0; } + a { + text-decoration: none; + } `; } diff --git a/src/panels/config/backup/ha-config-backup.ts b/src/panels/config/backup/ha-config-backup.ts index b488058b58..d61eb33a36 100644 --- a/src/panels/config/backup/ha-config-backup.ts +++ b/src/panels/config/backup/ha-config-backup.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from "lit/decorators"; import type { BackupAgent, BackupConfig, - BackupContent, + BackupInfo, } from "../../../data/backup"; import { compareAgents, @@ -44,7 +44,7 @@ class HaConfigBackup extends SubscribeMixin(HassRouterPage) { @state() private _manager: ManagerStateEvent = DEFAULT_MANAGER_STATE; - @state() private _backups: BackupContent[] = []; + @state() private _info?: BackupInfo; @state() private _agents: BackupAgent[] = []; @@ -87,8 +87,7 @@ class HaConfigBackup extends SubscribeMixin(HassRouterPage) { } private async _fetchBackupInfo() { - const info = await fetchBackupInfo(this.hass); - this._backups = info.backups; + this._info = await fetchBackupInfo(this.hass); } private async _fetchBackupConfig() { @@ -134,7 +133,8 @@ class HaConfigBackup extends SubscribeMixin(HassRouterPage) { pageEl.narrow = this.narrow; pageEl.cloudStatus = this.cloudStatus; pageEl.manager = this._manager; - pageEl.backups = this._backups; + pageEl.info = this._info; + pageEl.backups = this._info?.backups || []; pageEl.config = this._config; pageEl.agents = this._agents; pageEl.fetching = this._fetching; diff --git a/src/translations/en.json b/src/translations/en.json index b4c1a39732..0afa5e133b 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2512,6 +2512,7 @@ "menu": { "upload_backup": "Upload backup" }, + "agent_error": "Error in location {name}", "new_backup": "Backup now", "onboarding": { "title": "Set up backups", @@ -2650,7 +2651,9 @@ "title": "Locations", "description": "Your backup will be stored on these locations when this default backup is created. You can use all locations for custom backups.", "no_location": "No location selected", - "no_location_description": "You have to select at least one location to create a backup." + "no_location_description": "You have to select at least one location to create a backup.", + "more_locations": "Explore more locations", + "manage_network_storage": "Manage network storage" }, "encryption_key": { "title": "Encryption key", From 24211d5f25d5e731987e78ef62f25871ceee3d11 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:05:04 +0100 Subject: [PATCH 14/50] Fix backup forever retention settings (#24299) Fix forever retention settings --- .../config/ha-backup-config-schedule.ts | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/panels/config/backup/components/config/ha-backup-config-schedule.ts b/src/panels/config/backup/components/config/ha-backup-config-schedule.ts index d57389a001..c19d334487 100644 --- a/src/panels/config/backup/components/config/ha-backup-config-schedule.ts +++ b/src/panels/config/backup/components/config/ha-backup-config-schedule.ts @@ -46,7 +46,7 @@ enum BackupScheduleTime { } interface RetentionData { - type: "copies" | "days"; + type: "copies" | "days" | "forever"; value: number; } @@ -55,7 +55,7 @@ const RETENTION_PRESETS: Record< RetentionData > = { copies_3: { type: "copies", value: 3 }, - forever: { type: "days", value: 0 }, + forever: { type: "forever", value: 0 }, }; const SCHEDULE_OPTIONS = [ @@ -79,7 +79,10 @@ const computeRetentionPreset = ( data: RetentionData ): RetentionPreset | undefined => { for (const [key, value] of Object.entries(RETENTION_PRESETS)) { - if (value.type === data.type && value.value === data.value) { + if ( + value.type === data.type && + (value.type === RetentionPreset.FOREVER || value.value === data.value) + ) { return key as RetentionPreset; } } @@ -92,7 +95,7 @@ interface FormData { time?: string | null; days: BackupDay[]; retention: { - type: "copies" | "days"; + type: "copies" | "days" | "forever"; value: number; }; } @@ -142,7 +145,12 @@ class HaBackupConfigSchedule extends LitElement { ? config.schedule.days : [], retention: { - type: config.retention.days != null ? "days" : "copies", + type: + config.retention.days === null && config.retention.copies === null + ? "forever" + : config.retention.days != null + ? "days" + : "copies", value: config.retention.days ?? config.retention.copies ?? 3, }, }; @@ -160,9 +168,11 @@ class HaBackupConfigSchedule extends LitElement { : [], }, retention: - data.retention.type === "days" - ? { days: data.retention.value, copies: null } - : { copies: data.retention.value, days: null }, + data.retention.type === "forever" + ? { days: null, copies: null } + : data.retention.type === "days" + ? { days: data.retention.value, copies: null } + : { copies: data.retention.value, days: null }, }; fireEvent(this, "value-changed", { value: this.value }); @@ -481,9 +491,19 @@ class HaBackupConfigSchedule extends LitElement { private _retentionPresetChanged(ev) { ev.stopPropagation(); const target = ev.currentTarget as HaMdSelect; - const value = target.value as RetentionPreset; + let value = target.value as RetentionPreset; + + // custom needs to have a type of days or copies, set it to default copies 3 + if ( + value === RetentionPreset.CUSTOM && + this._retentionPreset === RetentionPreset.FOREVER + ) { + this._retentionPreset = value; + value = RetentionPreset.COPIES_3; + } else { + this._retentionPreset = value; + } - this._retentionPreset = value; if (value !== RetentionPreset.CUSTOM) { const data = this._getData(this.value); const retention = RETENTION_PRESETS[value]; @@ -493,7 +513,7 @@ class HaBackupConfigSchedule extends LitElement { } this._setData({ ...data, - retention: RETENTION_PRESETS[value], + retention, }); } } @@ -504,6 +524,7 @@ class HaBackupConfigSchedule extends LitElement { const value = parseInt(target.value); const clamped = clamp(value, MIN_VALUE, MAX_VALUE); const data = this._getData(this.value); + target.value = clamped.toString(); this._setData({ ...data, retention: { From 06932d14794860d469cf8e822d3d239ecfdc07a4 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 18 Feb 2025 14:27:59 +0100 Subject: [PATCH 15/50] Prevent navigate when opening voice flow (#24300) prevent navigate when opening voice flow --- src/dialogs/config-flow/step-flow-create-entry.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dialogs/config-flow/step-flow-create-entry.ts b/src/dialogs/config-flow/step-flow-create-entry.ts index f02f8cec63..64f7ac1b3b 100644 --- a/src/dialogs/config-flow/step-flow-create-entry.ts +++ b/src/dialogs/config-flow/step-flow-create-entry.ts @@ -85,6 +85,7 @@ class StepFlowCreateEntry extends LitElement { assistSatelliteSupportsSetupFlow(this.hass.states[satellite.entity_id]) ) ) { + this.navigateToResult = false; this._flowDone(); showVoiceAssistantSetupDialog(this, { deviceId: devices[0].id, From 83d4a408f68ba3ce91e35810dffb46f32dd743ca Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Tue, 18 Feb 2025 14:45:39 +0100 Subject: [PATCH 16/50] Improve large maps with marker clustering (#24244) * Improve large maps with marker clustering * Pin leaflet.markercluster * Remove custom icon * Display whether marker are clustered or not --- build-scripts/gulp/gather-static.js | 8 +++ package.json | 2 + src/common/dom/setup-leaflet-map.ts | 19 ++++++ src/common/map/decorated_marker.ts | 32 ++++++++++ src/components/map/ha-map.ts | 76 +++++++++++++++-------- src/panels/lovelace/cards/hui-map-card.ts | 49 +++++++++++---- src/translations/en.json | 3 +- yarn.lock | 20 ++++++ 8 files changed, 170 insertions(+), 39 deletions(-) create mode 100644 src/common/map/decorated_marker.ts diff --git a/build-scripts/gulp/gather-static.js b/build-scripts/gulp/gather-static.js index 5b9a668675..ab3984552e 100644 --- a/build-scripts/gulp/gather-static.js +++ b/build-scripts/gulp/gather-static.js @@ -90,6 +90,14 @@ function copyMapPanel(staticDir) { npmPath("leaflet/dist/leaflet.css"), staticPath("images/leaflet/") ); + copyFileDir( + npmPath("leaflet.markercluster/dist/MarkerCluster.css"), + staticPath("images/leaflet/") + ); + copyFileDir( + npmPath("leaflet.markercluster/dist/MarkerCluster.Default.css"), + staticPath("images/leaflet/") + ); fs.copySync( npmPath("leaflet/dist/images"), staticPath("images/leaflet/images/") diff --git a/package.json b/package.json index ab80dc1aa4..b6fa4fdd4b 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ "js-yaml": "4.1.0", "leaflet": "1.9.4", "leaflet-draw": "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch", + "leaflet.markercluster": "1.5.3", "lit": "2.8.0", "lit-html": "2.8.0", "luxon": "3.5.0", @@ -176,6 +177,7 @@ "@types/js-yaml": "4.0.9", "@types/leaflet": "1.9.16", "@types/leaflet-draw": "1.0.11", + "@types/leaflet.markercluster": "1.5.5", "@types/lodash.merge": "4.6.9", "@types/luxon": "3.4.2", "@types/mocha": "10.0.10", diff --git a/src/common/dom/setup-leaflet-map.ts b/src/common/dom/setup-leaflet-map.ts index 21de1f050b..d94ebfa846 100644 --- a/src/common/dom/setup-leaflet-map.ts +++ b/src/common/dom/setup-leaflet-map.ts @@ -16,11 +16,30 @@ export const setupLeafletMap = async ( const Leaflet = (await import("leaflet")).default as LeafletModuleType; Leaflet.Icon.Default.imagePath = "/static/images/leaflet/images/"; + await import("leaflet.markercluster"); + const map = Leaflet.map(mapElement); const style = document.createElement("link"); style.setAttribute("href", "/static/images/leaflet/leaflet.css"); style.setAttribute("rel", "stylesheet"); mapElement.parentNode.appendChild(style); + + const markerClusterStyle = document.createElement("link"); + markerClusterStyle.setAttribute( + "href", + "/static/images/leaflet/MarkerCluster.css" + ); + markerClusterStyle.setAttribute("rel", "stylesheet"); + mapElement.parentNode.appendChild(markerClusterStyle); + + const defaultMarkerClusterStyle = document.createElement("link"); + defaultMarkerClusterStyle.setAttribute( + "href", + "/static/images/leaflet/MarkerCluster.Default.css" + ); + defaultMarkerClusterStyle.setAttribute("rel", "stylesheet"); + mapElement.parentNode.appendChild(defaultMarkerClusterStyle); + map.setView([52.3731339, 4.8903147], 13); const tileLayer = createTileLayer(Leaflet).addTo(map); diff --git a/src/common/map/decorated_marker.ts b/src/common/map/decorated_marker.ts new file mode 100644 index 0000000000..69d4cb4cce --- /dev/null +++ b/src/common/map/decorated_marker.ts @@ -0,0 +1,32 @@ +import type { LatLngExpression, Layer, Map, MarkerOptions } from "leaflet"; +import { Marker } from "leaflet"; + +export class DecoratedMarker extends Marker { + decorationLayer: Layer | undefined; + + constructor( + latlng: LatLngExpression, + decorationLayer?: Layer, + options?: MarkerOptions + ) { + super(latlng, options); + + this.decorationLayer = decorationLayer; + } + + onAdd(map: Map) { + super.onAdd(map); + + // If decoration has been provided, add it to the map as well + this.decorationLayer?.addTo(map); + + return this; + } + + onRemove(map: Map) { + // If decoration has been provided, remove it from the map as well + this.decorationLayer?.remove(); + + return super.onRemove(map); + } +} diff --git a/src/components/map/ha-map.ts b/src/components/map/ha-map.ts index 13020419b5..b6c6ea9888 100644 --- a/src/components/map/ha-map.ts +++ b/src/components/map/ha-map.ts @@ -8,9 +8,10 @@ import type { Map, Marker, Polyline, + MarkerClusterGroup, } from "leaflet"; import type { PropertyValues } from "lit"; -import { ReactiveElement, css } from "lit"; +import { css, ReactiveElement } from "lit"; import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; import { formatDateTime } from "../../common/datetime/format_date_time"; @@ -26,6 +27,7 @@ import type { HomeAssistant, ThemeMode } from "../../types"; import { isTouch } from "../../util/is_touch"; import "../ha-icon-button"; import "./ha-entity-marker"; +import { DecoratedMarker } from "../../common/map/decorated_marker"; declare global { // for fire event @@ -84,6 +86,9 @@ export class HaMap extends ReactiveElement { @property({ type: Number }) public zoom = 14; + @property({ attribute: "cluster-markers", type: Boolean }) + public clusterMarkers = true; + @state() private _loaded = false; public leafletMap?: Map; @@ -96,10 +101,12 @@ export class HaMap extends ReactiveElement { private _mapFocusItems: (Marker | Circle)[] = []; - private _mapZones: (Marker | Circle)[] = []; + private _mapZones: DecoratedMarker[] = []; private _mapFocusZones: (Marker | Circle)[] = []; + private _mapCluster: MarkerClusterGroup | undefined; + private _mapPaths: (Polyline | CircleMarker)[] = []; private _clickCount = 0; @@ -151,6 +158,10 @@ export class HaMap extends ReactiveElement { } } + if (changedProps.has("clusterMarkers")) { + this._drawEntities(); + } + if (changedProps.has("_loaded") || changedProps.has("paths")) { this._drawPaths(); } @@ -175,6 +186,7 @@ export class HaMap extends ReactiveElement { ) { return; } + this._updateMapStyle(); } @@ -426,6 +438,11 @@ export class HaMap extends ReactiveElement { this._mapFocusZones = []; } + if (this._mapCluster) { + this._mapCluster.remove(); + this._mapCluster = undefined; + } + if (!this.entities) { return; } @@ -481,26 +498,24 @@ export class HaMap extends ReactiveElement { iconHTML = el.outerHTML; } - // create marker with the icon - this._mapZones.push( - Leaflet.marker([latitude, longitude], { - icon: Leaflet.divIcon({ - html: iconHTML, - iconSize: [24, 24], - className, - }), - interactive: this.interactiveZones, - title, - }) - ); - // create circle around it const circle = Leaflet.circle([latitude, longitude], { interactive: false, color: passive ? passiveZoneColor : zoneColor, radius, }); - this._mapZones.push(circle); + + const marker = new DecoratedMarker([latitude, longitude], circle, { + icon: Leaflet.divIcon({ + html: iconHTML, + iconSize: [24, 24], + className, + }), + interactive: this.interactiveZones, + title, + }); + + this._mapZones.push(marker); if ( this.fitZones && (typeof entity === "string" || entity.focus !== false) @@ -538,7 +553,7 @@ export class HaMap extends ReactiveElement { } // create marker with the icon - const marker = Leaflet.marker([latitude, longitude], { + const marker = new DecoratedMarker([latitude, longitude], undefined, { icon: Leaflet.divIcon({ html: entityMarker, iconSize: [48, 48], @@ -546,24 +561,33 @@ export class HaMap extends ReactiveElement { }), title: title, }); - this._mapItems.push(marker); if (typeof entity === "string" || entity.focus !== false) { this._mapFocusItems.push(marker); } // create circle around if entity has accuracy if (gpsAccuracy) { - this._mapItems.push( - Leaflet.circle([latitude, longitude], { - interactive: false, - color: darkPrimaryColor, - radius: gpsAccuracy, - }) - ); + marker.decorationLayer = Leaflet.circle([latitude, longitude], { + interactive: false, + color: darkPrimaryColor, + radius: gpsAccuracy, + }); } + + this._mapItems.push(marker); + } + + if (this.clusterMarkers) { + this._mapCluster = Leaflet.markerClusterGroup({ + showCoverageOnHover: false, + removeOutsideVisibleBounds: false, + }); + this._mapCluster.addLayers(this._mapItems); + map.addLayer(this._mapCluster); + } else { + this._mapItems.forEach((marker) => map.addLayer(marker)); } - this._mapItems.forEach((marker) => map.addLayer(marker)); this._mapZones.forEach((marker) => map.addLayer(marker)); } diff --git a/src/panels/lovelace/cards/hui-map-card.ts b/src/panels/lovelace/cards/hui-map-card.ts index ee74d074f9..cd2c94a83e 100644 --- a/src/panels/lovelace/cards/hui-map-card.ts +++ b/src/panels/lovelace/cards/hui-map-card.ts @@ -1,4 +1,8 @@ -import { mdiImageFilterCenterFocus } from "@mdi/js"; +import { + mdiDotsHexagon, + mdiGoogleCirclesCommunities, + mdiImageFilterCenterFocus, +} from "@mdi/js"; import type { HassEntities } from "home-assistant-js-websocket"; import type { LatLngTuple } from "leaflet"; import type { PropertyValues } from "lit"; @@ -72,6 +76,8 @@ class HuiMapCard extends LitElement implements LovelaceCard { @state() private _error?: { code: string; message: string }; + @state() private _clusterMarkers = true; + private _subscribed?: Promise<(() => Promise) | undefined>; public setConfig(config: MapCardConfig): void { @@ -170,18 +176,32 @@ class HuiMapCard extends LitElement implements LovelaceCard { .autoFit=${this._config.auto_fit || false} .fitZones=${this._config.fit_zones} .themeMode=${themeMode} + .clusterMarkers=${this._clusterMarkers} interactive-zones render-passive > - +
+ + +
`; @@ -320,6 +340,10 @@ class HuiMapCard extends LitElement implements LovelaceCard { this._map?.fitMap(); } + private _toggleClusterMarkers() { + this._clusterMarkers = !this._clusterMarkers; + } + private _getColor(entityId: string): string { let color = this._colorDict[entityId]; if (color) { @@ -464,11 +488,12 @@ class HuiMapCard extends LitElement implements LovelaceCard { overflow: hidden; } - ha-icon-button { + #buttons { position: absolute; top: 75px; left: 3px; - outline: none; + display: flex; + flex-direction: column; } #root { diff --git a/src/translations/en.json b/src/translations/en.json index 0afa5e133b..583f2aafb0 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -6310,7 +6310,8 @@ "description": "Home Assistant is starting, please wait…" }, "map": { - "reset_focus": "Reset focus" + "reset_focus": "Reset focus", + "toggle_grouping": "Toggle grouping" }, "energy": { "loading": "Loading…", diff --git a/yarn.lock b/yarn.lock index d0e9bb11e9..fb64df3d49 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4737,6 +4737,15 @@ __metadata: languageName: node linkType: hard +"@types/leaflet.markercluster@npm:1.5.5": + version: 1.5.5 + resolution: "@types/leaflet.markercluster@npm:1.5.5" + dependencies: + "@types/leaflet": "npm:*" + checksum: 10/17647d187ed8c9c38124005c3c45c0c7998c6359d8783e2ea162f9649b151862750c813eba2373054e90156a11a37af2b220429f937b302889b9d6e2105bf2ca + languageName: node + linkType: hard + "@types/leaflet@npm:*, @types/leaflet@npm:1.9.16": version: 1.9.16 resolution: "@types/leaflet@npm:1.9.16" @@ -9380,6 +9389,7 @@ __metadata: "@types/js-yaml": "npm:4.0.9" "@types/leaflet": "npm:1.9.16" "@types/leaflet-draw": "npm:1.0.11" + "@types/leaflet.markercluster": "npm:1.5.5" "@types/lodash.merge": "npm:4.6.9" "@types/luxon": "npm:3.4.2" "@types/mocha": "npm:10.0.10" @@ -9444,6 +9454,7 @@ __metadata: jszip: "npm:3.10.1" leaflet: "npm:1.9.4" leaflet-draw: "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch" + leaflet.markercluster: "npm:1.5.3" lint-staged: "npm:15.4.3" lit: "npm:2.8.0" lit-analyzer: "npm:2.0.3" @@ -10748,6 +10759,15 @@ __metadata: languageName: node linkType: hard +"leaflet.markercluster@npm:1.5.3": + version: 1.5.3 + resolution: "leaflet.markercluster@npm:1.5.3" + peerDependencies: + leaflet: ^1.3.1 + checksum: 10/28dc441de7012b19628144407bde89576f758dbea31ecb86e3412d1fb3a46723fb47d2ba45d9b858c2e65592479a127474fb1cbf7ff33b3023c4d14f851e5fe4 + languageName: node + linkType: hard + "leaflet@npm:1.9.4": version: 1.9.4 resolution: "leaflet@npm:1.9.4" From c7a46ec25b4e9ef49102771f2205b9b8ddc2c816 Mon Sep 17 00:00:00 2001 From: Logan Rosen Date: Tue, 18 Feb 2025 12:30:36 -0500 Subject: [PATCH 17/50] Improve ESLint config (#24290) * Improve ESLint config --- build-scripts/eslint.config.mjs | 26 +++---- eslint.config.mjs | 32 +++++---- gallery/eslint.config.mjs | 14 ++-- package.json | 3 +- test/.eslintrc | 5 -- yarn.lock | 117 ++++++++++++++++++-------------- 6 files changed, 103 insertions(+), 94 deletions(-) delete mode 100644 test/.eslintrc diff --git a/build-scripts/eslint.config.mjs b/build-scripts/eslint.config.mjs index 6c33f43ba5..781dcf3898 100644 --- a/build-scripts/eslint.config.mjs +++ b/build-scripts/eslint.config.mjs @@ -1,16 +1,16 @@ +// @ts-check + +import tseslint from "typescript-eslint"; import rootConfig from "../eslint.config.mjs"; -export default [ - ...rootConfig, - { - rules: { - "no-console": "off", - "import/no-extraneous-dependencies": "off", - "import/extensions": "off", - "import/no-dynamic-require": "off", - "global-require": "off", - "@typescript-eslint/no-require-imports": "off", - "prefer-arrow-callback": "off", - }, +export default tseslint.config(...rootConfig, { + rules: { + "no-console": "off", + "import/no-extraneous-dependencies": "off", + "import/extensions": "off", + "import/no-dynamic-require": "off", + "global-require": "off", + "@typescript-eslint/no-require-imports": "off", + "prefer-arrow-callback": "off", }, -]; +}); diff --git a/eslint.config.mjs b/eslint.config.mjs index a5986d29af..6907fdecbe 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,11 +1,16 @@ +// @ts-check + /* eslint-disable import/no-extraneous-dependencies */ import unusedImports from "eslint-plugin-unused-imports"; import globals from "globals"; -import tsParser from "@typescript-eslint/parser"; import path from "node:path"; import { fileURLToPath } from "node:url"; import js from "@eslint/js"; import { FlatCompat } from "@eslint/eslintrc"; +import tseslint from "typescript-eslint"; +import eslintConfigPrettier from "eslint-config-prettier"; +import { configs as litConfigs } from "eslint-plugin-lit"; +import { configs as wcConfigs } from "eslint-plugin-wc"; const _filename = fileURLToPath(import.meta.url); const _dirname = path.dirname(_filename); @@ -15,17 +20,14 @@ const compat = new FlatCompat({ allConfig: js.configs.all, }); -export default [ - ...compat.extends( - "airbnb-base", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/strict", - "plugin:@typescript-eslint/stylistic", - "plugin:wc/recommended", - "plugin:lit/all", - "plugin:lit-a11y/recommended", - "prettier" - ), +export default tseslint.config( + ...compat.extends("airbnb-base", "plugin:lit-a11y/recommended"), + eslintConfigPrettier, + litConfigs["flat/all"], + tseslint.configs.recommended, + tseslint.configs.strict, + tseslint.configs.stylistic, + wcConfigs["flat/recommended"], { plugins: { "unused-imports": unusedImports, @@ -43,7 +45,7 @@ export default [ Polymer: true, }, - parser: tsParser, + parser: tseslint.parser, ecmaVersion: 2020, sourceType: "module", @@ -184,5 +186,5 @@ export default [ ], "no-use-before-define": "off", }, - }, -]; + } +); diff --git a/gallery/eslint.config.mjs b/gallery/eslint.config.mjs index 95108521b0..1860147df8 100644 --- a/gallery/eslint.config.mjs +++ b/gallery/eslint.config.mjs @@ -1,10 +1,10 @@ +// @ts-check + +import tseslint from "typescript-eslint"; import rootConfig from "../eslint.config.mjs"; -export default [ - ...rootConfig, - { - rules: { - "no-console": "off", - }, +export default tseslint.config(...rootConfig, { + rules: { + "no-console": "off", }, -]; +}); diff --git a/package.json b/package.json index b6fa4fdd4b..bbe026e817 100644 --- a/package.json +++ b/package.json @@ -186,8 +186,6 @@ "@types/tar": "6.1.13", "@types/ua-parser-js": "0.7.39", "@types/webspeechapi": "0.0.29", - "@typescript-eslint/eslint-plugin": "8.24.0", - "@typescript-eslint/parser": "8.24.0", "@vitest/coverage-v8": "3.0.5", "babel-loader": "9.2.1", "babel-plugin-template-html-minifier": "4.1.0", @@ -227,6 +225,7 @@ "terser-webpack-plugin": "5.3.11", "ts-lit-plugin": "2.0.2", "typescript": "5.7.3", + "typescript-eslint": "8.24.1", "vitest": "3.0.5", "webpack-stats-plugin": "1.1.3", "webpackbar": "7.0.0", diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index 04cfba7cd0..0000000000 --- a/test/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "import/no-extraneous-dependencies": 0 - } -} diff --git a/yarn.lock b/yarn.lock index fb64df3d49..27d5fb8825 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5021,15 +5021,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.24.0" +"@typescript-eslint/eslint-plugin@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.24.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.24.0" - "@typescript-eslint/type-utils": "npm:8.24.0" - "@typescript-eslint/utils": "npm:8.24.0" - "@typescript-eslint/visitor-keys": "npm:8.24.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/type-utils": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -5038,64 +5038,64 @@ __metadata: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/2b65131dab6159285cd8688ae8fe4708e87f6aede7a6bcf65deec6f506a26f04409c7320d7957f59380f5b387fff2acfaa2c8117e2cbfc1b9368002e7905f616 + checksum: 10/4c455e98d47f8dc1ea12c0dae0a849de49b0ad9aa5f9591b2ba24c07b75af0782a349d13cf6c5c375c6e8ba43d12555f932d43d31f25c8848eceb972021c12ee languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/parser@npm:8.24.0" +"@typescript-eslint/parser@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/parser@npm:8.24.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.24.0" - "@typescript-eslint/types": "npm:8.24.0" - "@typescript-eslint/typescript-estree": "npm:8.24.0" - "@typescript-eslint/visitor-keys": "npm:8.24.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/b5c66a3208c69144cd5d0b7a2c763205ef8ae88eea76067186bab0909aa9756fe015616b98a7f252a5106aa5e86baeb98f9affbdc0f5d19863a2150f2431bfe0 + checksum: 10/9a0f86b140a2c63ff8eca17f40fe315d8a5b7ab51594e2630caff845717aab1c2138edd070e710d7edb0daf685d6bba827e983e8cb076b53d03eda07307b0113 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/scope-manager@npm:8.24.0" +"@typescript-eslint/scope-manager@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/scope-manager@npm:8.24.1" dependencies: - "@typescript-eslint/types": "npm:8.24.0" - "@typescript-eslint/visitor-keys": "npm:8.24.0" - checksum: 10/175032d4f714d68b734d7281c340e073a37d348010d308b9cccf8d63d745b8cc9515229e32dcd838acf4a85e21a4e8eff6c557c31ba45e36917e3417de32d723 + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" + checksum: 10/ab668c073c51cf801a1f5ef8578d0ae29d778d92b143cb1575bb7a867016f45ef4d044ce374fbe47606391f2d39b6963df725964e90af85bff1c435d8006b535 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/type-utils@npm:8.24.0" +"@typescript-eslint/type-utils@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/type-utils@npm:8.24.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.24.0" - "@typescript-eslint/utils": "npm:8.24.0" + "@typescript-eslint/typescript-estree": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.0.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/a6558d0b0ab7a43826b481c103c556abbafa93c9941d75d647266dc0f55e68950f44a63842a2e7839a7448329f9b7ee88c84913084438dbac38dba5efbc1afbc + checksum: 10/7161f6218f2f1a100142c50d71d5e470459821e3715a4d6717be3ae4e1ef8aac06c6144f1010690f15c34ee9d8330526324a8133e541aa7382439f180ccb2860 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/types@npm:8.24.0" - checksum: 10/ddaaec99c191830cc29ce289678d44f7201dd06c29540750ca4802b6bd2a6dfd8cc29b46ed270dc0198f23e742540bb1e4fe618b6b44e4e76bad7f774bd3fc4a +"@typescript-eslint/types@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/types@npm:8.24.1" + checksum: 10/f3f624d7494c02a35810988388e2d5cc35ac10860e455148faba0fe332c6b8cf4be0aa0c1e0f0012813e2d6e86c17aadadfd0c7c6e73433c064755df7d81535b languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.24.0" +"@typescript-eslint/typescript-estree@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.24.1" dependencies: - "@typescript-eslint/types": "npm:8.24.0" - "@typescript-eslint/visitor-keys": "npm:8.24.0" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -5104,32 +5104,32 @@ __metadata: ts-api-utils: "npm:^2.0.1" peerDependencies: typescript: ">=4.8.4 <5.8.0" - checksum: 10/89e451f5d2136b405d046823c93ac7065d90c7a9f084ffb324e374c769b17ee2580d3711ada1e1575331b234059148f173230e560b08efa3073f8f0c04ce1224 + checksum: 10/b0645010607d3469b85479344245ef1fd6bd24804271fb439280167ad87e9f05cdf6a2ba2ccbcdc946c339c323249a86dd1e7ce6e130eb6e73ea619795b76151 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/utils@npm:8.24.0" +"@typescript-eslint/utils@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/utils@npm:8.24.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.24.0" - "@typescript-eslint/types": "npm:8.24.0" - "@typescript-eslint/typescript-estree": "npm:8.24.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.24.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10/773a4085e45a94f5a64b34550e7d890b5418c69a9dcd58862410e7e0ded46e3380c8dd7d38baafaa93ef40b2a77320092bded3ca36f15b2f7ea6babeb831e590 + checksum: 10/90890afc1de2eaabf94fb80e03713b81e976d927fa998159d132a0cf17c093a1722e27be9a642c5b94104db6dedb86a15addac046853c1f608bdcef27cfb1fd1 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.24.0": - version: 8.24.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.24.0" +"@typescript-eslint/visitor-keys@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.24.1" dependencies: - "@typescript-eslint/types": "npm:8.24.0" + "@typescript-eslint/types": "npm:8.24.1" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/a93bc9e587784cbc47d6849f14581aa3f15574b187a7b98597362acbca43b06c36a6dfa889b5320ced62b182abf0b9759a694489d72fc7902cdea11830a7a535 + checksum: 10/94876bd771e050dadf4af6e2bbb3819d3a14407d69a643153eb56857dae982cd3b68ba644613c433449e305ec0fd6f4aeab573ceb8f8d25fea9c55396153d6b9 languageName: node linkType: hard @@ -9398,8 +9398,6 @@ __metadata: "@types/tar": "npm:6.1.13" "@types/ua-parser-js": "npm:0.7.39" "@types/webspeechapi": "npm:0.0.29" - "@typescript-eslint/eslint-plugin": "npm:8.24.0" - "@typescript-eslint/parser": "npm:8.24.0" "@vaadin/combo-box": "npm:24.6.5" "@vaadin/vaadin-themable-mixin": "npm:24.6.5" "@vibrant/color": "npm:4.0.0" @@ -9487,6 +9485,7 @@ __metadata: tsparticles-engine: "npm:2.12.0" tsparticles-preset-links: "npm:2.12.0" typescript: "npm:5.7.3" + typescript-eslint: "npm:8.24.1" ua-parser-js: "npm:2.0.2" vis-data: "npm:7.1.9" vis-network: "npm:9.1.9" @@ -14685,6 +14684,20 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:8.24.1": + version: 8.24.1 + resolution: "typescript-eslint@npm:8.24.1" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.24.1" + "@typescript-eslint/parser": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/c50e555c5a5a42f843d2a7d57315b35749eb05fdf2b264fd8471f8a825a744444fb534c0a6bb3f0086ad3b3dc0ef76da6ac3154a917af81c908016d5874cbbae + languageName: node + linkType: hard + "typescript@npm:5.7.3": version: 5.7.3 resolution: "typescript@npm:5.7.3" From ab4efb7412d3e1d6f7ad83d3656938128fbbd917 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 19 Feb 2025 10:30:24 +0100 Subject: [PATCH 18/50] Fix cursor jump in light color pickers (#24312) --- .../components/lights/light-color-rgb-picker.ts | 14 +++++++++++--- .../components/lights/light-color-temp-picker.ts | 13 +++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts b/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts index 6436e7d1e4..1cceea263b 100644 --- a/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts +++ b/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts @@ -49,6 +49,8 @@ class LightRgbColorPicker extends LitElement { @state() private _hsPickerValue?: [number, number]; + @state() private _isInteracting?: boolean; + protected render() { if (!this.stateObj) { return nothing; @@ -211,7 +213,10 @@ class LightRgbColorPicker extends LitElement { public willUpdate(changedProps: PropertyValues) { super.willUpdate(changedProps); - if (!changedProps.has("entityId") && !changedProps.has("hass")) { + if ( + this._isInteracting || + (!changedProps.has("entityId") && !changedProps.has("hass")) + ) { return; } @@ -219,10 +224,13 @@ class LightRgbColorPicker extends LitElement { } private _hsColorCursorMoved(ev: CustomEvent) { - if (!ev.detail.value) { + const color = ev.detail.value; + this._isInteracting = color !== undefined; + + if (color === undefined) { return; } - this._hsPickerValue = ev.detail.value; + this._hsPickerValue = color; this._throttleUpdateColor(); } diff --git a/src/dialogs/more-info/components/lights/light-color-temp-picker.ts b/src/dialogs/more-info/components/lights/light-color-temp-picker.ts index b9b1fe82f3..2f3480646d 100644 --- a/src/dialogs/more-info/components/lights/light-color-temp-picker.ts +++ b/src/dialogs/more-info/components/lights/light-color-temp-picker.ts @@ -22,7 +22,6 @@ import { DOMAIN_ATTRIBUTES_UNITS } from "../../../../data/entity_attributes"; declare global { interface HASSDomEvents { "color-changed": LightColor; - "color-hovered": LightColor | undefined; } } @@ -54,6 +53,8 @@ class LightColorTempPicker extends LitElement { @state() private _ctPickerValue?: number; + @state() private _isInteracting?: boolean; + protected render() { if (!this.stateObj) { return nothing; @@ -113,7 +114,7 @@ class LightColorTempPicker extends LitElement { public willUpdate(changedProps: PropertyValues) { super.willUpdate(changedProps); - if (!changedProps.has("stateObj")) { + if (this._isInteracting || !changedProps.has("stateObj")) { return; } @@ -123,16 +124,14 @@ class LightColorTempPicker extends LitElement { private _ctColorCursorMoved(ev: CustomEvent) { const ct = ev.detail.value; + this._isInteracting = ct !== undefined; + if (isNaN(ct) || this._ctPickerValue === ct) { return; } this._ctPickerValue = ct; - fireEvent(this, "color-hovered", { - color_temp_kelvin: ct, - }); - this._throttleUpdateColorTemp(); } @@ -143,8 +142,6 @@ class LightColorTempPicker extends LitElement { private _ctColorChanged(ev: CustomEvent) { const ct = ev.detail.value; - fireEvent(this, "color-hovered", undefined); - if (isNaN(ct) || this._ctPickerValue === ct) { return; } From 71b65f208ff919253db601870b7799dad3c49bb3 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:32:15 +0100 Subject: [PATCH 19/50] Fix hassio backup restore url (#24313) --- src/data/hassio/backup.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/hassio/backup.ts b/src/data/hassio/backup.ts index 0879ec28bd..09a410fe6b 100644 --- a/src/data/hassio/backup.ts +++ b/src/data/hassio/backup.ts @@ -233,11 +233,11 @@ export const restoreBackup = async ( type: HassioBackupDetail["type"], backupSlug: string, backupDetails: HassioPartialBackupCreateParams | HassioFullBackupCreateParams, - useSnapshotUrl: boolean + useBackupUrl: boolean ): Promise => { await hass.callApi>( "POST", - `hassio/${useSnapshotUrl ? "snapshots" : "backups"}/${backupSlug}/restore/${type}`, + `hassio/${useBackupUrl ? "backups" : "snapshots"}/${backupSlug}/restore/${type}`, backupDetails ); }; From 2801d071ba32490c1f1457d78352ca8a45389a8f Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:32:41 +0100 Subject: [PATCH 20/50] Fix custom retention label (#24304) --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index 583f2aafb0..fd3146e78a 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2469,7 +2469,7 @@ }, "retention": "Retention", "custom_retention": "Custom retention", - "custom_retention_label": "Clean up every", + "custom_retention_label": "Keep only", "retention_description": "Based on the maximum number of backups or how many days they should be kept.", "retention_presets": { "copies_3": "3 backups", From ad487470fdee410be0707a48e0cab49c6c86e26c Mon Sep 17 00:00:00 2001 From: Petar Petrov Date: Wed, 19 Feb 2025 16:05:32 +0200 Subject: [PATCH 21/50] Enable downsampling in echarts (#24311) * Enable downsampling in echarts * remove unneeded symbol set --- src/components/chart/ha-chart-base.ts | 10 +++++----- src/components/chart/state-history-chart-line.ts | 5 +++-- src/components/chart/statistics-chart.ts | 5 ++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/chart/ha-chart-base.ts b/src/components/chart/ha-chart-base.ts index deb89d24d2..a87b7aa3a2 100644 --- a/src/components/chart/ha-chart-base.ts +++ b/src/components/chart/ha-chart-base.ts @@ -521,14 +521,14 @@ export class HaChartBase extends LitElement { 0 ); if (dataSize > 10000) { - // for large datasets zr.flush takes 30-40% of the render time - // so we delay it a bit to avoid blocking the main thread + // delay the last bit of the render to avoid blocking the main thread + // this is not that impactful with sampling enabled but it doesn't hurt to have it const zr = this.chart.getZr(); - this._originalZrFlush = zr.flush.bind(zr); + this._originalZrFlush = zr.flush; zr.flush = () => { setTimeout(() => { - this._originalZrFlush?.(); - }, 10); + this._originalZrFlush?.call(zr); + }, 5); }; } } diff --git a/src/components/chart/state-history-chart-line.ts b/src/components/chart/state-history-chart-line.ts index f7e60f7804..27de961e41 100644 --- a/src/components/chart/state-history-chart-line.ts +++ b/src/components/chart/state-history-chart-line.ts @@ -354,9 +354,10 @@ export class StateHistoryChartLine extends LitElement { name: nameY, color, symbol: "circle", - step: "end", - animationDurationUpdate: 0, symbolSize: 1, + step: "end", + sampling: "minmax", + animationDurationUpdate: 0, lineStyle: { width: fill ? 0 : 1.5, }, diff --git a/src/components/chart/statistics-chart.ts b/src/components/chart/statistics-chart.ts index 7954d76010..5c2372826c 100644 --- a/src/components/chart/statistics-chart.ts +++ b/src/components/chart/statistics-chart.ts @@ -492,8 +492,8 @@ export class StatisticsChart extends LitElement { : this.hass.localize( `ui.components.statistics_charts.statistic_types.${type}` ), - symbol: "circle", - symbolSize: 0, + symbol: "none", + sampling: "minmax", animationDurationUpdate: 0, lineStyle: { width: 1.5, @@ -511,7 +511,6 @@ export class StatisticsChart extends LitElement { if (band && this.chartType === "line") { series.stack = `band-${statistic_id}`; series.stackStrategy = "all"; - (series as LineSeriesOption).symbol = "none"; if (drawBands && type === "max") { (series as LineSeriesOption).areaStyle = { color: color + "3F", From 694bb3088c6a43616735aef86c14ffa098997c38 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 19 Feb 2025 15:07:27 +0100 Subject: [PATCH 22/50] Improve margin for inline tile card feature (#24316) --- src/panels/lovelace/cards/hui-tile-card.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index c69b3c4ecf..a7fe97c773 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -416,15 +416,12 @@ export class HuiTileCard extends LitElement implements LovelaceCard { align-items: center; padding: 10px; flex: 1; + min-width: 0; box-sizing: border-box; pointer-events: none; gap: 10px; } - .container.horizontal .content { - width: 50%; - } - .vertical { flex-direction: column; text-align: center; @@ -458,9 +455,10 @@ export class HuiTileCard extends LitElement implements LovelaceCard { padding: 0 12px 12px 12px; } .container.horizontal hui-card-features { - width: 50%; + width: calc(50% - var(--column-gap, 0px) / 2 - 12px); + flex: none; --feature-height: 36px; - padding: 10px; + padding: 0 12px; padding-inline-start: 0; } From c5c067ef1959432c19a0278b91767928a8605296 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Wed, 19 Feb 2025 15:56:29 +0100 Subject: [PATCH 23/50] Create copyable textfield component (#24247) --- src/components/ha-copy-textfield.ts | 111 ++++++++++++++++++ .../config/cloud/account/cloud-remote-pref.ts | 85 ++------------ .../dialog-manage-cloudhook.ts | 56 ++------- src/translations/en.json | 5 +- 4 files changed, 134 insertions(+), 123 deletions(-) create mode 100644 src/components/ha-copy-textfield.ts diff --git a/src/components/ha-copy-textfield.ts b/src/components/ha-copy-textfield.ts new file mode 100644 index 0000000000..46bbb3cf72 --- /dev/null +++ b/src/components/ha-copy-textfield.ts @@ -0,0 +1,111 @@ +import { customElement, property, state } from "lit/decorators"; +import { css, html, LitElement, nothing } from "lit"; +import { mdiContentCopy, mdiEye, mdiEyeOff } from "@mdi/js"; + +import "./ha-button"; +import "./ha-icon-button"; +import "./ha-svg-icon"; +import "./ha-textfield"; +import type { HomeAssistant } from "../types"; +import { copyToClipboard } from "../common/util/copy-clipboard"; +import { showToast } from "../util/toast"; +import type { HaTextField } from "./ha-textfield"; + +@customElement("ha-copy-textfield") +export class HaCopyTextfield extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: "value" }) public value!: string; + + @property({ attribute: "masked-value" }) public maskedValue?: string; + + @property({ attribute: "label" }) public label?: string; + + @state() private _showMasked = true; + + public render() { + return html` +
+
+
` + : nothing} + @click=${this._focusInput} + > + ${this.maskedValue + ? html`` + : nothing} +
+ + + ${this.label || this.hass.localize("ui.common.copy")} + +
+ `; + } + + private _focusInput(ev) { + const inputElement = ev.currentTarget as HaTextField; + inputElement.select(); + } + + private _toggleMasked(): void { + this._showMasked = !this._showMasked; + } + + private async _copy(): Promise { + await copyToClipboard(this.value); + showToast(this, { + message: this.hass.localize("ui.common.copied_clipboard"), + }); + } + + static styles = css` + .container { + display: flex; + align-items: center; + gap: 8px; + margin-top: 8px; + } + + .textfield-container { + position: relative; + flex: 1; + } + + .textfield-container ha-textfield { + display: block; + } + + .toggle-unmasked { + position: absolute; + top: 8px; + right: 8px; + inset-inline-start: initial; + inset-inline-end: 8px; + --mdc-icon-button-size: 40px; + --mdc-icon-size: 20px; + color: var(--secondary-text-color); + direction: var(--direction); + } + `; +} + +declare global { + interface HTMLElementTagNameMap { + "ha-copy-textfield": HaCopyTextfield; + } +} diff --git a/src/panels/config/cloud/account/cloud-remote-pref.ts b/src/panels/config/cloud/account/cloud-remote-pref.ts index 60ddbd50a0..d7ff6a8049 100644 --- a/src/panels/config/cloud/account/cloud-remote-pref.ts +++ b/src/panels/config/cloud/account/cloud-remote-pref.ts @@ -1,17 +1,13 @@ -import { mdiContentCopy, mdiEye, mdiEyeOff, mdiHelpCircle } from "@mdi/js"; +import { mdiHelpCircle } from "@mdi/js"; import { LitElement, css, html, nothing } from "lit"; -import { customElement, property, state } from "lit/decorators"; +import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { copyToClipboard } from "../../../../common/util/copy-clipboard"; import "../../../../components/ha-alert"; import "../../../../components/ha-button"; import "../../../../components/ha-card"; import "../../../../components/ha-expansion-panel"; -import "../../../../components/ha-formfield"; -import "../../../../components/ha-radio"; import "../../../../components/ha-settings-row"; import "../../../../components/ha-switch"; -import "../../../../components/ha-textfield"; import { formatDate } from "../../../../common/datetime/format_date"; import type { HaSwitch } from "../../../../components/ha-switch"; @@ -25,6 +21,7 @@ import type { HomeAssistant } from "../../../../types"; import { showToast } from "../../../../util/toast"; import { showCloudCertificateDialog } from "../dialog-cloud-certificate/show-dialog-cloud-certificate"; import { obfuscateUrl } from "../../../../util/url"; +import "../../../../components/ha-copy-textfield"; @customElement("cloud-remote-pref") export class CloudRemotePref extends LitElement { @@ -34,8 +31,6 @@ export class CloudRemotePref extends LitElement { @property({ type: Boolean }) public narrow = false; - @state() private _unmaskedUrl = false; - protected render() { if (!this.cloudStatus) { return nothing; @@ -139,37 +134,13 @@ export class CloudRemotePref extends LitElement { )}

`} -
-
-
` - } - > - -
- - - ${this.hass.localize("ui.panel.config.common.copy_link")} - -
+ + { - const url = ev.currentTarget.url; - await copyToClipboard(url); - showToast(this, { - message: this.hass.localize("ui.common.copied_clipboard"), - }); - } - static styles = css` .preparing { padding: 0 16px 16px; @@ -335,30 +294,6 @@ export class CloudRemotePref extends LitElement { display: block; margin-bottom: 16px; } - .url-container { - display: flex; - align-items: center; - gap: 8px; - margin-top: 8px; - } - .textfield-container { - position: relative; - flex: 1; - } - .textfield-container ha-textfield { - display: block; - } - .toggle-unmasked-url { - position: absolute; - top: 8px; - right: 8px; - inset-inline-start: initial; - inset-inline-end: 8px; - --mdc-icon-button-size: 40px; - --mdc-icon-size: 20px; - color: var(--secondary-text-color); - direction: var(--direction); - } hr { border: none; height: 1px; diff --git a/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts index b1c313fe6b..909866095e 100644 --- a/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts +++ b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts @@ -1,27 +1,23 @@ import "@material/mwc-button"; -import { mdiContentCopy, mdiOpenInNew } from "@mdi/js"; +import { mdiOpenInNew } from "@mdi/js"; import type { CSSResultGroup } from "lit"; import { css, html, LitElement, nothing } from "lit"; -import { query, state } from "lit/decorators"; +import { state } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { copyToClipboard } from "../../../../common/util/copy-clipboard"; import { createCloseHeading } from "../../../../components/ha-dialog"; -import "../../../../components/ha-textfield"; -import type { HaTextField } from "../../../../components/ha-textfield"; import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import { haStyle, haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; import { documentationUrl } from "../../../../util/documentation-url"; -import { showToast } from "../../../../util/toast"; import type { WebhookDialogParams } from "./show-dialog-manage-cloudhook"; +import "../../../../components/ha-copy-textfield"; + export class DialogManageCloudhook extends LitElement { protected hass?: HomeAssistant; @state() private _params?: WebhookDialogParams; - @query("ha-textfield") _input!: HaTextField; - public showDialog(params: WebhookDialogParams) { this._params = params; } @@ -82,21 +78,12 @@ export class DialogManageCloudhook extends LitElement {

- - - + .label=${this.hass!.localize("ui.panel.config.common.copy_link")} + >
{ - if (!this.hass) return; - ev.stopPropagation(); - const inputElement = ev.target.parentElement as HaTextField; - inputElement.select(); - const url = this.hass.hassUrl(inputElement.value); - - await copyToClipboard(url); - showToast(this, { - message: this.hass.localize("ui.common.copied_clipboard"), - }); - } - static get styles(): CSSResultGroup { return [ haStyle, @@ -163,13 +132,6 @@ export class DialogManageCloudhook extends LitElement { ha-dialog { width: 650px; } - ha-textfield { - display: block; - } - ha-textfield > ha-icon-button { - --mdc-icon-button-size: 24px; - --mdc-icon-size: 18px; - } button.link { color: var(--primary-color); text-decoration: none; diff --git a/src/translations/en.json b/src/translations/en.json index fd3146e78a..e04de83107 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -370,7 +370,10 @@ "name": "Name", "optional": "optional", "default": "Default", - "dont_save": "Don't save" + "dont_save": "Don't save", + "copy": "Copy", + "show": "Show", + "hide": "Hide" }, "components": { "selectors": { From 5cddc6e5c6e4ee7e71d4f24e3e80d5b7b55c9c60 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Wed, 19 Feb 2025 20:34:49 +0100 Subject: [PATCH 24/50] Decrease max cluster radius (#24322) --- src/components/map/ha-map.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/map/ha-map.ts b/src/components/map/ha-map.ts index b6c6ea9888..b752cc26ea 100644 --- a/src/components/map/ha-map.ts +++ b/src/components/map/ha-map.ts @@ -581,6 +581,7 @@ export class HaMap extends ReactiveElement { this._mapCluster = Leaflet.markerClusterGroup({ showCoverageOnHover: false, removeOutsideVisibleBounds: false, + maxClusterRadius: 40, }); this._mapCluster.addLayers(this._mapItems); map.addLayer(this._mapCluster); From d22a82c4a6da86998c7e7a25e827e37b51cba4b5 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:57:34 -0800 Subject: [PATCH 25/50] Teardown and rebuild element editor when switching stack cards (#24065) --- .../config-elements/hui-stack-card-editor.ts | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts index 1d5d945dbc..595eae1866 100644 --- a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts @@ -21,6 +21,7 @@ import { optional, string, } from "superstruct"; +import { keyed } from "lit/directives/keyed"; import type { HaFormSchema, SchemaUnion, @@ -84,6 +85,8 @@ export class HuiStackCardEditor @state() protected _guiModeAvailable? = true; + protected _keys = new WeakMap(); + protected _schema: readonly HaFormSchema[] = SCHEMA; @query("hui-card-element-editor") @@ -199,14 +202,16 @@ export class HuiStackCardEditor @click=${this._handleDeleteCard} > - - + ${keyed( + this._getKey(this._config.cards[selected]), + html`` + )} ` : html` Date: Wed, 19 Feb 2025 23:42:17 -0800 Subject: [PATCH 26/50] Fix catching errors in alarm-control-panel more-info (#24328) --- .../ha-state-control-alarm_control_panel-modes.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/state-control/alarm_control_panel/ha-state-control-alarm_control_panel-modes.ts b/src/state-control/alarm_control_panel/ha-state-control-alarm_control_panel-modes.ts index 7cc31275f1..26f58ca468 100644 --- a/src/state-control/alarm_control_panel/ha-state-control-alarm_control_panel-modes.ts +++ b/src/state-control/alarm_control_panel/ha-state-control-alarm_control_panel-modes.ts @@ -47,7 +47,12 @@ export class HaStateControlAlarmControlPanelModes extends LitElement { } private async _setMode(mode: AlarmMode) { - setProtectedAlarmControlPanelMode(this, this.hass!, this.stateObj!, mode); + await setProtectedAlarmControlPanelMode( + this, + this.hass!, + this.stateObj!, + mode + ); } private async _valueChanged(ev: CustomEvent) { From f3d614b0d3845d8530b00a5d47bf17f29a855bda Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 20 Feb 2025 08:44:49 +0100 Subject: [PATCH 27/50] Make quick bar more keyboard accessible (#24321) --- src/dialogs/quick-bar/ha-quick-bar.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index 8c108e1f5f..6fa529e2c7 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -251,6 +251,7 @@ export class QuickBar extends LitElement { ${this._opened ? html` ${item.primaryText} ${item.area @@ -346,6 +348,7 @@ export class QuickBar extends LitElement { .item=${item} index=${ifDefined(index)} graphic="icon" + tabindex="0" > ${item.iconPath ? html` @@ -375,6 +378,7 @@ export class QuickBar extends LitElement { index=${ifDefined(index)} class="command-item" hasMeta + tabindex="0" > Date: Wed, 19 Feb 2025 23:50:00 -0800 Subject: [PATCH 28/50] Fix siren advanced controls (#24318) --- .../siren/ha-more-info-siren-advanced-controls.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/dialogs/more-info/components/siren/ha-more-info-siren-advanced-controls.ts b/src/dialogs/more-info/components/siren/ha-more-info-siren-advanced-controls.ts index 93fa0df503..4f6b3719b0 100644 --- a/src/dialogs/more-info/components/siren/ha-more-info-siren-advanced-controls.ts +++ b/src/dialogs/more-info/components/siren/ha-more-info-siren-advanced-controls.ts @@ -99,7 +99,12 @@ class MoreInfoSirenAdvancedControls extends LitElement { this._stateObj.attributes.available_tones ).map( ([toneId, toneName]) => html` - ${toneName} ` @@ -179,7 +184,7 @@ class MoreInfoSirenAdvancedControls extends LitElement { await this.hass.callService("siren", "turn_on", { entity_id: this._stateObj!.entity_id, tone: this._tone, - volume: this._volume, + volume_level: this._volume, duration: this._duration, }); } From 91bd5cba086d8542f0dac6acf1801ff05ac98e50 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 20 Feb 2025 09:16:14 +0100 Subject: [PATCH 29/50] Add switch toggle feature to tile card (#24325) * Add tile switch toggle feature * Remove _currentState --- .../hui-switch-toggle-card-feature.ts | 109 ++++++++++++++++++ src/panels/lovelace/card-features/types.ts | 5 + .../create-card-feature-element.ts | 2 + .../hui-card-features-editor.ts | 3 + src/translations/en.json | 3 + 5 files changed, 122 insertions(+) create mode 100644 src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts diff --git a/src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts b/src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts new file mode 100644 index 0000000000..b316efefad --- /dev/null +++ b/src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts @@ -0,0 +1,109 @@ +import { mdiPowerOff, mdiPower } from "@mdi/js"; +import type { HassEntity } from "home-assistant-js-websocket"; +import type { TemplateResult } from "lit"; +import { LitElement, html } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import { styleMap } from "lit/directives/style-map"; +import { computeDomain } from "../../../common/entity/compute_domain"; +import { stateColorCss } from "../../../common/entity/state_color"; +import "../../../components/ha-control-select"; +import type { ControlSelectOption } from "../../../components/ha-control-select"; +import { UNAVAILABLE } from "../../../data/entity"; +import type { HomeAssistant } from "../../../types"; +import type { LovelaceCardFeature } from "../types"; +import { cardFeatureStyles } from "./common/card-feature-styles"; +import type { SwitchToggleCardFeatureConfig } from "./types"; +import { showToast } from "../../../util/toast"; + +export const supportsSwitchToggleCardFeature = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + return domain === "switch"; +}; + +@customElement("hui-switch-toggle-card-feature") +class HuiSwitchToggleCardFeature + extends LitElement + implements LovelaceCardFeature +{ + @property({ attribute: false }) public hass?: HomeAssistant; + + @property({ attribute: false }) public stateObj?: HassEntity; + + @state() private _config?: SwitchToggleCardFeatureConfig; + + static getStubConfig(): SwitchToggleCardFeatureConfig { + return { + type: "switch-toggle", + }; + } + + public setConfig(config: SwitchToggleCardFeatureConfig): void { + if (!config) { + throw new Error("Invalid configuration"); + } + this._config = config; + } + + protected render(): TemplateResult | null { + if ( + !this._config || + !this.hass || + !this.stateObj || + !supportsSwitchToggleCardFeature(this.stateObj) + ) { + return null; + } + + const color = stateColorCss(this.stateObj); + + const options = ["on", "off"].map((entityState) => ({ + value: entityState, + label: this.hass!.formatEntityState(this.stateObj!, entityState), + path: entityState === "on" ? mdiPower : mdiPowerOff, + })); + + return html` + + + `; + } + + private async _valueChanged(ev: CustomEvent) { + const newState = (ev.detail as any).value; + + if (newState === this.stateObj!.state) return; + const service = newState === "on" ? "turn_on" : "turn_off"; + + try { + await this.hass!.callService("switch", service, { + entity_id: this.stateObj!.entity_id, + }); + } catch (_err) { + showToast(this, { + message: this.hass!.localize("ui.notification_toast.action_failed", { + service: "switch." + service, + }), + duration: 5000, + dismissable: true, + }); + } + } + + static styles = cardFeatureStyles; +} + +declare global { + interface HTMLElementTagNameMap { + "hui-switch-toggle-card-feature": HuiSwitchToggleCardFeature; + } +} diff --git a/src/panels/lovelace/card-features/types.ts b/src/panels/lovelace/card-features/types.ts index 24349dfe31..b17bf97c8b 100644 --- a/src/panels/lovelace/card-features/types.ts +++ b/src/panels/lovelace/card-features/types.ts @@ -88,6 +88,10 @@ export interface SelectOptionsCardFeatureConfig { options?: string[]; } +export interface SwitchToggleCardFeatureConfig { + type: "switch-toggle"; +} + export interface NumericInputCardFeatureConfig { type: "numeric-input"; style?: "buttons" | "slider"; @@ -168,6 +172,7 @@ export type LovelaceCardFeatureConfig = | MediaPlayerVolumeSliderCardFeatureConfig | NumericInputCardFeatureConfig | SelectOptionsCardFeatureConfig + | SwitchToggleCardFeatureConfig | TargetHumidityCardFeatureConfig | TargetTemperatureCardFeatureConfig | UpdateActionsCardFeatureConfig diff --git a/src/panels/lovelace/create-element/create-card-feature-element.ts b/src/panels/lovelace/create-element/create-card-feature-element.ts index 8cad72f8a8..550bfccb0a 100644 --- a/src/panels/lovelace/create-element/create-card-feature-element.ts +++ b/src/panels/lovelace/create-element/create-card-feature-element.ts @@ -20,6 +20,7 @@ import "../card-features/hui-lock-open-door-card-feature"; import "../card-features/hui-media-player-volume-slider-card-feature"; import "../card-features/hui-numeric-input-card-feature"; import "../card-features/hui-select-options-card-feature"; +import "../card-features/hui-switch-toggle-card-feature"; import "../card-features/hui-target-temperature-card-feature"; import "../card-features/hui-target-humidity-card-feature"; import "../card-features/hui-update-actions-card-feature"; @@ -55,6 +56,7 @@ const TYPES = new Set([ "media-player-volume-slider", "numeric-input", "select-options", + "switch-toggle", "target-humidity", "target-temperature", "update-actions", diff --git a/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts b/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts index 32170317b1..a8008d7148 100644 --- a/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts @@ -40,6 +40,7 @@ import { supportsLockOpenDoorCardFeature } from "../../card-features/hui-lock-op import { supportsMediaPlayerVolumeSliderCardFeature } from "../../card-features/hui-media-player-volume-slider-card-feature"; import { supportsNumericInputCardFeature } from "../../card-features/hui-numeric-input-card-feature"; import { supportsSelectOptionsCardFeature } from "../../card-features/hui-select-options-card-feature"; +import { supportsSwitchToggleCardFeature } from "../../card-features/hui-switch-toggle-card-feature"; import { supportsTargetHumidityCardFeature } from "../../card-features/hui-target-humidity-card-feature"; import { supportsTargetTemperatureCardFeature } from "../../card-features/hui-target-temperature-card-feature"; import { supportsUpdateActionsCardFeature } from "../../card-features/hui-update-actions-card-feature"; @@ -74,6 +75,7 @@ const UI_FEATURE_TYPES = [ "media-player-volume-slider", "numeric-input", "select-options", + "switch-toggle", "target-humidity", "target-temperature", "update-actions", @@ -132,6 +134,7 @@ const SUPPORTS_FEATURE_TYPES: Record< "update-actions": supportsUpdateActionsCardFeature, "vacuum-commands": supportsVacuumCommandsCardFeature, "water-heater-operation-modes": supportsWaterHeaterOperationModesCardFeature, + "switch-toggle": supportsSwitchToggleCardFeature, }; const customCardFeatures = getCustomCardFeatures(); diff --git a/src/translations/en.json b/src/translations/en.json index e04de83107..279a57487e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -7343,6 +7343,9 @@ "options": "Options", "customize_options": "Customize options" }, + "switch-toggle": { + "label": "Switch toggle" + }, "numeric-input": { "label": "Numeric input", "style": "Style", From 90732821741b8d01ce603c45b5d68c7ed40d1b95 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 20 Feb 2025 11:40:39 +0100 Subject: [PATCH 30/50] Add text only style to markdown card (#24329) --- .../lovelace/cards/hui-markdown-card.ts | 38 ++++++--- src/panels/lovelace/cards/types.ts | 1 + .../hui-markdown-card-editor.ts | 78 ++++++++++++++----- src/translations/en.json | 5 ++ 4 files changed, 92 insertions(+), 30 deletions(-) diff --git a/src/panels/lovelace/cards/hui-markdown-card.ts b/src/panels/lovelace/cards/hui-markdown-card.ts index 9e6883fc94..b1f2d71ca9 100644 --- a/src/panels/lovelace/cards/hui-markdown-card.ts +++ b/src/panels/lovelace/cards/hui-markdown-card.ts @@ -107,18 +107,26 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { return html` ${this._error - ? html`${this._error}` + ? html` + + ${this._error} + + ` : nothing} - + @@ -228,11 +236,19 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { margin-bottom: 8px; } ha-markdown { - padding: 0 16px 16px; + padding: 16px; word-wrap: break-word; } - ha-markdown.no-header { - padding-top: 16px; + .with-header ha-markdown { + padding: 0 16px 16px; + } + .text-only { + background: none; + box-shadow: none; + border: none; + } + .text-only ha-markdown { + padding: 2px 4px; } `; } diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index c1c3f856f1..9771067a18 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -336,6 +336,7 @@ export interface MapCardConfig extends LovelaceCardConfig { export interface MarkdownCardConfig extends LovelaceCardConfig { type: "markdown"; content: string; + text_only?: boolean; title?: string; card_size?: number; entity_ids?: string | string[]; diff --git a/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts index e6f1c29827..8b96938011 100644 --- a/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts @@ -1,29 +1,28 @@ import { html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; -import { assert, assign, object, optional, string } from "superstruct"; +import { assert, assign, boolean, object, optional, string } from "superstruct"; +import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-form/ha-form"; -import type { SchemaUnion } from "../../../../components/ha-form/types"; +import type { + HaFormSchema, + SchemaUnion, +} from "../../../../components/ha-form/types"; import type { HomeAssistant } from "../../../../types"; import type { MarkdownCardConfig } from "../../cards/types"; import type { LovelaceCardEditor } from "../../types"; import { baseLovelaceCardConfig } from "../structs/base-card-struct"; +import type { LocalizeFunc } from "../../../../common/translations/localize"; const cardConfigStruct = assign( baseLovelaceCardConfig, object({ + text_only: optional(boolean()), title: optional(string()), content: string(), - theme: optional(string()), }) ); -const SCHEMA = [ - { name: "title", selector: { text: {} } }, - { name: "content", required: true, selector: { template: {} } }, - { name: "theme", selector: { theme: {} } }, -] as const; - @customElement("hui-markdown-card-editor") export class HuiMarkdownCardEditor extends LitElement @@ -38,16 +37,51 @@ export class HuiMarkdownCardEditor this._config = config; } + private _schema = memoizeOne( + (localize: LocalizeFunc, text_only: boolean) => + [ + { + name: "style", + required: true, + selector: { + select: { + mode: "dropdown", + options: ["card", "text-only"].map((style) => ({ + label: localize( + `ui.panel.lovelace.editor.card.markdown.style_options.${style}` + ), + value: style, + })), + }, + }, + }, + ...(!text_only + ? ([{ name: "title", selector: { text: {} } }] as const) + : []), + { name: "content", required: true, selector: { template: {} } }, + ] as const satisfies HaFormSchema[] + ); + protected render() { if (!this.hass || !this._config) { return nothing; } + const data = { + ...this._config, + style: this._config.text_only ? "text-only" : "card", + }; + + const schema = this._schema( + this.hass.localize, + this._config.text_only || false + ); + return html` @@ -55,17 +89,23 @@ export class HuiMarkdownCardEditor } private _valueChanged(ev: CustomEvent): void { - fireEvent(this, "config-changed", { config: ev.detail.value }); + const config = { ...ev.detail.value }; + + if (config.style === "text-only") { + config.text_only = true; + } else { + delete config.text_only; + } + delete config.style; + + fireEvent(this, "config-changed", { config }); } - private _computeLabelCallback = (schema: SchemaUnion) => { + private _computeLabelCallback = ( + schema: SchemaUnion> + ) => { switch (schema.name) { - case "theme": - return `${this.hass!.localize( - "ui.panel.lovelace.editor.card.generic.theme" - )} (${this.hass!.localize( - "ui.panel.lovelace.editor.card.config.optional" - )})`; + case "style": case "content": return this.hass!.localize( `ui.panel.lovelace.editor.card.markdown.${schema.name}` diff --git a/src/translations/en.json b/src/translations/en.json index 279a57487e..7620768411 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -7048,6 +7048,11 @@ "markdown": { "name": "Markdown", "content": "Content", + "style": "Style", + "style_options": { + "card": "Card", + "text-only": "Text only" + }, "description": "The Markdown card is used to render Markdown." }, "media-control": { From fb1ee2ed1dd1ac0125c8566b0cf24568d55435b5 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:14:40 +0100 Subject: [PATCH 31/50] Remove toggles from ha-icon-button (#24331) --- src/components/ha-copy-textfield.ts | 1 - src/components/ha-form/ha-form-string.ts | 1 - src/components/ha-password-field.ts | 1 - src/components/ha-selector/ha-selector-text.ts | 1 - src/panels/config/network/ha-config-url-form.ts | 2 -- 5 files changed, 6 deletions(-) diff --git a/src/components/ha-copy-textfield.ts b/src/components/ha-copy-textfield.ts index 46bbb3cf72..4980524130 100644 --- a/src/components/ha-copy-textfield.ts +++ b/src/components/ha-copy-textfield.ts @@ -40,7 +40,6 @@ export class HaCopyTextfield extends LitElement { ${this.maskedValue ? html` ${this.selector.text?.type === "password" ? html` Date: Thu, 20 Feb 2025 12:27:39 +0100 Subject: [PATCH 32/50] Extract saving card config from card editor (#24319) * Extract saving card config from card editor * Await * Add try/catch * Remove unused translations * Remove duration --- .../lovelace/components/hui-card-edit-mode.ts | 18 ++++- .../lovelace/components/hui-card-options.ts | 7 +- .../card-editor/hui-dialog-create-card.ts | 22 ++++- .../card-editor/hui-dialog-edit-card.ts | 80 ++++++------------- .../card-editor/show-edit-card-dialog.ts | 19 ++--- src/panels/lovelace/sections/hui-section.ts | 19 ++++- src/panels/lovelace/views/hui-view.ts | 18 ++++- 7 files changed, 100 insertions(+), 83 deletions(-) diff --git a/src/panels/lovelace/components/hui-card-edit-mode.ts b/src/panels/lovelace/components/hui-card-edit-mode.ts index ff22edd0c5..8d88907260 100644 --- a/src/panels/lovelace/components/hui-card-edit-mode.ts +++ b/src/panels/lovelace/components/hui-card-edit-mode.ts @@ -23,8 +23,10 @@ import type { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; +import { addCard } from "../editor/config-util"; import type { LovelaceCardPath } from "../editor/lovelace-path"; import { + findLovelaceContainer, findLovelaceItems, getLovelaceContainerPath, parseLovelaceCardPath, @@ -253,14 +255,24 @@ export class HuiCardEditMode extends LitElement { } private _duplicateCard(): void { - const { cardIndex } = parseLovelaceCardPath(this.path!); + const { cardIndex, sectionIndex } = parseLovelaceCardPath(this.path!); const containerPath = getLovelaceContainerPath(this.path!); + const sectionConfig = + sectionIndex !== undefined + ? findLovelaceContainer(this.lovelace!.config, containerPath) + : undefined; + const cardConfig = this._cards![cardIndex]; + showEditCardDialog(this, { lovelaceConfig: this.lovelace!.config, - saveConfig: this.lovelace!.saveConfig, - path: containerPath, + saveCardConfig: async (config) => { + const newConfig = addCard(this.lovelace!.config, containerPath, config); + await this.lovelace!.saveConfig(newConfig); + }, cardConfig, + sectionConfig, + isNew: true, }); } diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index d27c21d9ca..b74d609f96 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -278,9 +278,12 @@ export class HuiCardOptions extends LitElement { const cardConfig = this._cards![cardIndex]; showEditCardDialog(this, { lovelaceConfig: this.lovelace!.config, - saveConfig: this.lovelace!.saveConfig, - path: containerPath, + saveCardConfig: async (config) => { + const newConfig = addCard(this.lovelace!.config, containerPath, config); + await this.lovelace!.saveConfig(newConfig); + }, cardConfig, + isNew: true, }); } diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts index dcc3e49167..403bc7c31e 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts @@ -3,10 +3,10 @@ import "@material/mwc-tab/mwc-tab"; import { mdiClose } from "@mdi/js"; import type { CSSResultGroup } from "lit"; import { css, html, LitElement, nothing } from "lit"; -import { ifDefined } from "lit/directives/if-defined"; import { customElement, property, state } from "lit/decorators"; import { cache } from "lit/directives/cache"; import { classMap } from "lit/directives/class-map"; +import { ifDefined } from "lit/directives/if-defined"; import memoize from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; import { computeDomain } from "../../../../common/entity/compute_domain"; @@ -24,6 +24,7 @@ import { computeCards, computeSection, } from "../../common/generate-lovelace-config"; +import { addCard } from "../config-util"; import { findLovelaceContainer, parseLovelaceContainerPath, @@ -241,11 +242,24 @@ export class HuiCreateDialogCard } } + const lovelaceConfig = this._params!.lovelaceConfig; + const containerPath = this._params!.path; + const saveConfig = this._params!.saveConfig; + + const sectionConfig = + containerPath.length === 2 + ? findLovelaceContainer(lovelaceConfig, containerPath) + : undefined; + showEditCardDialog(this, { - lovelaceConfig: this._params!.lovelaceConfig, - saveConfig: this._params!.saveConfig, - path: this._params!.path, + lovelaceConfig, + saveCardConfig: async (newCardConfig) => { + const newConfig = addCard(lovelaceConfig, containerPath, newCardConfig); + await saveConfig(newConfig); + }, cardConfig: config, + sectionConfig, + isNew: true, }); this.closeDialog(); diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index e0720420f2..a1fc6de482 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -13,7 +13,6 @@ import "../../../../components/ha-dialog-header"; import "../../../../components/ha-icon-button"; import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; import type { LovelaceSectionConfig } from "../../../../data/lovelace/config/section"; -import type { LovelaceViewConfig } from "../../../../data/lovelace/config/view"; import { getCustomCardEntry, isCustomType, @@ -23,13 +22,12 @@ import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog- import type { HassDialog } from "../../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; +import { showToast } from "../../../../util/toast"; import { showSaveSuccessToast } from "../../../../util/toast-saved-success"; import "../../cards/hui-card"; import "../../sections/hui-section"; -import { addCard, replaceCard } from "../config-util"; import { getCardDocumentationURL } from "../get-dashboard-documentation-url"; import type { ConfigChangedEvent } from "../hui-element-editor"; -import { findLovelaceContainer } from "../lovelace-path"; import type { GUIModeChangedEvent } from "../types"; import "./hui-card-element-editor"; import type { HuiCardElementEditor } from "./hui-card-element-editor"; @@ -59,9 +57,7 @@ export class HuiDialogEditCard @state() private _cardConfig?: LovelaceCardConfig; - @state() private _containerConfig!: - | LovelaceViewConfig - | LovelaceSectionConfig; + @state() private _sectionConfig?: LovelaceSectionConfig; @state() private _saving = false; @@ -85,23 +81,10 @@ export class HuiDialogEditCard this._GUImode = true; this._guiModeAvailable = true; - const containerConfig = findLovelaceContainer( - params.lovelaceConfig, - params.path - ); + this._sectionConfig = this._params.sectionConfig; - if ("strategy" in containerConfig) { - throw new Error("Can't edit strategy"); - } - - this._containerConfig = containerConfig; - - if ("cardConfig" in params) { - this._cardConfig = params.cardConfig; - this._dirty = true; - } else { - this._cardConfig = this._containerConfig.cards?.[params.cardIndex]; - } + this._cardConfig = params.cardConfig; + this._dirty = Boolean(this._params.isNew); this.large = false; if (this._cardConfig && !Object.isFrozen(this._cardConfig)) { @@ -156,12 +139,12 @@ export class HuiDialogEditCard }; protected render() { - if (!this._params) { + if (!this._params || !this._cardConfig) { return nothing; } let heading: string; - if (this._cardConfig && this._cardConfig.type) { + if (this._cardConfig.type) { let cardName: string | undefined; if (isCustomType(this._cardConfig.type)) { // prettier-ignore @@ -181,13 +164,6 @@ export class HuiDialogEditCard "ui.panel.lovelace.editor.edit_card.typed_header", { type: cardName } ); - } else if (!this._cardConfig) { - heading = this._containerConfig.title - ? this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.pick_card_view_title", - { name: this._containerConfig.title } - ) - : this.hass!.localize("ui.panel.lovelace.editor.edit_card.pick_card"); } else { heading = this.hass!.localize( "ui.panel.lovelace.editor.edit_card.header" @@ -230,10 +206,8 @@ export class HuiDialogEditCard
- ${this._isInSection + ${this._sectionConfig ? html` { + (cardConfig: LovelaceCardConfig) => { const { cards, title, ...containerConfig } = this - ._containerConfig as LovelaceSectionConfig; + ._sectionConfig as LovelaceSectionConfig; return { ...containerConfig, @@ -411,20 +381,18 @@ export class HuiDialogEditCard return; } this._saving = true; - const path = this._params!.path; - await this._params!.saveConfig( - "cardConfig" in this._params! - ? addCard(this._params!.lovelaceConfig, path, this._cardConfig!) - : replaceCard( - this._params!.lovelaceConfig, - [...path, this._params!.cardIndex], - this._cardConfig! - ) - ); - this._saving = false; - this._dirty = false; - showSaveSuccessToast(this, this.hass); - this.closeDialog(); + try { + await this._params!.saveCardConfig(this._cardConfig!); + this._saving = false; + this._dirty = false; + showSaveSuccessToast(this, this.hass); + this.closeDialog(); + } catch (err: any) { + showToast(this, { + message: err.message, + }); + this._saving = false; + } } static get styles(): CSSResultGroup { diff --git a/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts index a1da36b660..ae3930ba55 100644 --- a/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts @@ -1,20 +1,15 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import type { LovelaceSectionConfig } from "../../../../data/lovelace/config/section"; import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; -import type { LovelaceContainerPath } from "../lovelace-path"; -export type EditCardDialogParams = { +export interface EditCardDialogParams { lovelaceConfig: LovelaceConfig; - saveConfig: (config: LovelaceConfig) => void; - path: LovelaceContainerPath; -} & ( - | { - cardIndex: number; - } - | { - cardConfig: LovelaceCardConfig; - } -); + saveCardConfig: (config: LovelaceCardConfig) => void; + cardConfig: LovelaceCardConfig; + sectionConfig?: LovelaceSectionConfig; + isNew?: boolean; +} export const importEditCardDialog = () => import("./hui-dialog-edit-card"); diff --git a/src/panels/lovelace/sections/hui-section.ts b/src/panels/lovelace/sections/hui-section.ts index c9aa927aed..5155e996ea 100644 --- a/src/panels/lovelace/sections/hui-section.ts +++ b/src/panels/lovelace/sections/hui-section.ts @@ -21,6 +21,7 @@ import { import { createSectionElement } from "../create-element/create-section-element"; import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; +import { replaceCard } from "../editor/config-util"; import { performDeleteCard } from "../editor/delete-card"; import { parseLovelaceCardPath } from "../editor/lovelace-path"; import { generateLovelaceSectionStrategy } from "../strategies/get-strategy"; @@ -253,11 +254,23 @@ export class HuiSection extends ReactiveElement { ev.stopPropagation(); if (!this.lovelace) return; const { cardIndex } = parseLovelaceCardPath(ev.detail.path); + const sectionConfig = this.config; + if (isStrategySection(sectionConfig)) { + return; + } + const cardConfig = sectionConfig.cards![cardIndex]; showEditCardDialog(this, { lovelaceConfig: this.lovelace.config, - saveConfig: this.lovelace.saveConfig, - path: [this.viewIndex, this.index], - cardIndex, + saveCardConfig: async (newCardConfig) => { + const newConfig = replaceCard( + this.lovelace!.config, + [this.viewIndex, this.index, cardIndex], + newCardConfig + ); + await this.lovelace!.saveConfig(newConfig); + }, + sectionConfig, + cardConfig, }); }); this._layoutElement.addEventListener("ll-delete-card", (ev) => { diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index 7111c20d01..f862915c86 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -21,6 +21,7 @@ import { showCreateBadgeDialog } from "../editor/badge-editor/show-create-badge- import { showEditBadgeDialog } from "../editor/badge-editor/show-edit-badge-dialog"; import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; +import { replaceCard } from "../editor/config-util"; import { type DeleteBadgeParams, performDeleteBadge, @@ -270,11 +271,22 @@ export class HUIView extends ReactiveElement { }); this._layoutElement.addEventListener("ll-edit-card", (ev) => { const { cardIndex } = parseLovelaceCardPath(ev.detail.path); + const viewConfig = this.lovelace!.config.views[this.index]; + if (isStrategyView(viewConfig)) { + return; + } + const cardConfig = viewConfig.cards![cardIndex]; showEditCardDialog(this, { lovelaceConfig: this.lovelace.config, - saveConfig: this.lovelace.saveConfig, - path: [this.index], - cardIndex, + saveCardConfig: async (newCardConfig) => { + const newConfig = replaceCard( + this.lovelace!.config, + [this.index, cardIndex], + newCardConfig + ); + await this.lovelace.saveConfig(newConfig); + }, + cardConfig, }); }); this._layoutElement.addEventListener("ll-delete-card", (ev) => { From cae36b393b3822ed8c5ee322d0fe5b6114f52aeb Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 20 Feb 2025 14:20:28 +0100 Subject: [PATCH 33/50] Focus alarm control panel PIN input on wider screens (#24324) * Focus alarm control panel PIN input on wider screens * Also apply on textfield --- src/dialogs/enter-code/dialog-enter-code.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dialogs/enter-code/dialog-enter-code.ts b/src/dialogs/enter-code/dialog-enter-code.ts index 5a76df3e64..933567705e 100644 --- a/src/dialogs/enter-code/dialog-enter-code.ts +++ b/src/dialogs/enter-code/dialog-enter-code.ts @@ -40,8 +40,13 @@ export class DialogEnterCode @state() private _showClearButton = false; + @state() private _narrow = false; + public async showDialog(dialogParams: EnterCodeDialogParams): Promise { this._dialogParams = dialogParams; + this._narrow = matchMedia( + "all and (max-width: 450px), all and (max-height: 500px)" + ).matches; await this.updateComplete; } @@ -96,7 +101,7 @@ export class DialogEnterCode >
${BUTTONS.map((value) => From 8175e459210436a9a0e994f9e564bdda600d6859 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 20 Feb 2025 14:51:49 +0100 Subject: [PATCH 34/50] Rename `switch-toggle` feature to `toggle` and improve (#24333) * Rename `switch-toggle` feature to `toggle` and improve * Format --- ...-feature.ts => hui-toggle-card-feature.ts} | 36 ++++++++++--------- src/panels/lovelace/card-features/types.ts | 10 +++--- .../create-card-feature-element.ts | 4 +-- .../hui-card-features-editor.ts | 6 ++-- src/translations/en.json | 4 +-- 5 files changed, 31 insertions(+), 29 deletions(-) rename src/panels/lovelace/card-features/{hui-switch-toggle-card-feature.ts => hui-toggle-card-feature.ts} (74%) diff --git a/src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts b/src/panels/lovelace/card-features/hui-toggle-card-feature.ts similarity index 74% rename from src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts rename to src/panels/lovelace/card-features/hui-toggle-card-feature.ts index b316efefad..ce9b2294cf 100644 --- a/src/panels/lovelace/card-features/hui-switch-toggle-card-feature.ts +++ b/src/panels/lovelace/card-features/hui-toggle-card-feature.ts @@ -12,32 +12,29 @@ import { UNAVAILABLE } from "../../../data/entity"; import type { HomeAssistant } from "../../../types"; import type { LovelaceCardFeature } from "../types"; import { cardFeatureStyles } from "./common/card-feature-styles"; -import type { SwitchToggleCardFeatureConfig } from "./types"; +import type { ToggleCardFeatureConfig } from "./types"; import { showToast } from "../../../util/toast"; -export const supportsSwitchToggleCardFeature = (stateObj: HassEntity) => { +export const supportsToggleCardFeature = (stateObj: HassEntity) => { const domain = computeDomain(stateObj.entity_id); - return domain === "switch"; + return ["switch", "input_boolean"].includes(domain); }; -@customElement("hui-switch-toggle-card-feature") -class HuiSwitchToggleCardFeature - extends LitElement - implements LovelaceCardFeature -{ +@customElement("hui-toggle-card-feature") +class HuiToggleCardFeature extends LitElement implements LovelaceCardFeature { @property({ attribute: false }) public hass?: HomeAssistant; @property({ attribute: false }) public stateObj?: HassEntity; - @state() private _config?: SwitchToggleCardFeatureConfig; + @state() private _config?: ToggleCardFeatureConfig; - static getStubConfig(): SwitchToggleCardFeatureConfig { + static getStubConfig(): ToggleCardFeatureConfig { return { - type: "switch-toggle", + type: "toggle", }; } - public setConfig(config: SwitchToggleCardFeatureConfig): void { + public setConfig(config: ToggleCardFeatureConfig): void { if (!config) { throw new Error("Invalid configuration"); } @@ -49,7 +46,7 @@ class HuiSwitchToggleCardFeature !this._config || !this.hass || !this.stateObj || - !supportsSwitchToggleCardFeature(this.stateObj) + !supportsToggleCardFeature(this.stateObj) ) { return null; } @@ -81,17 +78,22 @@ class HuiSwitchToggleCardFeature private async _valueChanged(ev: CustomEvent) { const newState = (ev.detail as any).value; - if (newState === this.stateObj!.state) return; + if ( + newState === this.stateObj!.state && + !this.stateObj!.attributes.assumed_state + ) + return; const service = newState === "on" ? "turn_on" : "turn_off"; + const domain = computeDomain(this.stateObj!.entity_id); try { - await this.hass!.callService("switch", service, { + await this.hass!.callService(domain, service, { entity_id: this.stateObj!.entity_id, }); } catch (_err) { showToast(this, { message: this.hass!.localize("ui.notification_toast.action_failed", { - service: "switch." + service, + service: domain + "." + service, }), duration: 5000, dismissable: true, @@ -104,6 +106,6 @@ class HuiSwitchToggleCardFeature declare global { interface HTMLElementTagNameMap { - "hui-switch-toggle-card-feature": HuiSwitchToggleCardFeature; + "hui-toggle-card-feature": HuiToggleCardFeature; } } diff --git a/src/panels/lovelace/card-features/types.ts b/src/panels/lovelace/card-features/types.ts index b17bf97c8b..682b30e5ab 100644 --- a/src/panels/lovelace/card-features/types.ts +++ b/src/panels/lovelace/card-features/types.ts @@ -88,10 +88,6 @@ export interface SelectOptionsCardFeatureConfig { options?: string[]; } -export interface SwitchToggleCardFeatureConfig { - type: "switch-toggle"; -} - export interface NumericInputCardFeatureConfig { type: "numeric-input"; style?: "buttons" | "slider"; @@ -105,6 +101,10 @@ export interface TargetTemperatureCardFeatureConfig { type: "target-temperature"; } +export interface ToggleCardFeatureConfig { + type: "toggle"; +} + export interface WaterHeaterOperationModesCardFeatureConfig { type: "water-heater-operation-modes"; operation_modes?: OperationMode[]; @@ -172,9 +172,9 @@ export type LovelaceCardFeatureConfig = | MediaPlayerVolumeSliderCardFeatureConfig | NumericInputCardFeatureConfig | SelectOptionsCardFeatureConfig - | SwitchToggleCardFeatureConfig | TargetHumidityCardFeatureConfig | TargetTemperatureCardFeatureConfig + | ToggleCardFeatureConfig | UpdateActionsCardFeatureConfig | VacuumCommandsCardFeatureConfig | WaterHeaterOperationModesCardFeatureConfig; diff --git a/src/panels/lovelace/create-element/create-card-feature-element.ts b/src/panels/lovelace/create-element/create-card-feature-element.ts index 550bfccb0a..40ab6f3259 100644 --- a/src/panels/lovelace/create-element/create-card-feature-element.ts +++ b/src/panels/lovelace/create-element/create-card-feature-element.ts @@ -20,9 +20,9 @@ import "../card-features/hui-lock-open-door-card-feature"; import "../card-features/hui-media-player-volume-slider-card-feature"; import "../card-features/hui-numeric-input-card-feature"; import "../card-features/hui-select-options-card-feature"; -import "../card-features/hui-switch-toggle-card-feature"; import "../card-features/hui-target-temperature-card-feature"; import "../card-features/hui-target-humidity-card-feature"; +import "../card-features/hui-toggle-card-feature"; import "../card-features/hui-update-actions-card-feature"; import "../card-features/hui-vacuum-commands-card-feature"; import "../card-features/hui-water-heater-operation-modes-card-feature"; @@ -56,9 +56,9 @@ const TYPES = new Set([ "media-player-volume-slider", "numeric-input", "select-options", - "switch-toggle", "target-humidity", "target-temperature", + "toggle", "update-actions", "vacuum-commands", "water-heater-operation-modes", diff --git a/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts b/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts index a8008d7148..54fb1cc980 100644 --- a/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts @@ -40,9 +40,9 @@ import { supportsLockOpenDoorCardFeature } from "../../card-features/hui-lock-op import { supportsMediaPlayerVolumeSliderCardFeature } from "../../card-features/hui-media-player-volume-slider-card-feature"; import { supportsNumericInputCardFeature } from "../../card-features/hui-numeric-input-card-feature"; import { supportsSelectOptionsCardFeature } from "../../card-features/hui-select-options-card-feature"; -import { supportsSwitchToggleCardFeature } from "../../card-features/hui-switch-toggle-card-feature"; import { supportsTargetHumidityCardFeature } from "../../card-features/hui-target-humidity-card-feature"; import { supportsTargetTemperatureCardFeature } from "../../card-features/hui-target-temperature-card-feature"; +import { supportsToggleCardFeature } from "../../card-features/hui-toggle-card-feature"; import { supportsUpdateActionsCardFeature } from "../../card-features/hui-update-actions-card-feature"; import { supportsVacuumCommandsCardFeature } from "../../card-features/hui-vacuum-commands-card-feature"; import { supportsWaterHeaterOperationModesCardFeature } from "../../card-features/hui-water-heater-operation-modes-card-feature"; @@ -75,9 +75,9 @@ const UI_FEATURE_TYPES = [ "media-player-volume-slider", "numeric-input", "select-options", - "switch-toggle", "target-humidity", "target-temperature", + "toggle", "update-actions", "vacuum-commands", "water-heater-operation-modes", @@ -131,10 +131,10 @@ const SUPPORTS_FEATURE_TYPES: Record< "select-options": supportsSelectOptionsCardFeature, "target-humidity": supportsTargetHumidityCardFeature, "target-temperature": supportsTargetTemperatureCardFeature, + toggle: supportsToggleCardFeature, "update-actions": supportsUpdateActionsCardFeature, "vacuum-commands": supportsVacuumCommandsCardFeature, "water-heater-operation-modes": supportsWaterHeaterOperationModesCardFeature, - "switch-toggle": supportsSwitchToggleCardFeature, }; const customCardFeatures = getCustomCardFeatures(); diff --git a/src/translations/en.json b/src/translations/en.json index 7620768411..7d9b86c609 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -7348,8 +7348,8 @@ "options": "Options", "customize_options": "Customize options" }, - "switch-toggle": { - "label": "Switch toggle" + "toggle": { + "label": "Toggle" }, "numeric-input": { "label": "Numeric input", From 0bd7d27c570ba1fe35ccc94c76312fce90ca5853 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:14:54 +0100 Subject: [PATCH 35/50] Update dependency @lokalise/node-api to v13.2.0 (#24335) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bbe026e817..ef3b21249b 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "@babel/preset-env": "7.26.9", "@babel/preset-typescript": "7.26.0", "@bundle-stats/plugin-webpack-filter": "4.18.2", - "@lokalise/node-api": "13.1.0", + "@lokalise/node-api": "13.2.0", "@octokit/auth-oauth-device": "7.1.3", "@octokit/plugin-retry": "7.1.4", "@octokit/rest": "21.1.1", diff --git a/yarn.lock b/yarn.lock index 27d5fb8825..30493959cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2270,10 +2270,10 @@ __metadata: languageName: node linkType: hard -"@lokalise/node-api@npm:13.1.0": - version: 13.1.0 - resolution: "@lokalise/node-api@npm:13.1.0" - checksum: 10/708b4c2dc5de7e30b7af28fb67539281875fad2e721db56d88e1860b9d8836e8ce3dc9af5c1b16aa7f1ab6dded1373206834c301d22d8e60539e3ceae4abcf57 +"@lokalise/node-api@npm:13.2.0": + version: 13.2.0 + resolution: "@lokalise/node-api@npm:13.2.0" + checksum: 10/0b3e67cc0784c4ab9a499e210db5ab48f2445300cecb96cee0d39de7aa037bb624aaf2d4b8f4973c9644dfca4f7dd38385d12cb25da03674648d6dee3b742109 languageName: node linkType: hard @@ -9338,7 +9338,7 @@ __metadata: "@lit-labs/motion": "npm:1.0.8" "@lit-labs/observers": "npm:2.0.5" "@lit-labs/virtualizer": "npm:2.1.0" - "@lokalise/node-api": "npm:13.1.0" + "@lokalise/node-api": "npm:13.2.0" "@lrnwebcomponents/simple-tooltip": "npm:8.0.2" "@material/chips": "npm:=14.0.0-canary.53b3cad2f.0" "@material/data-table": "npm:=14.0.0-canary.53b3cad2f.0" From a7a4194e09cb4313a8fb0d253967b8b98177ac17 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 20 Feb 2025 20:09:44 +0100 Subject: [PATCH 36/50] Add tile card feature for counter actions (#24340) * Add tile card feature for counter actions * Format * Change icon * Disable buttons when hit limit * Change increment/decrement icons --- .../hui-counter-actions-card-feature.ts | 134 ++++++++++++++++++ src/panels/lovelace/card-features/types.ts | 10 ++ .../create-card-feature-element.ts | 2 + .../hui-card-features-editor.ts | 4 + ...hui-counter-actions-card-feature-editor.ts | 91 ++++++++++++ src/translations/en.json | 11 +- 6 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 src/panels/lovelace/card-features/hui-counter-actions-card-feature.ts create mode 100644 src/panels/lovelace/editor/config-elements/hui-counter-actions-card-feature-editor.ts diff --git a/src/panels/lovelace/card-features/hui-counter-actions-card-feature.ts b/src/panels/lovelace/card-features/hui-counter-actions-card-feature.ts new file mode 100644 index 0000000000..d4373a6827 --- /dev/null +++ b/src/panels/lovelace/card-features/hui-counter-actions-card-feature.ts @@ -0,0 +1,134 @@ +import { mdiRestore, mdiPlus, mdiMinus } from "@mdi/js"; +import type { HassEntity } from "home-assistant-js-websocket"; +import type { TemplateResult } from "lit"; +import { LitElement, html } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import { computeDomain } from "../../../common/entity/compute_domain"; +import "../../../components/ha-control-select"; +import { UNAVAILABLE } from "../../../data/entity"; +import type { HomeAssistant } from "../../../types"; +import type { LovelaceCardFeature, LovelaceCardFeatureEditor } from "../types"; +import { cardFeatureStyles } from "./common/card-feature-styles"; +import { COUNTER_ACTIONS, type CounterActionsCardFeatureConfig } from "./types"; +import "../../../components/ha-control-button-group"; +import "../../../components/ha-control-button"; + +export const supportsCounterActionsCardFeature = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + return domain === "counter"; +}; + +interface CounterButton { + translationKey: string; + icon: string; + serviceName: string; + disabled: boolean; +} + +export const COUNTER_ACTIONS_BUTTON: Record< + string, + (stateObj: HassEntity) => CounterButton +> = { + increment: (stateObj) => ({ + translationKey: "increment", + icon: mdiPlus, + serviceName: "increment", + disabled: parseInt(stateObj.state) === stateObj.attributes.maximum, + }), + reset: () => ({ + translationKey: "reset", + icon: mdiRestore, + serviceName: "reset", + disabled: false, + }), + decrement: (stateObj) => ({ + translationKey: "decrement", + icon: mdiMinus, + serviceName: "decrement", + disabled: parseInt(stateObj.state) === stateObj.attributes.minimum, + }), +}; + +@customElement("hui-counter-actions-card-feature") +class HuiCounterActionsCardFeature + extends LitElement + implements LovelaceCardFeature +{ + @property({ attribute: false }) public hass?: HomeAssistant; + + @property({ attribute: false }) public stateObj?: HassEntity; + + @state() private _config?: CounterActionsCardFeatureConfig; + + public static async getConfigElement(): Promise { + await import( + "../editor/config-elements/hui-counter-actions-card-feature-editor" + ); + return document.createElement("hui-counter-actions-card-feature-editor"); + } + + static getStubConfig(): CounterActionsCardFeatureConfig { + return { + type: "counter-actions", + actions: COUNTER_ACTIONS.map((action) => action), + }; + } + + public setConfig(config: CounterActionsCardFeatureConfig): void { + if (!config) { + throw new Error("Invalid configuration"); + } + this._config = config; + } + + protected render(): TemplateResult | null { + if ( + !this._config || + !this.hass || + !this.stateObj || + !supportsCounterActionsCardFeature(this.stateObj) + ) { + return null; + } + + return html` + + ${this._config?.actions + ?.filter((action) => COUNTER_ACTIONS.includes(action)) + .map((action) => { + const button = COUNTER_ACTIONS_BUTTON[action](this.stateObj!); + return html` + + + + `; + })} + + `; + } + + private _onActionTap(ev): void { + ev.stopPropagation(); + const entry = (ev.target! as any).entry as CounterButton; + this.hass!.callService("counter", entry.serviceName, { + entity_id: this.stateObj!.entity_id, + }); + } + + static styles = cardFeatureStyles; +} + +declare global { + interface HTMLElementTagNameMap { + "hui-counter-actions-card-feature": HuiCounterActionsCardFeature; + } +} diff --git a/src/panels/lovelace/card-features/types.ts b/src/panels/lovelace/card-features/types.ts index 682b30e5ab..3b30ac46d8 100644 --- a/src/panels/lovelace/card-features/types.ts +++ b/src/panels/lovelace/card-features/types.ts @@ -83,6 +83,15 @@ export interface ClimatePresetModesCardFeatureConfig { preset_modes?: string[]; } +export const COUNTER_ACTIONS = ["increment", "reset", "decrement"] as const; + +export type CounterActions = (typeof COUNTER_ACTIONS)[number]; + +export interface CounterActionsCardFeatureConfig { + type: "counter-actions"; + actions?: CounterActions[]; +} + export interface SelectOptionsCardFeatureConfig { type: "select-options"; options?: string[]; @@ -156,6 +165,7 @@ export type LovelaceCardFeatureConfig = | ClimateSwingHorizontalModesCardFeatureConfig | ClimateHvacModesCardFeatureConfig | ClimatePresetModesCardFeatureConfig + | CounterActionsCardFeatureConfig | CoverOpenCloseCardFeatureConfig | CoverPositionCardFeatureConfig | CoverTiltPositionCardFeatureConfig diff --git a/src/panels/lovelace/create-element/create-card-feature-element.ts b/src/panels/lovelace/create-element/create-card-feature-element.ts index 40ab6f3259..31ce2eccd5 100644 --- a/src/panels/lovelace/create-element/create-card-feature-element.ts +++ b/src/panels/lovelace/create-element/create-card-feature-element.ts @@ -4,6 +4,7 @@ import "../card-features/hui-climate-swing-modes-card-feature"; import "../card-features/hui-climate-swing-horizontal-modes-card-feature"; import "../card-features/hui-climate-hvac-modes-card-feature"; import "../card-features/hui-climate-preset-modes-card-feature"; +import "../card-features/hui-counter-actions-card-feature"; import "../card-features/hui-cover-open-close-card-feature"; import "../card-features/hui-cover-position-card-feature"; import "../card-features/hui-cover-tilt-card-feature"; @@ -40,6 +41,7 @@ const TYPES = new Set([ "climate-swing-horizontal-modes", "climate-hvac-modes", "climate-preset-modes", + "counter-actions", "cover-open-close", "cover-position", "cover-tilt-position", diff --git a/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts b/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts index 54fb1cc980..cb779eb5d2 100644 --- a/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-card-features-editor.ts @@ -24,6 +24,7 @@ import { supportsClimateHvacModesCardFeature } from "../../card-features/hui-cli import { supportsClimatePresetModesCardFeature } from "../../card-features/hui-climate-preset-modes-card-feature"; import { supportsClimateSwingModesCardFeature } from "../../card-features/hui-climate-swing-modes-card-feature"; import { supportsClimateSwingHorizontalModesCardFeature } from "../../card-features/hui-climate-swing-horizontal-modes-card-feature"; +import { supportsCounterActionsCardFeature } from "../../card-features/hui-counter-actions-card-feature"; import { supportsCoverOpenCloseCardFeature } from "../../card-features/hui-cover-open-close-card-feature"; import { supportsCoverPositionCardFeature } from "../../card-features/hui-cover-position-card-feature"; import { supportsCoverTiltCardFeature } from "../../card-features/hui-cover-tilt-card-feature"; @@ -59,6 +60,7 @@ const UI_FEATURE_TYPES = [ "climate-preset-modes", "climate-swing-modes", "climate-swing-horizontal-modes", + "counter-actions", "cover-open-close", "cover-position", "cover-tilt-position", @@ -92,6 +94,7 @@ const EDITABLES_FEATURE_TYPES = new Set([ "climate-preset-modes", "climate-swing-modes", "climate-swing-horizontal-modes", + "counter-actions", "fan-preset-modes", "humidifier-modes", "lawn-mower-commands", @@ -113,6 +116,7 @@ const SUPPORTS_FEATURE_TYPES: Record< supportsClimateSwingHorizontalModesCardFeature, "climate-hvac-modes": supportsClimateHvacModesCardFeature, "climate-preset-modes": supportsClimatePresetModesCardFeature, + "counter-actions": supportsCounterActionsCardFeature, "cover-open-close": supportsCoverOpenCloseCardFeature, "cover-position": supportsCoverPositionCardFeature, "cover-tilt-position": supportsCoverTiltPositionCardFeature, diff --git a/src/panels/lovelace/editor/config-elements/hui-counter-actions-card-feature-editor.ts b/src/panels/lovelace/editor/config-elements/hui-counter-actions-card-feature-editor.ts new file mode 100644 index 0000000000..97e17f7c93 --- /dev/null +++ b/src/panels/lovelace/editor/config-elements/hui-counter-actions-card-feature-editor.ts @@ -0,0 +1,91 @@ +import { html, LitElement, nothing } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; +import { fireEvent } from "../../../../common/dom/fire_event"; +import type { LocalizeFunc } from "../../../../common/translations/localize"; +import type { SchemaUnion } from "../../../../components/ha-form/types"; +import "../../../../components/ha-form/ha-form"; +import type { HomeAssistant } from "../../../../types"; +import { + COUNTER_ACTIONS, + type LovelaceCardFeatureContext, + type CounterActionsCardFeatureConfig, +} from "../../card-features/types"; +import type { LovelaceCardFeatureEditor } from "../../types"; + +@customElement("hui-counter-actions-card-feature-editor") +export class HuiCounterActionsCardFeatureEditor + extends LitElement + implements LovelaceCardFeatureEditor +{ + @property({ attribute: false }) public hass?: HomeAssistant; + + @property({ attribute: false }) public context?: LovelaceCardFeatureContext; + + @state() private _config?: CounterActionsCardFeatureConfig; + + public setConfig(config: CounterActionsCardFeatureConfig): void { + this._config = config; + } + + private _schema = memoizeOne( + (localize: LocalizeFunc) => + [ + { + name: "actions", + selector: { + select: { + multiple: true, + mode: "list", + reorder: true, + options: COUNTER_ACTIONS.map((action) => ({ + value: action, + label: `${localize( + `ui.panel.lovelace.editor.features.types.counter-actions.actions.${action}` + )}`, + })), + }, + }, + }, + ] as const + ); + + protected render() { + if (!this.hass || !this._config) { + return nothing; + } + + const schema = this._schema(this.hass.localize); + + return html` + + `; + } + + private _valueChanged(ev: CustomEvent): void { + fireEvent(this, "config-changed", { config: ev.detail.value }); + } + + private _computeLabelCallback = ( + schema: SchemaUnion> + ) => { + switch (schema.name) { + default: + return this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.${schema.name}` + ); + } + }; +} + +declare global { + interface HTMLElementTagNameMap { + "hui-counter-actions-card-feature-editor": HuiCounterActionsCardFeatureEditor; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index 7d9b86c609..d039401df7 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -7001,7 +7001,8 @@ "suggested_cards": "Suggested cards", "other_cards": "Other cards", "custom_cards": "Custom cards", - "features": "Features" + "features": "Features", + "actions": "Actions" }, "heading": { "name": "Heading", @@ -7320,6 +7321,14 @@ "customize_modes": "Customize preset modes", "preset_modes": "Preset modes" }, + "counter-actions": { + "label": "Counter actions", + "actions": { + "increment": "Increment", + "decrement": "Decrement", + "reset": "Reset" + } + }, "fan-preset-modes": { "label": "Fan preset modes", "style": "[%key:ui::panel::lovelace::editor::features::types::climate-preset-modes::style%]", From 400106ec09ec9b90bed31ed0412410cc1d2f21ca Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 20 Feb 2025 13:09:51 -0600 Subject: [PATCH 37/50] Adjust WebSocket ping timeout to 15 seconds (#24339) * Adjust WebSocket ping timeout to 15 seconds 5 seconds was too low to prevent the UI from reloading when connecting the WebSocket during startup or on a high latancy connection This problem presented as the UI reloading over and over again because it could never respond to the ping in time on high latancy connections. At startup it usually only did this once so it went unnoticed in most cases. This ping was added in #18934 * Update connection-mixin.ts Co-authored-by: Jan-Philipp Benecke --------- Co-authored-by: Jan-Philipp Benecke --- src/state/connection-mixin.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index 2a219abccb..fa017031dc 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -286,7 +286,10 @@ export const connectionMixin = >( clearInterval(this.__backendPingInterval); this.__backendPingInterval = setInterval(() => { if (this.hass?.connected) { - promiseTimeout(5000, this.hass?.connection.ping()).catch(() => { + // If the backend is busy, or the connection is latent, + // it can take more than 10 seconds for the ping to return. + // We give it a 15 second timeout to be safe. + promiseTimeout(15000, this.hass?.connection.ping()).catch(() => { if (!this.hass?.connected) { return; } @@ -296,7 +299,7 @@ export const connectionMixin = >( this.hass?.connection.reconnect(true); }); } - }, 10000); + }, 30000); } protected hassReconnected() { From 0a05dd8f71e077907cb9fd1e3e7864a9eb4656d5 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:11:53 +0100 Subject: [PATCH 38/50] Add more tests for common/entity (#24336) * Use substring instead of deprecated substr * Add more common entity tests --- package.json | 1 + src/common/entity/compute_domain.ts | 2 +- src/common/entity/compute_state_display.ts | 6 +- test/common/entity/can_toggle_state.test.ts | 24 ++ .../entity/compute_attribute_display.test.ts | 371 ++++++++++++++++++ .../entity/compute_state_display.test.ts | 91 ++++- test/vitest.config.ts | 2 + tsconfig.json | 32 +- yarn.lock | 38 ++ 9 files changed, 558 insertions(+), 9 deletions(-) create mode 100644 test/common/entity/compute_attribute_display.test.ts diff --git a/package.json b/package.json index ef3b21249b..8ce0aff918 100644 --- a/package.json +++ b/package.json @@ -226,6 +226,7 @@ "ts-lit-plugin": "2.0.2", "typescript": "5.7.3", "typescript-eslint": "8.24.1", + "vite-tsconfig-paths": "5.1.4", "vitest": "3.0.5", "webpack-stats-plugin": "1.1.3", "webpackbar": "7.0.0", diff --git a/src/common/entity/compute_domain.ts b/src/common/entity/compute_domain.ts index 29e5688859..005bdb25b3 100644 --- a/src/common/entity/compute_domain.ts +++ b/src/common/entity/compute_domain.ts @@ -1,2 +1,2 @@ export const computeDomain = (entityId: string): string => - entityId.substr(0, entityId.indexOf(".")); + entityId.substring(0, entityId.indexOf(".")); diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts index 49c9d5182a..bd61083c82 100644 --- a/src/common/entity/compute_state_display.ts +++ b/src/common/entity/compute_state_display.ts @@ -120,11 +120,6 @@ export const computeStateDisplayFromEntityAttributes = ( return value; } - if (domain === "datetime") { - const time = new Date(state); - return formatDateTime(time, locale, config); - } - if (["date", "input_datetime", "time"].includes(domain)) { // If trying to display an explicit state, need to parse the explicit state to `Date` then format. // Attributes aren't available, we have to use `state`. @@ -181,6 +176,7 @@ export const computeStateDisplayFromEntityAttributes = ( "tag", "tts", "wake_word", + "datetime", ].includes(domain) || (domain === "sensor" && attributes.device_class === "timestamp") ) { diff --git a/test/common/entity/can_toggle_state.test.ts b/test/common/entity/can_toggle_state.test.ts index 42a71d1944..c85ea7887b 100644 --- a/test/common/entity/can_toggle_state.test.ts +++ b/test/common/entity/can_toggle_state.test.ts @@ -63,4 +63,28 @@ describe("canToggleState", () => { }; assert.isFalse(canToggleState(hass, stateObj)); }); + + it("Detects group with missing entity", () => { + const stateObj: any = { + entity_id: "group.bla", + state: "on", + attributes: { + entity_id: ["light.non_existing"], + }, + }; + + assert.isFalse(canToggleState(hass, stateObj)); + }); + + it("Detects group with off state", () => { + const stateObj: any = { + entity_id: "group.bla", + state: "off", + attributes: { + entity_id: ["light.test"], + }, + }; + + assert.isTrue(canToggleState(hass, stateObj)); + }); }); diff --git a/test/common/entity/compute_attribute_display.test.ts b/test/common/entity/compute_attribute_display.test.ts new file mode 100644 index 0000000000..ad606e9d01 --- /dev/null +++ b/test/common/entity/compute_attribute_display.test.ts @@ -0,0 +1,371 @@ +import type { + HassConfig, + HassEntity, + HassEntityBase, +} from "home-assistant-js-websocket"; +import { describe, it, expect } from "vitest"; +import { + computeAttributeValueDisplay, + computeAttributeNameDisplay, +} from "../../../src/common/entity/compute_attribute_display"; +import type { FrontendLocaleData } from "../../../src/data/translation"; +import type { HomeAssistant } from "../../../src/types"; + +export const localizeMock = (key: string) => { + const translations = { + "state.default.unknown": "Unknown", + "component.test_platform.entity.sensor.test_translation_key.state_attributes.attribute.state.42": + "42", + "component.test_platform.entity.sensor.test_translation_key.state_attributes.attribute.state.attributeValue": + "Localized Attribute Name", + "component.media_player.entity_component.media_player.state_attributes.attribute.state.attributeValue": + "Localized Media Player Attribute Name", + "component.media_player.entity_component._.state_attributes.attribute.state.attributeValue": + "Media Player Attribute Name", + }; + return translations[key] || ""; +}; + +export const stateObjMock = { + entity_id: "sensor.test", + attributes: { + device_class: "temperature", + }, +} as HassEntityBase; + +export const localeMock = { + language: "en", +} as FrontendLocaleData; + +export const configMock = { + unit_system: { + temperature: "°C", + }, +} as HassConfig; + +export const entitiesMock = { + "sensor.test": { + platform: "test_platform", + translation_key: "test_translation_key", + }, + "media_player.test": { + platform: "media_player", + }, +} as unknown as HomeAssistant["entities"]; + +describe("computeAttributeValueDisplay", () => { + it("should return unknown state for null value", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + null + ); + expect(result).toBe("Unknown"); + }); + + it("should return formatted number for numeric value", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + 42 + ); + expect(result).toBe("42"); + }); + + it("should return number from formatter", () => { + const stateObj = { + entity_id: "media_player.test", + attributes: { + device_class: "media_player", + volume_level: 0.42, + }, + } as unknown as HassEntityBase; + const result = computeAttributeValueDisplay( + localizeMock, + stateObj, + localeMock, + configMock, + entitiesMock, + "volume_level" + ); + expect(result).toBe("42%"); + }); + + it("should return formatted date for date string", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + "2023-10-10" + ); + expect(result).toBe("October 10, 2023"); + }); + + it("should return formatted datetime for timestamp", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + "2023-10-10T10:10:10" + ); + expect(result).toBe("October 10, 2023 at 10:10:10"); + }); + + it("should return JSON string for object value", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + { key: "value" } + ); + expect(result).toBe('{"key":"value"}'); + }); + + it("should return concatenated values for array", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + [1, 2, 3] + ); + expect(result).toBe("1, 2, 3"); + }); + + it("should set special unit for weather domain", () => { + const stateObj = { + entity_id: "weather.test", + attributes: { + temperature: 42, + }, + } as unknown as HassEntityBase; + const result = computeAttributeValueDisplay( + localizeMock, + stateObj, + localeMock, + configMock, + entitiesMock, + "temperature" + ); + expect(result).toBe("42 °C"); + }); + + it("should set temperature unit for temperature attribute", () => { + const stateObj = { + entity_id: "sensor.test", + attributes: { + temperature: 42, + }, + } as unknown as HassEntityBase; + const result = computeAttributeValueDisplay( + localizeMock, + stateObj, + localeMock, + configMock, + entitiesMock, + "temperature" + ); + expect(result).toBe("42 °C"); + }); + + it("should return translation from translation key", () => { + const result = computeAttributeValueDisplay( + localizeMock, + stateObjMock, + localeMock, + configMock, + entitiesMock, + "attribute", + "attributeValue" + ); + expect(result).toBe("Localized Attribute Name"); + }); + + it("should return device class translation", () => { + const stateObj = { + entity_id: "media_player.test", + attributes: { + device_class: "media_player", + volume_level: 0.42, + }, + } as unknown as HassEntityBase; + const result = computeAttributeValueDisplay( + localizeMock, + stateObj, + localeMock, + configMock, + entitiesMock, + "attribute", + "attributeValue" + ); + expect(result).toBe("Localized Media Player Attribute Name"); + }); + + it("should return attribute value translation", () => { + const stateObj = { + entity_id: "media_player.test", + attributes: { + volume_level: 0.42, + }, + } as unknown as HassEntityBase; + const result = computeAttributeValueDisplay( + localizeMock, + stateObj, + localeMock, + configMock, + entitiesMock, + "attribute", + "attributeValue" + ); + expect(result).toBe("Media Player Attribute Name"); + }); + + it("should return attribute value", () => { + const stateObj = { + entity_id: "media_player.test", + attributes: { + volume_level: 0.42, + }, + } as unknown as HassEntityBase; + const result = computeAttributeValueDisplay( + localizeMock, + stateObj, + localeMock, + configMock, + entitiesMock, + "attribute", + "attributeValue2" + ); + expect(result).toBe("attributeValue2"); + }); +}); + +describe("computeAttributeNameDisplay", () => { + it("should return localized name for attribute", () => { + const localize = (key: string) => { + if ( + key === + "component.light.entity.light.entity_translation_key.state_attributes.updated_at.name" + ) { + return "Updated at"; + } + return "unknown"; + }; + + const stateObj = { + entity_id: "light.test", + attributes: { + device_class: "light", + }, + } as HassEntity; + + const entities = { + "light.test": { + translation_key: "entity_translation_key", + platform: "light", + }, + } as unknown as HomeAssistant["entities"]; + + const result = computeAttributeNameDisplay( + localize, + stateObj, + entities, + "updated_at" + ); + expect(result).toBe("Updated at"); + }); + + it("should return device class translation", () => { + const localize = (key: string) => { + if ( + key === + "component.light.entity_component.light.state_attributes.brightness.name" + ) { + return "Brightness"; + } + return "unknown"; + }; + + const stateObj = { + entity_id: "light.test", + attributes: { + device_class: "light", + }, + } as HassEntity; + + const entities = {} as unknown as HomeAssistant["entities"]; + + const result = computeAttributeNameDisplay( + localize, + stateObj, + entities, + "brightness" + ); + expect(result).toBe("Brightness"); + }); + + it("should return default attribute name", () => { + const localize = (key: string) => { + if ( + key === + "component.light.entity_component._.state_attributes.brightness.name" + ) { + return "Brightness"; + } + return "unknown"; + }; + + const stateObj = { + entity_id: "light.test", + attributes: {}, + } as HassEntity; + + const entities = {} as unknown as HomeAssistant["entities"]; + + const result = computeAttributeNameDisplay( + localize, + stateObj, + entities, + "brightness" + ); + expect(result).toBe("Brightness"); + }); + + it("should return capitalized attribute name", () => { + const localize = () => ""; + + const stateObj = { + entity_id: "light.test", + attributes: {}, + } as HassEntity; + + const entities = {} as unknown as HomeAssistant["entities"]; + + const result = computeAttributeNameDisplay( + localize, + stateObj, + entities, + "brightness__ip_id_mac_gps_GPS" + ); + expect(result).toBe("Brightness IP ID MAC GPS GPS"); + }); +}); diff --git a/test/common/entity/compute_state_display.test.ts b/test/common/entity/compute_state_display.test.ts index 2a120abe5c..05934c5ba2 100644 --- a/test/common/entity/compute_state_display.test.ts +++ b/test/common/entity/compute_state_display.test.ts @@ -1,5 +1,9 @@ -import { assert, describe, it, beforeEach } from "vitest"; -import { computeStateDisplay } from "../../../src/common/entity/compute_state_display"; +import type { HassConfig } from "home-assistant-js-websocket"; +import { assert, describe, it, beforeEach, expect } from "vitest"; +import { + computeStateDisplay, + computeStateDisplayFromEntityAttributes, +} from "../../../src/common/entity/compute_state_display"; import { UNKNOWN } from "../../../src/data/entity"; import type { FrontendLocaleData } from "../../../src/data/translation"; import { @@ -10,6 +14,7 @@ import { TimeZone, } from "../../../src/data/translation"; import { demoConfig } from "../../../src/fake_data/demo_config"; +import type { EntityRegistryDisplayEntry } from "../../../src/data/entity_registry"; let localeData: FrontendLocaleData; @@ -617,3 +622,85 @@ describe("computeStateDisplay", () => { ); }); }); + +describe("computeStateDisplayFromEntityAttributes with numeric device classes", () => { + it("Should format duration sensor", () => { + const result = computeStateDisplayFromEntityAttributes( + // eslint-disable-next-line @typescript-eslint/no-empty-function + (() => {}) as any, + { + language: "en", + } as FrontendLocaleData, + [], + {} as HassConfig, + { + display_precision: 2, + } as EntityRegistryDisplayEntry, + "number.test", + { + device_class: "duration", + unit_of_measurement: "min", + }, + "12" + ); + expect(result).toBe("12.00 min"); + }); + it("Should format duration sensor with seconds", () => { + const result = computeStateDisplayFromEntityAttributes( + // eslint-disable-next-line @typescript-eslint/no-empty-function + (() => {}) as any, + { + language: "en", + } as FrontendLocaleData, + [], + {} as HassConfig, + undefined, + "number.test", + { + device_class: "duration", + unit_of_measurement: "s", + }, + "12" + ); + expect(result).toBe("12 s"); + }); + + it("Should format monetary device_class", () => { + const result = computeStateDisplayFromEntityAttributes( + // eslint-disable-next-line @typescript-eslint/no-empty-function + (() => {}) as any, + { + language: "en", + } as FrontendLocaleData, + [], + {} as HassConfig, + undefined, + "number.test", + { + device_class: "monetary", + unit_of_measurement: "$", + }, + "12" + ); + expect(result).toBe("12 $"); + }); +}); + +describe("computeStateDisplayFromEntityAttributes datetime device calss", () => { + it("Should format datetime sensor", () => { + const result = computeStateDisplayFromEntityAttributes( + // eslint-disable-next-line @typescript-eslint/no-empty-function + (() => {}) as any, + { + language: "en", + } as FrontendLocaleData, + [], + {} as HassConfig, + undefined, + "button.test", + {}, + "2020-01-01T12:00:00+00:00" + ); + expect(result).toBe("January 1, 2020 at 12:00"); + }); +}); diff --git a/test/vitest.config.ts b/test/vitest.config.ts index 811a8a8a7d..6c2fff36f7 100644 --- a/test/vitest.config.ts +++ b/test/vitest.config.ts @@ -1,6 +1,8 @@ import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ + plugins: [tsconfigPaths()], test: { environment: "jsdom", // to run in browser-like environment env: { diff --git a/tsconfig.json b/tsconfig.json index 83c5f840ac..7c24087739 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -49,6 +49,36 @@ "./node_modules/@lrnwebcomponents/simple-tooltip/custom-elements.json" ] } - ] + ], + "paths": { + "lit/static-html": ["./node_modules/lit/static-html.js"], + "lit/decorators": ["./node_modules/lit/decorators.js"], + "lit/directive": ["./node_modules/lit/directive.js"], + "lit/directives/until": ["./node_modules/lit/directives/until.js"], + "lit/directives/class-map": [ + "./node_modules/lit/directives/class-map.js" + ], + "lit/directives/style-map": [ + "./node_modules/lit/directives/style-map.js" + ], + "lit/directives/if-defined": [ + "./node_modules/lit/directives/if-defined.js" + ], + "lit/directives/guard": ["./node_modules/lit/directives/guard.js"], + "lit/directives/cache": ["./node_modules/lit/directives/cache.js"], + "lit/directives/repeat": ["./node_modules/lit/directives/repeat.js"], + "lit/directives/live": ["./node_modules/lit/directives/live.js"], + "lit/directives/keyed": ["./node_modules/lit/directives/keyed.js"], + "lit/polyfill-support": ["./node_modules/lit/polyfill-support.js"], + "@lit-labs/virtualizer/layouts/grid": [ + "./node_modules/@lit-labs/virtualizer/layouts/grid.js" + ], + "@lit-labs/virtualizer/polyfills/resize-observer-polyfill/ResizeObserver": [ + "./node_modules/@lit-labs/virtualizer/polyfills/resize-observer-polyfill/ResizeObserver.js" + ], + "@lit-labs/observers/resize-controller": [ + "./node_modules/@lit-labs/observers/resize-controller.js" + ] + } } } diff --git a/yarn.lock b/yarn.lock index 30493959cf..4e058b596d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9067,6 +9067,13 @@ __metadata: languageName: node linkType: hard +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: 10/81ce62ee6f800d823d6b7da7687f841676d60ee8f51f934ddd862e4057316d26665c4edc0358d4340a923ac00a514f8b67c787e28fe693aae16350f4e60d55e9 + languageName: node + linkType: hard + "glogg@npm:^2.2.0": version: 2.2.0 resolution: "glogg@npm:2.2.0" @@ -9489,6 +9496,7 @@ __metadata: ua-parser-js: "npm:2.0.2" vis-data: "npm:7.1.9" vis-network: "npm:9.1.9" + vite-tsconfig-paths: "npm:5.1.4" vitest: "npm:3.0.5" vue: "npm:2.7.16" vue2-daterange-picker: "npm:0.6.8" @@ -14462,6 +14470,20 @@ __metadata: languageName: node linkType: hard +"tsconfck@npm:^3.0.3": + version: 3.1.5 + resolution: "tsconfck@npm:3.1.5" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + bin: + tsconfck: bin/tsconfck.js + checksum: 10/46b68f0fcec7da045490e427400c2a7fea67bdb6dae871257e8d2ec48e9dc99674214df86ff51c6d01ceb68ba9d7d806d3b69de432efa3c76b5fba160c252857 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -15110,6 +15132,22 @@ __metadata: languageName: node linkType: hard +"vite-tsconfig-paths@npm:5.1.4": + version: 5.1.4 + resolution: "vite-tsconfig-paths@npm:5.1.4" + dependencies: + debug: "npm:^4.1.1" + globrex: "npm:^0.1.2" + tsconfck: "npm:^3.0.3" + peerDependencies: + vite: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: 10/b409dbd17829f560021a71dba3e473b9c06dcf5fdc9d630b72c1f787145ec478b38caff1be04868971ac8bdcbf0f5af45eeece23dbc9c59c54b901f867740ae0 + languageName: node + linkType: hard + "vite@npm:^5.0.0 || ^6.0.0": version: 6.0.11 resolution: "vite@npm:6.0.11" From ba5c1133c649430485131a1ca3a954c92a9816b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:36:32 +0000 Subject: [PATCH 39/50] Lock file maintenance (#24306) * Lock file maintenance * Bump codemirror view to 6.36.3 --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 1019 ++++++++++++++++++++++++++++---------------------- 2 files changed, 566 insertions(+), 455 deletions(-) diff --git a/package.json b/package.json index 8ce0aff918..67b59789ef 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@codemirror/legacy-modes": "6.4.3", "@codemirror/search": "6.5.9", "@codemirror/state": "6.5.2", - "@codemirror/view": "6.36.2", + "@codemirror/view": "6.36.3", "@egjs/hammerjs": "2.0.17", "@formatjs/intl-datetimeformat": "6.17.3", "@formatjs/intl-displaynames": "6.8.10", diff --git a/yarn.lock b/yarn.lock index 4e058b596d..27bff1fa64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,15 +29,15 @@ __metadata: linkType: hard "@asamuzakjp/css-color@npm:^2.8.2": - version: 2.8.2 - resolution: "@asamuzakjp/css-color@npm:2.8.2" + version: 2.8.3 + resolution: "@asamuzakjp/css-color@npm:2.8.3" dependencies: "@csstools/css-calc": "npm:^2.1.1" "@csstools/css-color-parser": "npm:^3.0.7" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" - lru-cache: "npm:^11.0.2" - checksum: 10/998885b5deae79d26719befe9cc7e6877ae55818226c1da7c3e901107eb9a2d961b8797cc0961372a23e72b8484899a2b7f06879e34ff7f49c1c35e55eb695d3 + lru-cache: "npm:^10.4.3" + checksum: 10/3fbd6b975cfca220a0620843776e7d266b880293a9e3364a48de11ca3eb54af8209343d01842a7c98d2737e457294a7621a5f6671aaf5f12e1634d10808f2508 languageName: node linkType: hard @@ -128,19 +128,19 @@ __metadata: linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" + version: 7.26.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.26.9" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.25.9" "@babel/helper-member-expression-to-functions": "npm:^7.25.9" "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.26.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.9" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/d1d47a7b5fd317c6cb1446b0e4f4892c19ddaa69ea0229f04ba8bea5f273fc8168441e7114ad36ff919f2d310f97310cec51adc79002e22039a7e1640ccaf248 + checksum: 10/28bca407847563cabcafcbd84a06c8b3d53d36d2e113cc7b7c15e3377fbfdb4b6b7c73ef76a7c4c9908cc71ee3f350c4bb16a86a4380c6812e17690f792264fe languageName: node linkType: hard @@ -234,16 +234,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-replace-supers@npm:7.25.9" +"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" dependencies: "@babel/helper-member-expression-to-functions": "npm:^7.25.9" "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/8ebf787016953e4479b99007bac735c9c860822fafc51bc3db67bc53814539888797238c81fa8b948b6da897eb7b1c1d4f04df11e501a7f0596b356be02de2ab + checksum: 10/cfb911d001a8c3d2675077dbb74ee8d7d5533b22d74f8d775cefabf19c604f6cbc22cfeb94544fe8efa626710d920f04acb22923017e68f46f5fdb1cb08b32ad languageName: node linkType: hard @@ -1027,17 +1027,17 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/plugin-transform-typescript@npm:7.26.3" + version: 7.26.8 + resolution: "@babel/plugin-transform-typescript@npm:7.26.8" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.25.9" "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.26.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" "@babel/plugin-syntax-typescript": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/71e82045fc931112ca6cba1826a7d521a30514ea5e8370c3c083f6ee1ed624d62d91e1415fbc41ce9033c4e78ba638a904c43b2d7e023873f36675844b8a4963 + checksum: 10/42741f21aad5b9182f9d05bdef4a04e422f4dbff1c9f9cd16e3d07de985510da024b58d86d2de88d9c3534bc4f1404a288f02d4f7b8e720e757664846a88a83b languageName: node linkType: hard @@ -1215,7 +1215,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9": +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9": version: 7.26.9 resolution: "@babel/traverse@npm:7.26.9" dependencies: @@ -1330,14 +1330,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:6.36.2, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0": - version: 6.36.2 - resolution: "@codemirror/view@npm:6.36.2" +"@codemirror/view@npm:6.36.3, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0": + version: 6.36.3 + resolution: "@codemirror/view@npm:6.36.3" dependencies: "@codemirror/state": "npm:^6.5.0" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: 10/9ef7fcf4f9d9b6e66645ae65da1bf0c90e08f6ba786de0373b9f3644632066b91b8ea20faf67bb81eb9adf310ae76888cc7fd0901e2bb4821193f5427455c137 + checksum: 10/a41b9af6c57c74cab2dc3e7a3e5a6d3912253514667878f7cacb5b889892e445e514e68200a7ac4d4c3eefc1a221ae5f7b5a85f211c3b7fdd6749475086e4dff languageName: node linkType: hard @@ -1597,22 +1597,13 @@ __metadata: linkType: hard "@eslint/config-array@npm:^0.19.0": - version: 0.19.1 - resolution: "@eslint/config-array@npm:0.19.1" + version: 0.19.2 + resolution: "@eslint/config-array@npm:0.19.2" dependencies: - "@eslint/object-schema": "npm:^2.1.5" + "@eslint/object-schema": "npm:^2.1.6" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10/1243b01f463de85c970c18f0994f9d1850dafe8cc8c910edb64105d845edd3cacaa0bbf028bf35a6daaf5a179021140b6a8b1dc7a2f915b42c2d35f022a9c201 - languageName: node - linkType: hard - -"@eslint/core@npm:^0.10.0": - version: 0.10.0 - resolution: "@eslint/core@npm:0.10.0" - dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10/de41d7fa5dc468b70fb15c72829096939fc0217c41b8519af4620bc1089cb42539a15325c4c3ee3832facac1836c8c944c4a0c4d0cc8b33ffd8e95962278ae14 + checksum: 10/a6809720908f7dd8536e1a73b2369adf802fe61335536ed0592bca9543c476956e0c0a20fef8001885da8026e2445dc9bf3e471bb80d32c3be7bcdabb7628fd1 languageName: node linkType: hard @@ -1649,20 +1640,20 @@ __metadata: languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.5": - version: 2.1.5 - resolution: "@eslint/object-schema@npm:2.1.5" - checksum: 10/bb07ec53357047f20de923bcd61f0306d9eee83ef41daa32e633e154a44796b5bd94670169eccb8fd8cb4ff42228a43b86953a6321f789f98194baba8207b640 +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10/266085c8d3fa6cd99457fb6350dffb8ee39db9c6baf28dc2b86576657373c92a568aec4bae7d142978e798b74c271696672e103202d47a0c148da39154351ed6 languageName: node linkType: hard "@eslint/plugin-kit@npm:^0.2.5": - version: 0.2.5 - resolution: "@eslint/plugin-kit@npm:0.2.5" + version: 0.2.6 + resolution: "@eslint/plugin-kit@npm:0.2.6" dependencies: - "@eslint/core": "npm:^0.10.0" + "@eslint/core": "npm:^0.11.0" levn: "npm:^0.4.1" - checksum: 10/82d0142bc7054587bde4f75c2c517f477df7c320e4bdb47a4d5f766899a313ce65e9ce5d59428178d0be473a95292065053f69637042546b811ad89079781cbc + checksum: 10/fa2e1ac5f16cb8f35c0ef980dd494e2730b2cddcf46d9ffa10decbe4bf498b17ba97a231a51e7695bcf8acb5b7783fdda9cbc6c32940c9038e27f1f5bf4a2c2f languageName: node linkType: hard @@ -2245,9 +2236,9 @@ __metadata: linkType: hard "@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": - version: 1.2.1 - resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1" - checksum: 10/48e28c1f132eb1d5b385454dd23db2837bf913d108a0908e73816ceb594b1b09db34e05ccb86a18fb9c02fc100d62bbab350b6ec88e2c175f2c21c5f0220bfdd + version: 1.3.0 + resolution: "@lit-labs/ssr-dom-shim@npm:1.3.0" + checksum: 10/a15c5d145a20f367a392cff91f2091ffe54457119ac26569670bbbe32760f86d1e250f865dc1bd0604641106376776c4862a8fff9adb44f9881b510747c08680 languageName: node linkType: hard @@ -3423,9 +3414,9 @@ __metadata: linkType: hard "@octokit/auth-token@npm:^5.0.0": - version: 5.1.1 - resolution: "@octokit/auth-token@npm:5.1.1" - checksum: 10/956ee8166ad1b623478ac5168529a081658bceb16e267102b149b44366a9280b5104a0346a4f1c5de12981d2dedb767f7b71d7e1b1ddd1ccb591efa8c6c06f94 + version: 5.1.2 + resolution: "@octokit/auth-token@npm:5.1.2" + checksum: 10/53636ea9dbf77d491ce387d36f75b2c9f76a8f71de0d892e08999e6ef3382a151bd52faf5ad9711b9ade6c19cfe71d4c69cfd4a16594858299201cef93412b0f languageName: node linkType: hard @@ -3455,13 +3446,13 @@ __metadata: linkType: hard "@octokit/graphql@npm:^8.1.2": - version: 8.1.2 - resolution: "@octokit/graphql@npm:8.1.2" + version: 8.2.1 + resolution: "@octokit/graphql@npm:8.2.1" dependencies: - "@octokit/request": "npm:^9.1.4" - "@octokit/types": "npm:^13.6.2" + "@octokit/request": "npm:^9.2.2" + "@octokit/types": "npm:^13.8.0" universal-user-agent: "npm:^7.0.0" - checksum: 10/e769b231ef4f2825be66f950c195a4bc8f9ff1fb04271500f42c5d73ee69000cfe80b18b5e7e472b7ee992ef0d1e84849fea58b3c650891349e17b43cd4e1c14 + checksum: 10/d247ef0c73ef8ffdb222e9724514ee4f64ff7195bd71da795db99e39d1e28d3b4c45b9c4a9fc151e263e01ecb259019f74f67a92d022b57fe5b876b720a4bb91 languageName: node linkType: hard @@ -3512,13 +3503,13 @@ __metadata: linkType: hard "@octokit/plugin-rest-endpoint-methods@npm:^13.3.0": - version: 13.3.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:13.3.0" + version: 13.3.1 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:13.3.1" dependencies: - "@octokit/types": "npm:^13.7.0" + "@octokit/types": "npm:^13.8.0" peerDependencies: "@octokit/core": ">=6" - checksum: 10/ece05e33b24edc94b0d45b5d6070c6ad5aa4c0900b2c74bbc16501d6189e4abd3eef317dcf6fbfc5110d2a0339bd27e63e85c29e6289d0441d9c49604253cc70 + checksum: 10/e883a9c6bba76300a7476dd1e45232c681df56a0f855e63d5de226126c890fc0b7879647c2abd49d663a013e5fdc26c4300942c5ada3d48fbfa0144b099caf16 languageName: node linkType: hard @@ -3544,7 +3535,7 @@ __metadata: languageName: node linkType: hard -"@octokit/request@npm:^9.1.4, @octokit/request@npm:^9.2.1": +"@octokit/request@npm:^9.2.1, @octokit/request@npm:^9.2.2": version: 9.2.2 resolution: "@octokit/request@npm:9.2.2" dependencies: @@ -3569,12 +3560,12 @@ __metadata: languageName: node linkType: hard -"@octokit/types@npm:^13.6.2, @octokit/types@npm:^13.7.0": - version: 13.7.0 - resolution: "@octokit/types@npm:13.7.0" +"@octokit/types@npm:^13.6.2, @octokit/types@npm:^13.7.0, @octokit/types@npm:^13.8.0": + version: 13.8.0 + resolution: "@octokit/types@npm:13.8.0" dependencies: "@octokit/openapi-types": "npm:^23.0.1" - checksum: 10/2c5f42b727ee4479ffc8891c61c4a0a1668dd58deeee51bdedfc6ef0bb7dd11819441db7f8d30a946911b20804fccb15f6f7c927e87eccafb4e19e6665668968 + checksum: 10/7f260cd3f98887626e791cc0e71ae718b689f359ff6546ed0343364bb213c70807f71135956659470ecdf2b4a5a0c32b6437bd5a3af412883ef3a62f41e811f8 languageName: node linkType: hard @@ -3939,135 +3930,135 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.31.0" +"@rollup/rollup-android-arm-eabi@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.8" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-android-arm64@npm:4.31.0" +"@rollup/rollup-android-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm64@npm:4.34.8" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.31.0" +"@rollup/rollup-darwin-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-arm64@npm:4.34.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.31.0" +"@rollup/rollup-darwin-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-x64@npm:4.34.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.31.0" +"@rollup/rollup-freebsd-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.8" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.31.0" +"@rollup/rollup-freebsd-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-x64@npm:4.34.8" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.31.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.31.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.8" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.31.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.31.0" +"@rollup/rollup-linux-arm64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.31.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.31.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.31.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.8" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.31.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.8" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.31.0" +"@rollup/rollup-linux-x64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.31.0" +"@rollup/rollup-linux-x64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.31.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.31.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.31.0" +"@rollup/rollup-win32-x64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4487,12 +4478,12 @@ __metadata: linkType: hard "@types/chrome@npm:*": - version: 0.0.287 - resolution: "@types/chrome@npm:0.0.287" + version: 0.0.304 + resolution: "@types/chrome@npm:0.0.304" dependencies: "@types/filesystem": "npm:*" "@types/har-format": "npm:*" - checksum: 10/bf09f11a2b1061ec477f7e3c0c4b9d575f2cdbff04bf7b16dbbb64d132c048a952fd1ffcedf61a0d16a514c26a9918cafd553ec4d02a34c4d25f80c1cafe0e2b + checksum: 10/dc98f06f1012e13c985b4f3e46763a8fc048ee1a6f0b1a839fe1e78edaa8bd08a66dfc355ec4892f55e0ce67a8c249e019d1911b1836071e547711554bb621a0 languageName: node linkType: hard @@ -4538,13 +4529,6 @@ __metadata: languageName: node linkType: hard -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 10/427c9220217d3d74f3e5d53d68cd39502f3bbebdb1af4ecf0d05076bcbe9ddab299ad6369fe0f517389296ba4ca49ddf9a8c22f68e5e9eb8ae6d0076cfab90b2 - languageName: node - linkType: hard - "@types/cors@npm:^2.8.12": version: 2.8.17 resolution: "@types/cors@npm:2.8.17" @@ -4555,9 +4539,9 @@ __metadata: linkType: hard "@types/emscripten@npm:^1.39.13": - version: 1.39.13 - resolution: "@types/emscripten@npm:1.39.13" - checksum: 10/02c0446150f9cc2c74dc3a551f86ce13df266c33d8b98d11d9f17263e2d98a6a6b4d36bdd15066c4e1547ae1ed2d52eed9420116b4935d119009e0f53ddbb041 + version: 1.40.0 + resolution: "@types/emscripten@npm:1.40.0" + checksum: 10/bf53d5890c9a8cac03679f35c9d9ecd32bb540e4f2559ea7907334a2b701eb82d44f4622d5e61eff989fcfc25ee2407184af7f4d8f2bf57362fce3927a8510fd languageName: node linkType: hard @@ -4582,15 +4566,15 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*": - version: 5.0.2 - resolution: "@types/express-serve-static-core@npm:5.0.2" +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.0.6 + resolution: "@types/express-serve-static-core@npm:5.0.6" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10/43b360b63da3817691030f00cb723a3fca3a6ec724260b10147e08da2a3647912f35adc402afeb493c773270fcec6396b5369899452b1c97ad54418d15287906 + checksum: 10/9dc51bdee7da9ad4792e97dd1be5b3071b5128f26d3b87a753070221bb36c8f9d16074b95a8b972acc965641e987b1e279a44675e7312ac8f3e18ec9abe93940 languageName: node linkType: hard @@ -4606,7 +4590,19 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.21": +"@types/express@npm:*": + version: 5.0.0 + resolution: "@types/express@npm:5.0.0" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10/45b199ab669caa33e6badafeebf078e277ea95042309d325a04b1ec498f33d33fd5a4ae9c8e358342367b178fe454d7323c5dfc8002bf27070b210a2c6cc11f0 + languageName: node + linkType: hard + +"@types/express@npm:^4.17.21": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -4645,9 +4641,9 @@ __metadata: linkType: hard "@types/geojson@npm:*": - version: 7946.0.15 - resolution: "@types/geojson@npm:7946.0.15" - checksum: 10/226d7ab59540632b19f7889c76c4c586a5104c18c43a81f32974aa035eafe557f86bd5a79ca5568bb63cbe5bfa9014c8e9a29cb0bb3d2f0bd71b0cc13ad8ccb3 + version: 7946.0.16 + resolution: "@types/geojson@npm:7946.0.16" + checksum: 10/34d07421bdd60e7b99fa265441d17ac6e9aef48e3ce22d04324127d0de1daf7fbaa0bd3be1cece2092eb6995f21da84afa5231e24621a2910ff7340bc98f496f languageName: node linkType: hard @@ -4690,11 +4686,11 @@ __metadata: linkType: hard "@types/http-proxy@npm:^1.17.8": - version: 1.17.15 - resolution: "@types/http-proxy@npm:1.17.15" + version: 1.17.16 + resolution: "@types/http-proxy@npm:1.17.16" dependencies: "@types/node": "npm:*" - checksum: 10/fa86d5397c021f6c824d1143a206009bfb64ff703da32fb30f6176c603daf6c24ce3a28daf26b3945c94dd10f9d76f07ea7a6a2c3e9b710e00ff42da32e08dea + checksum: 10/a054ac8f5301acfcfdcec3a775f52dc371180bbe60037906534312f10cceb3799b4a16e46c56c22f9925d078e11dcda1723c38f1ddd124be8169a4cccca69c8c languageName: node linkType: hard @@ -4774,9 +4770,9 @@ __metadata: linkType: hard "@types/lodash@npm:*": - version: 4.17.13 - resolution: "@types/lodash@npm:4.17.13" - checksum: 10/ddb34e20810c71be2d9445bcc4b64ec25b83976738454de709854b79c7f655b03704b76235445699956d65012987720e0e429a35489de65495cdb5420202d905 + version: 4.17.15 + resolution: "@types/lodash@npm:4.17.15" + checksum: 10/27b348b5971b9c670215331b52448a13d7d65bf1fbd320a7049c9c153c1186ff5d116ba75f05f07d32d7ece8a992b26a30c7bdc9be22a3d1e4e3e6068aa04603 languageName: node linkType: hard @@ -4828,11 +4824,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 22.10.2 - resolution: "@types/node@npm:22.10.2" + version: 22.13.4 + resolution: "@types/node@npm:22.13.4" dependencies: undici-types: "npm:~6.20.0" - checksum: 10/451adfefed4add58b069407173e616220fd4aaa3307cdde1bb701aa053b65b54ced8483db2f870dcedec7a58cb3b06101fbc19d85852716672ec1fd3660947fa + checksum: 10/716e05b1b84d9da3b2cbba9f642d7294549a89c85d27148b48815f321e0081d0546366e97d11c7710a3280160828512eb945f4e9361dda980f708473758ac0a7 languageName: node linkType: hard @@ -4844,11 +4840,11 @@ __metadata: linkType: hard "@types/node@npm:^18.15.3": - version: 18.19.70 - resolution: "@types/node@npm:18.19.70" + version: 18.19.76 + resolution: "@types/node@npm:18.19.76" dependencies: undici-types: "npm:~5.26.4" - checksum: 10/374abb7e75f7f8b2418cde5b0a8dae0032d4e1e3a76097a507a90ed9e66e40c12d19b75493db3aa9d4f92b03ae90d7d9f67c7d64c7f73f20145577350adf0e9b + checksum: 10/844799baffeaecc0951ebd5a3ed5aeef468cbf04aa597d69443dd60e18441efeac6ced94d742ee3369f5f8fd950c5199fbc30811f3e404730f60696d1b8a445a languageName: node linkType: hard @@ -4892,9 +4888,9 @@ __metadata: linkType: hard "@types/qs@npm:*": - version: 6.9.17 - resolution: "@types/qs@npm:6.9.17" - checksum: 10/fc3beda0be70e820ddabaa361e8dfec5e09b482b8f6cf1515615479a027dd06cd5ba0ffbd612b654c2605523f45f484c8905a475623d6cd0c4cadcf5d0c517f5 + version: 6.9.18 + resolution: "@types/qs@npm:6.9.18" + checksum: 10/152fab96efd819cc82ae67c39f089df415da6deddb48f1680edaaaa4e86a2a597de7b2ff0ad391df66d11a07006a08d52c9405e86b8cb8f3d5ba15881fe56cc7 languageName: node linkType: hard @@ -5013,11 +5009,11 @@ __metadata: linkType: hard "@types/ws@npm:^8.5.10": - version: 8.5.13 - resolution: "@types/ws@npm:8.5.13" + version: 8.5.14 + resolution: "@types/ws@npm:8.5.14" dependencies: "@types/node": "npm:*" - checksum: 10/21369beafa75c91ae3b00d3a2671c7408fceae1d492ca2abd5ac7c8c8bf4596d513c1599ebbddeae82c27c4a2d248976d0d714c4b3d34362b2ae35b964e2e637 + checksum: 10/956692dd47d5fe042780f61a6310d47203d07622aa185ef2eee7e849f9e7d1e5c190b0d8db8c3ab204a8829e3603b6c6bcab9024cd11dffdd5ffc0df9fd83f2d languageName: node linkType: hard @@ -5475,7 +5471,7 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:3.0.5, @vitest/pretty-format@npm:^3.0.5": +"@vitest/pretty-format@npm:3.0.5": version: 3.0.5 resolution: "@vitest/pretty-format@npm:3.0.5" dependencies: @@ -5484,6 +5480,15 @@ __metadata: languageName: node linkType: hard +"@vitest/pretty-format@npm:^3.0.5": + version: 3.0.6 + resolution: "@vitest/pretty-format@npm:3.0.6" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10/b0fb4b55be6b684907c9e6794cdf66483efa79523c24a384243e1afefd780e52f62b97c7d4e9bcd55017ac2b9928c6707502e58d7c238da20823d04fca24e2fe + languageName: node + linkType: hard + "@vitest/runner@npm:3.0.5": version: 3.0.5 resolution: "@vitest/runner@npm:3.0.5" @@ -5582,10 +5587,19 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10/ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10/2ceee14efdeda42ef7355178c1069499f183546ff7112b3efe79c1edef09d20ad9c17939752215fb8f7fcf48d10e6a7c0aa00136dc9cf4d293d963718bb1d200 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10/ed84af329f1828327798229578b4fe03a4dd2596ba304083ebd2252666bdc1d7647d66d0b18704477e1f8aa315f055944aa6e859afebd341f12d0a53c37b4b40 languageName: node linkType: hard @@ -5795,9 +5809,9 @@ __metadata: linkType: hard "ansis@npm:^3.2.0": - version: 3.4.0 - resolution: "ansis@npm:3.4.0" - checksum: 10/828ad5a8235ff9e745b9b16e7f8f42efc86943cd2ca8fd253a5a18497a573bb2a5d2abdce8c86805c94b67b9a29d9802a27d5299f04e97775d948ba9363ddd78 + version: 3.15.0 + resolution: "ansis@npm:3.15.0" + checksum: 10/f9517e855789b2c8cc1f442d36499e8238e6dbf4b6bc6cc27d2826050749253d758f633aaec122a5f39a0e00c3753c1ebe6e47f7daa3f45f339bbbbbebc7fbfd languageName: node linkType: hard @@ -5886,7 +5900,7 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: @@ -6009,6 +6023,13 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10/1a09379937d846f0ce7614e75071c12826945d4e417db634156bf0e4673c495989302f52186dfa9767a1d9181794554717badd193ca2bbab046ef1da741d8efd + languageName: node + linkType: hard + "async-settle@npm:^2.0.0": version: 2.0.0 resolution: "async-settle@npm:2.0.0" @@ -6173,9 +6194,9 @@ __metadata: linkType: hard "bare-events@npm:^2.2.0": - version: 2.5.0 - resolution: "bare-events@npm:2.5.0" - checksum: 10/a0830af0e1d47c74878109bd35cd9118305820c823d43bca2802e131ba7652bb5fdd94fb0c40a31313f440ed3964ab9b35394b3794437c238519bfbcaa52a8f8 + version: 2.5.4 + resolution: "bare-events@npm:2.5.4" + checksum: 10/135ef380b13f554ca2c6905bdbcfac8edae08fce85b7f953fa01f09a9f5b0da6a25e414111659bc9a6118216f0dd1f732016acd11ce91517f2afb26ebeb4b721 languageName: node linkType: hard @@ -6437,12 +6458,12 @@ __metadata: linkType: hard "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": - version: 1.0.1 - resolution: "call-bind-apply-helpers@npm:1.0.1" + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - checksum: 10/6e30c621170e45f1fd6735e84d02ee8e02a3ab95cb109499d5308cbe5d1e84d0cd0e10b48cc43c76aa61450ae1b03a7f89c37c10fc0de8d4998b42aab0f268cc + checksum: 10/00482c1f6aa7cfb30fb1dbeb13873edf81cfac7c29ed67a5957d60635a56b2a4a480f1016ddbdb3395cc37900d46037fb965043a51c5c789ffeab4fc535d18b5 languageName: node linkType: hard @@ -6500,22 +6521,22 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001616, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001690 - resolution: "caniuse-lite@npm:1.0.30001690" - checksum: 10/9fb4659eb09a298601b9593739072c481e2f5cc524bd0530e5e0f002e66246da5e866669854dfc0d53195ee36b201dab02f7933a7cdf60ccba7adb2d4a304caf + version: 1.0.30001700 + resolution: "caniuse-lite@npm:1.0.30001700" + checksum: 10/9203ed502fd1b74c47f315a001e1d91abe2abecb951f8e15dd1556cfc23a29fa7a7b2cc654380604bb6f58bcfa0c65b78055b9d99a7489c13baa0d4158a6e25e languageName: node linkType: hard "chai@npm:^5.1.2": - version: 5.1.2 - resolution: "chai@npm:5.1.2" + version: 5.2.0 + resolution: "chai@npm:5.2.0" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: 10/e8c2bbc83cb5a2f87130d93056d4cfbbe04106e12aa798b504816dbe3fa538a9f68541b472e56cbf0f54558b501d7e31867d74b8218abcd5a8cc8ba536fba46c + checksum: 10/2ce03671c159c6a567bf1912756daabdbb7c075f3c0078f1b59d61da8d276936367ee696dfe093b49e1479d9ba93a6074c8e55d49791dddd8061728cdcad249e languageName: node linkType: hard @@ -6866,8 +6887,8 @@ __metadata: linkType: hard "compression@npm:^1.7.4": - version: 1.7.5 - resolution: "compression@npm:1.7.5" + version: 1.8.0 + resolution: "compression@npm:1.8.0" dependencies: bytes: "npm:3.1.2" compressible: "npm:~2.0.18" @@ -6876,7 +6897,7 @@ __metadata: on-headers: "npm:~1.0.2" safe-buffer: "npm:5.2.1" vary: "npm:~1.1.2" - checksum: 10/c69cf6da151db6f9db2e242b6a0039ad41975ee886c385cff2920c5f8f7050678e0ee9a021437af033536c451791de529de376851b8d31fee42ca2d6adca03f0 + checksum: 10/ca213b9bd03e56c7c3596399d846237b5f0b31ca4cdeaa76a9547cd3c1465fbcfcb0fe93a5d7ff64eff28383fc65b53f1ef8bb2720d11bb48ad8c0836c502506 languageName: node linkType: hard @@ -6914,9 +6935,9 @@ __metadata: linkType: hard "consola@npm:^3.2.3": - version: 3.3.0 - resolution: "consola@npm:3.3.0" - checksum: 10/c8d8ee57328eaafe03ce711e6651aaa975c344aedd0a1b0cce6f931453bc8bc8a5336d95f5534099b3c24481d43b26afd6f22637ad319c43731408996503cc3b + version: 3.4.0 + resolution: "consola@npm:3.4.0" + checksum: 10/99d4a8131f4cc42ff6bb8e4fd8c9dbd428d6b949f3ec25d9d24892a7b0603b0aabeee8213e13ad74439b5078fdb204f9377bcdd401949c33fff672d91f05c4ec languageName: node linkType: hard @@ -7080,7 +7101,7 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": +"data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" dependencies: @@ -7091,7 +7112,7 @@ __metadata: languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": +"data-view-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "data-view-byte-length@npm:1.0.2" dependencies: @@ -7102,7 +7123,7 @@ __metadata: languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": +"data-view-byte-offset@npm:^1.0.1": version: 1.0.1 resolution: "data-view-byte-offset@npm:1.0.1" dependencies: @@ -7193,9 +7214,9 @@ __metadata: linkType: hard "decimal.js@npm:10, decimal.js@npm:^10.4.3": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 10/de663a7bc4d368e3877db95fcd5c87b965569b58d16cdc4258c063d231ca7118748738df17cd638f7e9dd0be8e34cec08d7234b20f1f2a756a52fc5a38b188d0 + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10/714d49cf2f2207b268221795ede330e51452b7c451a0c02a770837d2d4faed47d603a729c2aa1d952eb6c4102d999e91c9b952c1aa016db3c5cba9fc8bf4cda2 languageName: node linkType: hard @@ -7539,9 +7560,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.73": - version: 1.5.75 - resolution: "electron-to-chromium@npm:1.5.75" - checksum: 10/e80b5dc602227cb527583cfebef84d1fb62a8db44fdd1b516ff5f2d33687a90d221a10ae831a812609963ad138ddc80efa7675fb55b0589a629cd0cf64af5b34 + version: 1.5.102 + resolution: "electron-to-chromium@npm:1.5.102" + checksum: 10/2d22b978a94c02c7db77ba25bbcffba55afabefb59ccb1979c65ece44d6e29e69593c343f026859c80202eee8f9db86bae04055da36a37917e06a64f7146fce7 languageName: node linkType: hard @@ -7613,10 +7634,9 @@ __metadata: linkType: hard "engine.io@npm:~6.6.0": - version: 6.6.2 - resolution: "engine.io@npm:6.6.2" + version: 6.6.4 + resolution: "engine.io@npm:6.6.4" dependencies: - "@types/cookie": "npm:^0.4.1" "@types/cors": "npm:^2.8.12" "@types/node": "npm:>=10.0.0" accepts: "npm:~1.3.4" @@ -7626,7 +7646,7 @@ __metadata: debug: "npm:~4.3.1" engine.io-parser: "npm:~5.2.1" ws: "npm:~8.17.1" - checksum: 10/381c0a715362bebf32c95f0e4247899b53ff9f8c0074b03f88748cf17635a02948ea3eca27905df37130bc963747c0d286acc78c757e6fc085fe8b8e17d76e01 + checksum: 10/005b43b392d5b4b9bb196d1ae2a8cc1334a7dc70af3cfb50627d257de407ca1afae725fcd8571f9621cd12ed437abaac819c64cf22f09d5ae02b954a7e7bf4f8 languageName: node linkType: hard @@ -7697,26 +7717,27 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6": - version: 1.23.6 - resolution: "es-abstract@npm:1.23.6" +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" dependencies: - array-buffer-byte-length: "npm:^1.0.1" + array-buffer-byte-length: "npm:^1.0.2" arraybuffer.prototype.slice: "npm:^1.0.4" available-typed-arrays: "npm:^1.0.7" call-bind: "npm:^1.0.8" call-bound: "npm:^1.0.3" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" + es-set-tostringtag: "npm:^2.1.0" es-to-primitive: "npm:^1.3.0" - function.prototype.name: "npm:^1.1.7" - get-intrinsic: "npm:^1.2.6" - get-symbol-description: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" globalthis: "npm:^1.0.4" gopd: "npm:^1.2.0" has-property-descriptors: "npm:^1.0.2" @@ -7724,32 +7745,34 @@ __metadata: has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" internal-slot: "npm:^1.1.0" - is-array-buffer: "npm:^3.0.4" + is-array-buffer: "npm:^3.0.5" is-callable: "npm:^1.2.7" is-data-view: "npm:^1.0.2" - is-negative-zero: "npm:^2.0.3" is-regex: "npm:^1.2.1" - is-shared-array-buffer: "npm:^1.0.3" + is-shared-array-buffer: "npm:^1.0.4" is-string: "npm:^1.1.1" - is-typed-array: "npm:^1.1.13" + is-typed-array: "npm:^1.1.15" is-weakref: "npm:^1.1.0" - math-intrinsics: "npm:^1.0.0" + math-intrinsics: "npm:^1.1.0" object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" regexp.prototype.flags: "npm:^1.5.3" safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" string.prototype.trim: "npm:^1.2.10" string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.3" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" typed-array-length: "npm:^1.0.7" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.16" - checksum: 10/a8987ea76445505bedbdee09251ca5cb9bdbb1578df991eb69b888bd721448d17111ba847b560f6e7c8974989b885830663fef07b0bdf4ddf8b61ed7ecd34d58 + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10/31a321966d760d88fc2ed984104841b42f4f24fc322b246002b9be0af162e03803ee41fcc3cf8be89e07a27ba3033168f877dd983703cb81422ffe5322a27582 languageName: node linkType: hard @@ -7775,31 +7798,32 @@ __metadata: linkType: hard "es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: "npm:^1.3.0" - checksum: 10/f8910cf477e53c0615f685c5c96210591841850871b81924fcf256bfbaa68c254457d994a4308c60d15b20805e7f61ce6abc669375e01a5349391a8c1767584f + checksum: 10/54fe77de288451dae51c37bfbfe3ec86732dc3778f98f3eb3bdb4bf48063b2c0b8f9c93542656986149d08aa5be3204286e2276053d19582b76753f1a2728867 languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - get-intrinsic: "npm:^1.2.4" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.1" - checksum: 10/7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + hasown: "npm:^2.0.2" + checksum: 10/86814bf8afbcd8966653f731415888019d4bc4aca6b6c354132a7a75bb87566751e320369654a101d23a91c87a85c79b178bcf40332839bd347aff437c4fb65f languageName: node linkType: hard "es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" dependencies: - hasown: "npm:^2.0.0" - checksum: 10/6d3bf91f658a27cc7217cd32b407a0d714393a84d125ad576319b9e83a893bea165cf41270c29e9ceaa56d3cf41608945d7e2a2c31fd51c0009b0c31402b91c7 + hasown: "npm:^2.0.2" + checksum: 10/c351f586c30bbabc62355be49564b2435468b52c3532b8a1663672e3d10dc300197e69c247869dd173e56d86423ab95fc0c10b0939cdae597094e0fdca078cba languageName: node linkType: hard @@ -8239,6 +8263,13 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10/49ff46c3a7facbad3decb31f597063e761785d7fdb3920d4989d7b08c97a61c2f51183e2f3a03130c9088df88d4b489b1b79ab632219901f184f85158508f4c8 + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.0": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -8253,6 +8284,13 @@ __metadata: languageName: node linkType: hard +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be + languageName: node + linkType: hard + "execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -8318,9 +8356,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10/2d9bbb6473de7051f96790d5f9a678f32e60ed0aa70741dc7fdc96fec8d631124ec3374ac144387604f05afff9500f31a1d45bd9eee4cdc2e4f9ad2d9b9d5dbd + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10/ca2f01f1aa4dafd3f3917bd531ab5be08c6f5f4b2389d2e974f903de3cbeb50b9633374353516b6afd70905775e33aba11afab1232d3acf0aa2963b98a611c51 languageName: node linkType: hard @@ -8422,16 +8460,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad languageName: node linkType: hard @@ -8459,9 +8497,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.3 - resolution: "fast-uri@npm:3.0.3" - checksum: 10/92487c75848b03edc45517fca0148287d342c30818ce43d556391db774d8e01644fb6964315a3336eec5a90f301b218b21f71fb9b2528ba25757435a20392c95 + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 10/43c87cd03926b072a241590e49eca0e2dfe1d347ddffd4b15307613b42b8eacce00a315cf3c7374736b5f343f27e27ec88726260eb03a758336d507d6fbaba0a languageName: node linkType: hard @@ -8473,11 +8511,11 @@ __metadata: linkType: hard "fastq@npm:^1.13.0, fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.19.0 + resolution: "fastq@npm:1.19.0" dependencies: reusify: "npm:^1.0.4" - checksum: 10/a443180068b527dd7b3a63dc7f2a47ceca2f3e97b9c00a1efe5538757e6cc4056a3526df94308075d7727561baf09ebaa5b67da8dcbddb913a021c5ae69d1f69 + checksum: 10/20457acfb15946f8ea80496da296a0d4930919638315627f093269d302f46fa97eaac3ad180746910edcd6f7163b8125620c30a41427267ffacd10ab67b1c806 languageName: node linkType: hard @@ -8655,9 +8693,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.2 - resolution: "flatted@npm:3.3.2" - checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10/8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard @@ -8672,11 +8710,11 @@ __metadata: linkType: hard "for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: "npm:^1.1.3" - checksum: 10/fdac0cde1be35610bd635ae958422e8ce0cc1313e8d32ea6d34cfda7b60850940c1fd07c36456ad76bd9c24aef6ff5e03b02beb58c83af5ef6c968a64eada676 + is-callable: "npm:^1.2.7" + checksum: 10/330cc2439f85c94f4609de3ee1d32c5693ae15cdd7fe3d112c4fd9efd4ce7143f2c64ef6c2c9e0cfdb0058437f33ef05b5bdae5b98fcc903fb2143fbaf0fea0f languageName: node linkType: hard @@ -8707,13 +8745,14 @@ __metadata: linkType: hard "form-data@npm:^4.0.0, form-data@npm:^4.0.1": - version: 4.0.1 - resolution: "form-data@npm:4.0.1" + version: 4.0.2 + resolution: "form-data@npm:4.0.2" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" mime-types: "npm:^2.1.12" - checksum: 10/6adb1cff557328bc6eb8a68da205f9ae44ab0e88d4d9237aaf91eed591ffc64f77411efb9016af7d87f23d0a038c45a788aa1c6634e51175c4efa36c2bc53774 + checksum: 10/82c65b426af4a40090e517a1bc9057f76970b4c6043e37aa49859c447d88553e77d4cc5626395079a53d2b0889ba5f2a49f3900db3ad3f3f1bf76613532572fb languageName: node linkType: hard @@ -8806,7 +8845,7 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.7": +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": version: 1.1.8 resolution: "function.prototype.name@npm:1.1.8" dependencies: @@ -8855,21 +8894,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": - version: 1.2.6 - resolution: "get-intrinsic@npm:1.2.6" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7": + version: 1.2.7 + resolution: "get-intrinsic@npm:1.2.7" dependencies: call-bind-apply-helpers: "npm:^1.0.1" - dunder-proto: "npm:^1.0.0" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.0" gopd: "npm:^1.2.0" has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.0.0" - checksum: 10/a1ffae6d7893a6fa0f4d1472adbc85095edd6b3b0943ead97c3738539cecb19d422ff4d48009eed8c3c27ad678c2b1e38a83b1a1e96b691d13ed8ecefca1068d + math-intrinsics: "npm:^1.1.0" + checksum: 10/4f7149c9a826723f94c6d49f70bcb3df1d3f9213994fab3668f12f09fa72074681460fb29ebb6f135556ec6372992d63802386098791a8f09cfa6f27090fa67b languageName: node linkType: hard @@ -8887,6 +8926,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -8901,7 +8950,7 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": +"get-symbol-description@npm:^1.1.0": version: 1.1.0 resolution: "get-symbol-description@npm:1.1.0" dependencies: @@ -9054,16 +9103,16 @@ __metadata: linkType: hard "globby@npm:^14.0.2": - version: 14.0.2 - resolution: "globby@npm:14.0.2" + version: 14.1.0 + resolution: "globby@npm:14.1.0" dependencies: "@sindresorhus/merge-streams": "npm:^2.1.0" - fast-glob: "npm:^3.3.2" - ignore: "npm:^5.2.4" - path-type: "npm:^5.0.0" + fast-glob: "npm:^3.3.3" + ignore: "npm:^7.0.3" + path-type: "npm:^6.0.0" slash: "npm:^5.1.0" - unicorn-magic: "npm:^0.1.0" - checksum: 10/67660da70fc1223f7170c1a62ba6c373385e9e39765d952b6518606dec15ed8c7958e9dae6ba5752a31dbc1e9126f146938b830ad680fe794141734ffc3fbb75 + unicorn-magic: "npm:^0.3.0" + checksum: 10/e527ff54f0dddf60abfabd0d9e799768619d957feecd8b13ef60481f270bfdce0d28f6b09267c60f8064798fb3003b8ec991375f7fe0233fbce5304e1741368c languageName: node linkType: hard @@ -9263,7 +9312,7 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -9272,7 +9321,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -9323,7 +9372,7 @@ __metadata: "@codemirror/legacy-modes": "npm:6.4.3" "@codemirror/search": "npm:6.5.9" "@codemirror/state": "npm:6.5.2" - "@codemirror/view": "npm:6.36.2" + "@codemirror/view": "npm:6.36.3" "@egjs/hammerjs": "npm:2.0.17" "@formatjs/intl-datetimeformat": "npm:6.17.3" "@formatjs/intl-displaynames": "npm:6.8.10" @@ -9639,9 +9688,9 @@ __metadata: linkType: hard "http-parser-js@npm:>=0.5.1": - version: 0.5.8 - resolution: "http-parser-js@npm:0.5.8" - checksum: 10/2a78a567ee6366dae0129d819b799dce1f95ec9732c5ab164a78ee69804ffb984abfa0660274e94e890fc54af93546eb9f12b6d10edbaed017e2d41c29b7cf29 + version: 0.5.9 + resolution: "http-parser-js@npm:0.5.9" + checksum: 10/65e6ef5e063b4f67c590bdd122b255e9b70c5bf3429718f8b72951fe98f4f968c55a58ec88cc96a11357a437d75c4af9302b8026c0b53c525065ff4eb0cd969e languageName: node linkType: hard @@ -9763,13 +9812,20 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": +"ignore@npm:^5.2.0, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 languageName: node linkType: hard +"ignore@npm:^7.0.3": + version: 7.0.3 + resolution: "ignore@npm:7.0.3" + checksum: 10/ce5e812af3acd6607a3fe0a9f9b5f01d53f009a5ace8cbf5b6491d05a481b55d65186e6a7eaa13126e93f15276bcf3d1e8d6ff3ce5549c312f9bb313fff33365 + languageName: node + linkType: hard + "image-q@npm:^4.0.0": version: 4.0.0 resolution: "image-q@npm:4.0.0" @@ -9787,12 +9843,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10/2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: 10/a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -9917,11 +9973,15 @@ __metadata: linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10/2cf336fbf8cba3badcf526aa3d10384c30bab32615ac4831b74492eb4e843ccb7d8439a119c27f84bcf217d72024e611b1373f870f433b48f3fa57d3d1b863f1 + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/7c2ac7efdf671e03265e74a043bcb1c0a32e226bc2a42dfc5ec8644667df668bbe14b91c08e6c1414f392f8cf86cd1d489b3af97756e2c7a49dd1ba63fd40ca6 languageName: node linkType: hard @@ -9944,12 +10004,12 @@ __metadata: linkType: hard "is-boolean-object@npm:^1.2.1": - version: 1.2.1 - resolution: "is-boolean-object@npm:1.2.1" + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bound: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-tostringtag: "npm:^1.0.2" - checksum: 10/5a15524635c9334ebbd668f20a6cbf023adceed5725ec96a50056d21ae65f52759d04a8fa7d7febf00ff3bc4e6d3837638eb84be572f287bcfd15f8b8facde43 + checksum: 10/051fa95fdb99d7fbf653165a7e6b2cba5d2eb62f7ffa81e793a790f3fb5366c91c1b7b6af6820aa2937dd86c73aa3ca9d9ca98f500988457b1c59692c52ba911 languageName: node linkType: hard @@ -9962,7 +10022,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 10/48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 @@ -9970,11 +10030,11 @@ __metadata: linkType: hard "is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0": - version: 2.16.0 - resolution: "is-core-module@npm:2.16.0" + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: hasown: "npm:^2.0.2" - checksum: 10/064442b9eefb7162376a4a414aa98b1e0c6cbb471507e66966b7d6d607a3f60eb09c7da4ee401648640a389e4af0f5a770bd5b3cd9c1084853e4a57f472408f8 + checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb languageName: node linkType: hard @@ -10066,11 +10126,14 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10/499a3ce6361064c3bd27fbff5c8000212d48506ebe1977842bbd7b3e708832d0deb1f4cc69186ece3640770e8c4f1287b24d99588a0b8058b2dbdd344bc1f47f + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/5906ff51a856a5fbc6b90a90fce32040b0a6870da905f98818f1350f9acadfc9884f7c3dec833fce04b83dd883937b86a190b6593ede82e8b1af8b6c4ecf7cbd languageName: node linkType: hard @@ -10115,13 +10178,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: 10/8fe5cffd8d4fb2ec7b49d657e1691889778d037494c6f40f4d1a524cadd658b4b53ad7b6b73a59bcb4b143ae9a3d15829af864b2c0f9d65ac1e678c4c80f17e5 - languageName: node - linkType: hard - "is-network-error@npm:^1.0.0": version: 1.1.0 resolution: "is-network-error@npm:1.1.0" @@ -10239,7 +10295,7 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.3": +"is-shared-array-buffer@npm:^1.0.4": version: 1.0.4 resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: @@ -10332,11 +10388,11 @@ __metadata: linkType: hard "is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": - version: 1.1.0 - resolution: "is-weakref@npm:1.1.0" + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" dependencies: - call-bound: "npm:^1.0.2" - checksum: 10/89e627cc1763ea110574bb408fcf060ede47e70437d9278858bc939e3b3f7e4b7c558610b733da5f2ad6084d9f12b9c714b011ccf3fa771ec87e221c22bed910 + call-bound: "npm:^1.0.3" + checksum: 10/543506fd8259038b371bb083aac25b16cb4fd8b12fc58053aa3d45ac28dfd001cd5c6dffbba7aeea4213c74732d46b6cb2cfb5b412eed11f2db524f3f97d09a0 languageName: node linkType: hard @@ -10480,11 +10536,11 @@ __metadata: linkType: hard "jackspeak@npm:^4.0.1": - version: 4.0.2 - resolution: "jackspeak@npm:4.0.2" + version: 4.0.3 + resolution: "jackspeak@npm:4.0.3" dependencies: "@isaacs/cliui": "npm:^8.0.2" - checksum: 10/d9722f0e55f6c322c57aedf094c405f4201b834204629817187953988075521cfddb23df83e2a7b845723ca7eb0555068c5ce1556732e9c275d32a531881efa8 + checksum: 10/0aa5b094a0308935a576c0534f30008ae0bdff6e81b1b0abf8fdd7cd7b16cdaa72259220808924f1a94eab5051668a58404f8e72868d0c6f4d1888b5cd990fc7 languageName: node linkType: hard @@ -10586,7 +10642,16 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 + languageName: node + linkType: hard + +"jsesc@npm:~3.0.2": version: 3.0.2 resolution: "jsesc@npm:3.0.2" bin: @@ -10736,12 +10801,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.1": - version: 2.9.1 - resolution: "launch-editor@npm:2.9.1" + version: 2.10.0 + resolution: "launch-editor@npm:2.10.0" dependencies: picocolors: "npm:^1.0.0" shell-quote: "npm:^1.8.1" - checksum: 10/69eb1e69db4f0fcd34a42bd47e9adbad27cb5413408fcc746eb7b016128ce19d71a30629534b17aa5886488936aaa959bf7dab17307ad5ed6c7247a0d145be18 + checksum: 10/2ef26369d89ad22938c1f5c343a622ff2e8e2f7709901c739ef38319a103b7da400afc147005e765fc0c22fd467eeb5f63f98568b3882e21f7782a4061fdeb60 languageName: node linkType: hard @@ -11048,9 +11113,9 @@ __metadata: linkType: hard "loupe@npm:^3.1.0, loupe@npm:^3.1.2": - version: 3.1.2 - resolution: "loupe@npm:3.1.2" - checksum: 10/8f5734e53fb64cd914aa7d986e01b6d4c2e3c6c56dcbd5428d71c2703f0ab46b5ab9f9eeaaf2b485e8a1c43f865bdd16ec08ae1a661c8f55acdbd9f4d59c607a + version: 3.1.3 + resolution: "loupe@npm:3.1.3" + checksum: 10/9e98c34daf0eba48ccc603595e51f2ae002110982d84879cf78c51de2c632f0c571dfe82ce4210af60c32203d06b443465c269bda925076fe6d9b612cc65c321 languageName: node linkType: hard @@ -11063,14 +11128,14 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a languageName: node linkType: hard -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.0.2": +"lru-cache@npm:^11.0.0": version: 11.0.2 resolution: "lru-cache@npm:11.0.2" checksum: 10/25fcb66e9d91eaf17227c6abfe526a7bed5903de74f93bfde380eb8a13410c5e8d3f14fe447293f3f322a7493adf6f9f015c6f1df7a235ff24ec30f366e1c058 @@ -11173,7 +11238,7 @@ __metadata: languageName: node linkType: hard -"math-intrinsics@npm:^1.0.0": +"math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" checksum: 10/11df2eda46d092a6035479632e1ec865b8134bdfc4bd9e571a656f4191525404f13a283a515938c3a8de934dbfd9c09674d9da9fa831e6eb7e22b50b197d2edd @@ -11188,14 +11253,14 @@ __metadata: linkType: hard "memfs@npm:^4.6.0": - version: 4.15.0 - resolution: "memfs@npm:4.15.0" + version: 4.17.0 + resolution: "memfs@npm:4.17.0" dependencies: "@jsonjoy.com/json-pack": "npm:^1.0.3" "@jsonjoy.com/util": "npm:^1.3.0" tree-dump: "npm:^1.0.1" tslib: "npm:^2.0.0" - checksum: 10/ab895e5574e0944daf9768c92a2649c8b3384121dd87583b9f4e6d9d36e1b30d2eb2b695e7f6f2bad7c07b2ac51fcc64adbf9aa5425a84eb73546738f05f434e + checksum: 10/346cfc8c7396a4716c362bb5c4eebf995c52927a5de4bb7b5bbc31a759b443f22b5a8087d8d71e93feebff33f10d735682f4fa53afb461607e832a4aa4c80eb9 languageName: node linkType: hard @@ -11471,9 +11536,9 @@ __metadata: linkType: hard "mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: 10/8d95f714ea200c6cf3e3777cbc6168be04b05ac510090a9b41eef5ec081efeb1d1de3e535ffb9c9689fffcc42f59864fd52a500e84a677274f070adeea615c45 + version: 2.0.1 + resolution: "mrmime@npm:2.0.1" + checksum: 10/1f966e2c05b7264209c4149ae50e8e830908eb64dd903535196f6ad72681fa109b794007288a3c2814f7a1ecf9ca192769909c0c374d974d604a8de5fc095d4a languageName: node linkType: hard @@ -11592,8 +11657,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.0.0 - resolution: "node-gyp@npm:11.0.0" + version: 11.1.0 + resolution: "node-gyp@npm:11.1.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -11607,7 +11672,7 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/5d07430e887a906f85c7c6ed87e8facb7ecd4ce42d948a2438c471df2e24ae6af70f4def114ec1a03127988d164648dda8d75fe666f3c4b431e53856379fdf13 + checksum: 10/3314ebfeb99dbcdf9e8c810df1ee52294045399873d4ab1e6740608c4fbe63adaf6580c0610b23c6eda125e298536553f5bb6fb0df714016a5c721ed31095e42 languageName: node linkType: hard @@ -11647,13 +11712,13 @@ __metadata: linkType: hard "nopt@npm:^8.0.0": - version: 8.0.0 - resolution: "nopt@npm:8.0.0" + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^3.0.0" bin: nopt: bin/nopt.js - checksum: 10/2d137f64b6f9331ec97047dd1cbbe4dcd9a61ceef4fd0f2252c0bbac1d69ba15671e6fd83a441328824b3ca78afe6ebe1694f12ebcd162b73a221582a06179ff + checksum: 10/26ab456c51a96f02a9e5aa8d1b80ef3219f2070f3f3528a040e32fb735b1e651e17bdf0f1476988d3a46d498f35c65ed662d122f340d38ce4a7e71dd7b20c4bc languageName: node linkType: hard @@ -11722,9 +11787,9 @@ __metadata: linkType: hard "object-inspect@npm:^1.13.3": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 10/14cb973d8381c69e14d7f1c8c75044eb4caf04c6dabcf40ca5c2ce42dc2073ae0bb2a9939eeca142b0c05215afaa1cd5534adb7c8879c32cba2576e045ed8368 + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb languageName: node linkType: hard @@ -11735,7 +11800,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.2, object.assign@npm:^4.1.5": +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.7": version: 4.1.7 resolution: "object.assign@npm:4.1.7" dependencies: @@ -11937,6 +12002,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10/ab4bb3b8636908554fc19bf899e225444195092864cb61503a0d048fdaf662b04be2605b636a4ffeaf6e8811f6fcfa8cbb210ec964c0eb1a41eb853e1d5d2f41 + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -12253,17 +12329,17 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^5.0.0": - version: 5.0.0 - resolution: "path-type@npm:5.0.0" - checksum: 10/15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5 +"path-type@npm:^6.0.0": + version: 6.0.0 + resolution: "path-type@npm:6.0.0" + checksum: 10/b9f6eaf7795c48d5c9bc4c6bc3ac61315b8d36975a73497ab2e02b764c0836b71fb267ea541863153f633a069a1c2ed3c247cb781633842fc571c655ac57c00e languageName: node linkType: hard "pathe@npm:^2.0.2": - version: 2.0.2 - resolution: "pathe@npm:2.0.2" - checksum: 10/027dd246720ec6d3b5567e2b0201f1a815b6a69f2912a4dcafed59620afc729af15b4aff4bc780504c88d11dfb081c051e37327b928a093e714c3e09bf35aff3 + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d languageName: node linkType: hard @@ -12281,7 +12357,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -12383,20 +12459,20 @@ __metadata: linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10/8ed3e96dfeea1c5880c1f4c9cb707e5fb26e8be22f14f82ef92df20fd2004e635c62ba47fbe8f2bb63bfd80dac1474be2fb39798da8c2feba2815435d1f749af + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10/2f44137b8d3dd35f4a7ba7469eec1cd9cfbb46ec164b93a5bc1f4c3d68599c9910ee3b91da1d28b4560e9cc8414c3cd56fedc07259c67e52cc774476270d3302 languageName: node linkType: hard -"postcss@npm:^8.4.14, postcss@npm:^8.4.49": - version: 8.5.1 - resolution: "postcss@npm:8.5.1" +"postcss@npm:^8.4.14, postcss@npm:^8.5.1": + version: 8.5.2 + resolution: "postcss@npm:8.5.2" dependencies: nanoid: "npm:^3.3.8" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/1fbd28753143f7f03e4604813639918182b15343c7ad0f4e72f3875fc2cc0b8494c887f55dc05008fad5fbf1e1e908ce2edbbce364a91f84dcefb71edf7cd31d + checksum: 10/e08c2be3cf461cc63cf4c8e97bb3d5185e196ee0a9b75879cf130590f32bc38c7829c6c4e260158e214fb68a828a95bdac84c8f17fefba993d3ced686643c3e2 languageName: node linkType: hard @@ -12460,6 +12536,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10/dbaa7e8d1d5cf375c36963ff43116772a989ef2bb47c9bdee20f38fd8fc061119cf38140631cf90c781aca4d3f0f0d2c834711952b728953f04fd7d238f59f5b + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -12532,13 +12615,6 @@ __metadata: languageName: node linkType: hard -"queue-tick@npm:^1.0.1": - version: 1.0.1 - resolution: "queue-tick@npm:1.0.1" - checksum: 10/f447926c513b64a857906f017a3b350f7d11277e3c8d2a21a42b7998fa1a613d7a829091e12d142bb668905c8f68d8103416c7197856efb0c72fa835b8e254b5 - languageName: node - linkType: hard - "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -12588,7 +12664,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -12614,12 +12690,25 @@ __metadata: languageName: node linkType: hard -"readable-web-to-node-stream@npm:^3.0.0": - version: 3.0.2 - resolution: "readable-web-to-node-stream@npm:3.0.2" +"readable-stream@npm:^4.7.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" dependencies: - readable-stream: "npm:^3.6.0" - checksum: 10/d3a5bf9d707c01183d546a64864aa63df4d9cb835dfd2bf89ac8305e17389feef2170c4c14415a10d38f9b9bfddf829a57aaef7c53c8b40f11d499844bf8f1a4 + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10/bdf096c8ff59452ce5d08f13da9597f9fcfe400b4facfaa88e74ec057e5ad1fdfa140ffe28e5ed806cf4d2055f0b812806e962bca91dce31bc4cef08e53be3a4 + languageName: node + linkType: hard + +"readable-web-to-node-stream@npm:^3.0.0": + version: 3.0.4 + resolution: "readable-web-to-node-stream@npm:3.0.4" + dependencies: + readable-stream: "npm:^4.7.0" + checksum: 10/d8fb3de7579d70ea1e9efdfb2f02e2965ae62a1e1d9e9b0bdce493cb3b98090bd4a34526a9ab6c793bb833b89ffd31a5ab06117a3ae2a3df21363651b2131da9 languageName: node linkType: hard @@ -12642,18 +12731,18 @@ __metadata: linkType: hard "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": - version: 1.0.9 - resolution: "reflect.getprototypeof@npm:1.0.9" + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - dunder-proto: "npm:^1.0.1" - es-abstract: "npm:^1.23.6" + es-abstract: "npm:^1.23.9" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - gopd: "npm:^1.2.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" which-builtin-type: "npm:^1.2.1" - checksum: 10/652c82cc3b09a2aa489949beae2ee645ba57dba02729ddca3c43299fecb6a16ac5877ea4c9b5397aa2f3d82e653bc4f812a83aada46451ce48f80ca6596d8835 + checksum: 10/80a4e2be716f4fe46a89a08ccad0863b47e8ce0f49616cab2d65dab0fbd53c6fdba0f52935fd41d37a2e4e22355c272004f920d63070de849f66eea7aeb4a081 languageName: node linkType: hard @@ -12706,14 +12795,16 @@ __metadata: linkType: hard "regexp.prototype.flags@npm:^1.5.3": - version: 1.5.3 - resolution: "regexp.prototype.flags@npm:1.5.3" + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" set-function-name: "npm:^2.0.2" - checksum: 10/fe17bc4eebbc72945aaf9dd059eb7784a5ca453a67cc4b5b3e399ab08452c9a05befd92063e2c52e7b24d9238c60031656af32dd57c555d1ba6330dbf8c23b43 + checksum: 10/8ab897ca445968e0b96f6237641510f3243e59c180ee2ee8d83889c52ff735dd1bf3657fcd36db053e35e1d823dd53f2565d0b8021ea282c9fe62401c6c3bd6d languageName: node linkType: hard @@ -12986,29 +13077,29 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.23.0": - version: 4.31.0 - resolution: "rollup@npm:4.31.0" +"rollup@npm:^4.30.1": + version: 4.34.8 + resolution: "rollup@npm:4.34.8" dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.31.0" - "@rollup/rollup-android-arm64": "npm:4.31.0" - "@rollup/rollup-darwin-arm64": "npm:4.31.0" - "@rollup/rollup-darwin-x64": "npm:4.31.0" - "@rollup/rollup-freebsd-arm64": "npm:4.31.0" - "@rollup/rollup-freebsd-x64": "npm:4.31.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.31.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.31.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.31.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.31.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.31.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-x64-musl": "npm:4.31.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.31.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.31.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.31.0" + "@rollup/rollup-android-arm-eabi": "npm:4.34.8" + "@rollup/rollup-android-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-x64": "npm:4.34.8" + "@rollup/rollup-freebsd-arm64": "npm:4.34.8" + "@rollup/rollup-freebsd-x64": "npm:4.34.8" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-arm64-musl": "npm:4.34.8" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.34.8" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-s390x-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-musl": "npm:4.34.8" + "@rollup/rollup-win32-arm64-msvc": "npm:4.34.8" + "@rollup/rollup-win32-ia32-msvc": "npm:4.34.8" + "@rollup/rollup-win32-x64-msvc": "npm:4.34.8" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -13054,7 +13145,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/4f5fac0a0df7878ca810512c283df0e81b21d42fed262943b412c488a30beceb0149a4be36dbf2750b6c5cbfa4d4cf5097a134266f1425a9e213c2a2a09853fc + checksum: 10/a8cafc19b181c521afe37c4d7601af72dedaf233e1c09ee2276a93b2656f69a08ddbc37766c397043dc413d985460c37184f1efece9d75d82225c5b880798eb0 languageName: node linkType: hard @@ -13138,6 +13229,16 @@ __metadata: languageName: node linkType: hard +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10/2bd4e53b6694f7134b9cf93631480e7fafc8637165f0ee91d5a4af5e7f33d37de9562d1af5021178dd4217d0230cde8d6530fa28cfa1ebff9a431bf8fff124b4 + languageName: node + linkType: hard + "safe-regex-test@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex-test@npm:1.1.0" @@ -13222,11 +13323,11 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.6.0, semver@npm:^7.6.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" + version: 7.7.1 + resolution: "semver@npm:7.7.1" bin: semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + checksum: 10/4cfa1eb91ef3751e20fc52e47a935a0118d56d6f15a837ab814da0c150778ba2ca4f1a4d9068b33070ea4273629e615066664c2cfcd7c272caf7a8a0f6518b2c languageName: node linkType: hard @@ -13356,6 +13457,17 @@ __metadata: languageName: node linkType: hard +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10/b87f8187bca595ddc3c0721ece4635015fd9d7cb294e6dd2e394ce5186a71bbfa4dc8a35010958c65e43ad83cde09642660e61a952883c24fd6b45ead15f045c + languageName: node + linkType: hard + "setimmediate@npm:^1.0.5": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" @@ -13604,12 +13716,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + version: 2.8.4 + resolution: "socks@npm:2.8.4" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10/ffcb622c22481dfcd7589aae71fbfd71ca34334064d181df64bf8b7feaeee19706aba4cffd1de35cc7bbaeeaa0af96be2d7f40fcbc7bc0ab69533a7ae9ffc4fb + checksum: 10/ab3af97aeb162f32c80e176c717ccf16a11a6ebb4656a62b94c0f96495ea2a1f4a8206c04b54438558485d83d0c5f61920c07a1a5d3963892a589b40cc6107dd languageName: node linkType: hard @@ -13822,17 +13934,16 @@ __metadata: linkType: hard "streamx@npm:^2.12.0, streamx@npm:^2.12.5, streamx@npm:^2.13.2, streamx@npm:^2.14.0": - version: 2.21.1 - resolution: "streamx@npm:2.21.1" + version: 2.22.0 + resolution: "streamx@npm:2.22.0" dependencies: bare-events: "npm:^2.2.0" fast-fifo: "npm:^1.3.2" - queue-tick: "npm:^1.0.1" text-decoder: "npm:^1.1.0" dependenciesMeta: bare-events: optional: true - checksum: 10/d61ee82033f8b900226e2405aeb683de5f51a68ded1d40198d548cd9a7b2e47b7706442c9142bbc7fc59874f03063ee41ddf9e8667e63186b507b2e6b394ac28 + checksum: 10/9c329bb316e2085e207e471ecd0da18b4ed5b1cfe5cf10e9e7fad3f8f50c6ca1a6a844bdfd9bc7521560b97f229890de82ca162a0e66115300b91a489b1cbefd languageName: node linkType: hard @@ -13935,7 +14046,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -14193,8 +14304,8 @@ __metadata: linkType: hard "terser@npm:^5.15.1, terser@npm:^5.17.4, terser@npm:^5.31.1": - version: 5.37.0 - resolution: "terser@npm:5.37.0" + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -14202,7 +14313,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/3afacf7c38c47a5a25dbe1ba2e7aafd61166474d4377ec0af490bd41ab3686ab12679818d5fe4a3e7f76efee26f639c92ac334940c378bbc31176520a38379c3 + checksum: 10/d84aff642398329f7179bbeaca28cac76a86100e2372d98d39d9b86c48023b6b9f797d983d6e7c0610b3f957c53d01ada1befa25d625614cb2ccd20714f1e98b languageName: node linkType: hard @@ -14334,21 +14445,21 @@ __metadata: languageName: node linkType: hard -"tldts-core@npm:^6.1.69": - version: 6.1.69 - resolution: "tldts-core@npm:6.1.69" - checksum: 10/4f38497705dbb80e4d4d3cbdf6f931650371575fa27479ec6fba4e3527fb2929f703126a1026713674d882a7cb519ee1dd8f3f2d33c0dce284b3994e8b0177cc +"tldts-core@npm:^6.1.77": + version: 6.1.77 + resolution: "tldts-core@npm:6.1.77" + checksum: 10/0f5ac4eb77099a5858c7f32f346af552a6dcd7acb6612e65642263e6b65288fb4e90f0278cabb3dd5d28df3182e5b1d8559928940a05c68d07f12617546bfa6c languageName: node linkType: hard "tldts@npm:^6.1.32": - version: 6.1.69 - resolution: "tldts@npm:6.1.69" + version: 6.1.77 + resolution: "tldts@npm:6.1.77" dependencies: - tldts-core: "npm:^6.1.69" + tldts-core: "npm:^6.1.77" bin: tldts: bin/cli.js - checksum: 10/a918ca1020985d708aa79e139e7c7a0f4bdf634c10ca4d03cad04ddd6145d576832a76f2dfab0583c45f5ad0f3d17d2c812c8b39421d6a0273e22a05e4a9e083 + checksum: 10/11b22d44ed1bfaf101b2d8f19df2c4de1acf956b5f4b1bfa341fd08089dab3e35839f006de32252d3d8bc4cf2c620e4dc2054fe88fb81359b7087d27bc5e5652 languageName: node linkType: hard @@ -14402,11 +14513,11 @@ __metadata: linkType: hard "tough-cookie@npm:^5.0.0": - version: 5.0.0 - resolution: "tough-cookie@npm:5.0.0" + version: 5.1.1 + resolution: "tough-cookie@npm:5.1.1" dependencies: tldts: "npm:^6.1.32" - checksum: 10/a98d3846ed386e399e8b470c1eb08a6a296944246eabc55c9fe79d629bd2cdaa62f5a6572f271fe0060987906bd20468d72a219a3b4cbe51086bea48d2d677b6 + checksum: 10/6cb1e38216ce579406ecb1790cfa208754995b2cb48a8a787e0a1d7b0750300020a541fd5df5c497bc5a2db895b618151c416f9a584c6f725a56655c66910ab8 languageName: node linkType: hard @@ -14637,9 +14748,9 @@ __metadata: linkType: hard "type-fest@npm:^4.33.0": - version: 4.33.0 - resolution: "type-fest@npm:4.33.0" - checksum: 10/0d179e66fa765bd0a25a785b12dc797f90f2f92bdb8c9c8a789f3fd8e5a4492444e7ef83551b3b8463aeab24fd6195761e26b03174722de636b4b75aa5726fb7 + version: 4.35.0 + resolution: "type-fest@npm:4.35.0" + checksum: 10/43aada576d02f2f5230bd46c859e421a1307694312b3405088a48fcc67d65bee12eafbdcd182cffe0577dd72346595cb90a1ab5700626df35bc8935cf02c635b languageName: node linkType: hard @@ -14653,7 +14764,7 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": +"typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" dependencies: @@ -14664,7 +14775,7 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": +"typed-array-byte-length@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-byte-length@npm:1.0.3" dependencies: @@ -14677,7 +14788,7 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.3": +"typed-array-byte-offset@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: @@ -14789,7 +14900,7 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": +"unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" dependencies: @@ -14872,10 +14983,10 @@ __metadata: languageName: node linkType: hard -"unicorn-magic@npm:^0.1.0": - version: 0.1.0 - resolution: "unicorn-magic@npm:0.1.0" - checksum: 10/9b4d0e9809807823dc91d0920a4a4c0cff2de3ebc54ee87ac1ee9bc75eafd609b09d1f14495e0173aef26e01118706196b6ab06a75fe0841028b3983a8af313f +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10/bdd7d7c522f9456f32a0b77af23f8854f9a7db846088c3868ec213f9550683ab6a2bdf3803577eacbafddb4e06900974385841ccb75338d17346ccef45f9cb01 languageName: node linkType: hard @@ -14935,16 +15046,16 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" dependencies: escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/7678dd8609750588d01aa7460e8eddf2ff9d16c2a52fb1811190e0d056390f1fdffd94db3cf8fb209cf634ab4fa9407886338711c71cc6ccade5eeb22b093734 + checksum: 10/e7bf8221dfb21eba4a770cd803df94625bb04f65a706aa94c567de9600fe4eb6133fda016ec471dad43b9e7959c1bffb6580b5e20a87808d2e8a13e3892699a9 languageName: node linkType: hard @@ -15149,13 +15260,13 @@ __metadata: linkType: hard "vite@npm:^5.0.0 || ^6.0.0": - version: 6.0.11 - resolution: "vite@npm:6.0.11" + version: 6.1.0 + resolution: "vite@npm:6.1.0" dependencies: esbuild: "npm:^0.24.2" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.49" - rollup: "npm:^4.23.0" + postcss: "npm:^8.5.1" + rollup: "npm:^4.30.1" peerDependencies: "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: ">=1.21.0" @@ -15196,7 +15307,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/753d06b07a4d90863d3478162cfb18fa5cd7f6eb22a74525348a8fd46593a82875d0f92352c2f4833e15cb6581fc97d6ab434c0c5d83d8d58cfbbe6e7267726d + checksum: 10/5de360ac0ecb3cac85f796ec97d5347e2c8102a8845309af87f52296279464a6d5b880beb740bc42740936ec9de8bf0acce6a6ed3b3b24a733162a5d63d9f46b languageName: node linkType: hard @@ -15577,12 +15688,12 @@ __metadata: linkType: hard "whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.0": - version: 14.1.0 - resolution: "whatwg-url@npm:14.1.0" + version: 14.1.1 + resolution: "whatwg-url@npm:14.1.1" dependencies: tr46: "npm:^5.0.0" webidl-conversions: "npm:^7.0.0" - checksum: 10/3afd325de6cf3a367820ce7c3566a1f78eb1409c4f27b1867c74c76dab096d26acedf49a8b9b71db53df7d806ec2e9ae9ed96990b2f7d1abe6ecf1fe753af6eb + checksum: 10/803bede3ec6c8f14de0d84ac6032479646b5a2b08f5a7289366c3461caed9d7888d171e2846b59798869191037562c965235c2eed6ff2e266c05a2b4a6ce0160 languageName: node linkType: hard @@ -15660,7 +15771,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16": +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": version: 1.1.18 resolution: "which-typed-array@npm:1.1.18" dependencies: From 4d7634ac673ad6739df2b2dd60a9f532fa997ea7 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Fri, 21 Feb 2025 07:14:10 +0100 Subject: [PATCH 40/50] Landing-page: ping supervisor before get network infos (#24330) * Ping supervisor before get network infos * Rename supervisor proxy prefix --- .../src/components/landing-page-network.ts | 24 ++++++++++++++++++- landing-page/src/data/supervisor.ts | 12 ++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/landing-page/src/components/landing-page-network.ts b/landing-page/src/components/landing-page-network.ts index 7e32877c84..bf5a7e9115 100644 --- a/landing-page/src/components/landing-page-network.ts +++ b/landing-page/src/components/landing-page-network.ts @@ -17,6 +17,7 @@ import "../../../src/components/ha-alert"; import { ALTERNATIVE_DNS_SERVERS, getSupervisorNetworkInfo, + pingSupervisor, setSupervisorNetworkDns, } from "../data/supervisor"; import { fireEvent } from "../../../src/common/dom/fire_event"; @@ -85,7 +86,28 @@ class LandingPageNetwork extends LitElement { protected firstUpdated(_changedProperties: PropertyValues): void { super.firstUpdated(_changedProperties); - this._fetchSupervisorInfo(); + this._pingSupervisor(); + } + + private _schedulePingSupervisor() { + setTimeout( + () => this._pingSupervisor(), + SCHEDULE_FETCH_NETWORK_INFO_SECONDS * 1000 + ); + } + + private async _pingSupervisor() { + try { + const response = await pingSupervisor(); + if (!response.ok) { + throw new Error("Failed to ping supervisor, assume update in progress"); + } + this._fetchSupervisorInfo(); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + this._schedulePingSupervisor(); + } } private _scheduleFetchSupervisorInfo() { diff --git a/landing-page/src/data/supervisor.ts b/landing-page/src/data/supervisor.ts index 8b75f3f753..41c28297e0 100644 --- a/landing-page/src/data/supervisor.ts +++ b/landing-page/src/data/supervisor.ts @@ -18,7 +18,7 @@ export const ALTERNATIVE_DNS_SERVERS: { ]; export async function getSupervisorLogs(lines = 100) { - return fetch(`/supervisor/supervisor/logs?lines=${lines}`, { + return fetch(`/supervisor-api/supervisor/logs?lines=${lines}`, { headers: { Accept: "text/plain", }, @@ -26,22 +26,26 @@ export async function getSupervisorLogs(lines = 100) { } export async function getSupervisorLogsFollow(lines = 500) { - return fetch(`/supervisor/supervisor/logs/follow?lines=${lines}`, { + return fetch(`/supervisor-api/supervisor/logs/follow?lines=${lines}`, { headers: { Accept: "text/plain", }, }); } +export async function pingSupervisor() { + return fetch("/supervisor-api/supervisor/ping"); +} + export async function getSupervisorNetworkInfo() { - return fetch("/supervisor/network/info"); + return fetch("/supervisor-api/network/info"); } export const setSupervisorNetworkDns = async ( dnsServerIndex: number, primaryInterface: string ) => - fetch(`/supervisor/network/interface/${primaryInterface}/update`, { + fetch(`/supervisor-api/network/interface/${primaryInterface}/update`, { method: "POST", body: JSON.stringify({ ipv4: { From fb3f779121f0a5aec22ff8a6a8accc2a0f525cdd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:03:00 +0100 Subject: [PATCH 41/50] Update rspack monorepo to v1.2.4 (#24343) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 127 +++++++++++++++++++++++---------------------------- 2 files changed, 58 insertions(+), 73 deletions(-) diff --git a/package.json b/package.json index 67b59789ef..6e2aef5566 100644 --- a/package.json +++ b/package.json @@ -166,8 +166,8 @@ "@octokit/plugin-retry": "7.1.4", "@octokit/rest": "21.1.1", "@rsdoctor/rspack-plugin": "0.4.13", - "@rspack/cli": "1.2.3", - "@rspack/core": "1.2.3", + "@rspack/cli": "1.2.4", + "@rspack/core": "1.2.4", "@types/babel__plugin-transform-runtime": "7.9.5", "@types/chromecast-caf-receiver": "6.0.21", "@types/chromecast-caf-sender": "1.0.11", diff --git a/yarn.lock b/yarn.lock index 27bff1fa64..f49a3aa5c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4187,82 +4187,82 @@ __metadata: languageName: node linkType: hard -"@rspack/binding-darwin-arm64@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-darwin-arm64@npm:1.2.3" +"@rspack/binding-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-darwin-arm64@npm:1.2.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-darwin-x64@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-darwin-x64@npm:1.2.3" +"@rspack/binding-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-darwin-x64@npm:1.2.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rspack/binding-linux-arm64-gnu@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-linux-arm64-gnu@npm:1.2.3" +"@rspack/binding-linux-arm64-gnu@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.2.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-arm64-musl@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-linux-arm64-musl@npm:1.2.3" +"@rspack/binding-linux-arm64-musl@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.2.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rspack/binding-linux-x64-gnu@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-linux-x64-gnu@npm:1.2.3" +"@rspack/binding-linux-x64-gnu@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.2.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-x64-musl@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-linux-x64-musl@npm:1.2.3" +"@rspack/binding-linux-x64-musl@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-linux-x64-musl@npm:1.2.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rspack/binding-win32-arm64-msvc@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-win32-arm64-msvc@npm:1.2.3" +"@rspack/binding-win32-arm64-msvc@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.2.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-win32-ia32-msvc@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-win32-ia32-msvc@npm:1.2.3" +"@rspack/binding-win32-ia32-msvc@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.2.4" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rspack/binding-win32-x64-msvc@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding-win32-x64-msvc@npm:1.2.3" +"@rspack/binding-win32-x64-msvc@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.2.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rspack/binding@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/binding@npm:1.2.3" +"@rspack/binding@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/binding@npm:1.2.4" dependencies: - "@rspack/binding-darwin-arm64": "npm:1.2.3" - "@rspack/binding-darwin-x64": "npm:1.2.3" - "@rspack/binding-linux-arm64-gnu": "npm:1.2.3" - "@rspack/binding-linux-arm64-musl": "npm:1.2.3" - "@rspack/binding-linux-x64-gnu": "npm:1.2.3" - "@rspack/binding-linux-x64-musl": "npm:1.2.3" - "@rspack/binding-win32-arm64-msvc": "npm:1.2.3" - "@rspack/binding-win32-ia32-msvc": "npm:1.2.3" - "@rspack/binding-win32-x64-msvc": "npm:1.2.3" + "@rspack/binding-darwin-arm64": "npm:1.2.4" + "@rspack/binding-darwin-x64": "npm:1.2.4" + "@rspack/binding-linux-arm64-gnu": "npm:1.2.4" + "@rspack/binding-linux-arm64-musl": "npm:1.2.4" + "@rspack/binding-linux-x64-gnu": "npm:1.2.4" + "@rspack/binding-linux-x64-musl": "npm:1.2.4" + "@rspack/binding-win32-arm64-msvc": "npm:1.2.4" + "@rspack/binding-win32-ia32-msvc": "npm:1.2.4" + "@rspack/binding-win32-x64-msvc": "npm:1.2.4" dependenciesMeta: "@rspack/binding-darwin-arm64": optional: true @@ -4282,13 +4282,13 @@ __metadata: optional: true "@rspack/binding-win32-x64-msvc": optional: true - checksum: 10/0f52ea4f2d1b41f3332918dedb61fab55e4459dea90964f29199dc075c399ff2785aa625f0dbfd8efdc2e99c3ab4d8d76d16a50a271cc5d497330e49de47d11e + checksum: 10/203907aaf7e4be345fc29597e49e4579e0b06fddbb58aae0987d9d6a8e93f0f98e0fa20e0e923d6d763914ad482e8b8336fbfd9929ec24ef8789c9a12984f468 languageName: node linkType: hard -"@rspack/cli@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/cli@npm:1.2.3" +"@rspack/cli@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/cli@npm:1.2.4" dependencies: "@discoveryjs/json-ext": "npm:^0.5.7" "@rspack/dev-server": "npm:1.0.10" @@ -4297,7 +4297,7 @@ __metadata: interpret: "npm:^3.1.1" rechoir: "npm:^0.8.0" webpack-bundle-analyzer: "npm:4.6.1" - yargs: "npm:17.6.2" + yargs: "npm:17.7.2" peerDependencies: "@rspack/core": ^1.0.0-alpha || ^1.x "@rspack/tracing": ^1.x @@ -4306,16 +4306,16 @@ __metadata: optional: true bin: rspack: bin/rspack.js - checksum: 10/12de55160d62e4e7d74c428a8b8028f0fd22d314e0cf2e2f1494f2446221dc3ae00192f515cb6ac8025daf3dae9e0ed9d38272561706f712f8d9214003782cf0 + checksum: 10/a4ef1a54ba8cfc40b3737bfd0d57b4d82ab5211575d11281a47d9bd490de601ff098ee451a142d2aad1e47c6baeac73e3de89f39ef9827a370f5e28c76d2c801 languageName: node linkType: hard -"@rspack/core@npm:1.2.3": - version: 1.2.3 - resolution: "@rspack/core@npm:1.2.3" +"@rspack/core@npm:1.2.4": + version: 1.2.4 + resolution: "@rspack/core@npm:1.2.4" dependencies: "@module-federation/runtime-tools": "npm:0.8.4" - "@rspack/binding": "npm:1.2.3" + "@rspack/binding": "npm:1.2.4" "@rspack/lite-tapable": "npm:1.0.1" caniuse-lite: "npm:^1.0.30001616" peerDependencies: @@ -4326,7 +4326,7 @@ __metadata: optional: true "@swc/helpers": optional: true - checksum: 10/29ba8019a78a353f0fd416135c38db25b2b7911c2caeb20a76dbf28493353254b56394cd152ca9aca193ace8b7d1d431b2056969323d1cee18fd6b7539d98fe0 + checksum: 10/dd662bde28b6166cad2f393f1ce5505c809799057c76b53095b354bddc6a520d3c723565193e428e852e6f5b170b1a9f53c38edeb80027daddd5a677314a8a07 languageName: node linkType: hard @@ -9433,8 +9433,8 @@ __metadata: "@polymer/polymer": "npm:3.5.2" "@replit/codemirror-indentation-markers": "npm:6.5.3" "@rsdoctor/rspack-plugin": "npm:0.4.13" - "@rspack/cli": "npm:1.2.3" - "@rspack/core": "npm:1.2.3" + "@rspack/cli": "npm:1.2.4" + "@rspack/core": "npm:1.2.4" "@thomasloven/round-slider": "npm:0.6.0" "@types/babel__plugin-transform-runtime": "npm:7.9.5" "@types/chromecast-caf-receiver": "npm:6.0.21" @@ -16340,9 +16340,9 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.6.2": - version: 17.6.2 - resolution: "yargs@npm:17.6.2" +"yargs@npm:17.7.2, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: cliui: "npm:^8.0.1" escalade: "npm:^3.1.1" @@ -16351,7 +16351,7 @@ __metadata: string-width: "npm:^4.2.3" y18n: "npm:^5.0.5" yargs-parser: "npm:^21.1.1" - checksum: 10/77e4221b49867d50ce5ded87e91ff11f439b46aa4f01d2116f65402c3ac7dfba937d5bb29d50cecf4acda5aaf848d6ff4facd50b2428098c3990c46d58d5b539 + checksum: 10/abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 languageName: node linkType: hard @@ -16389,21 +16389,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10/abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From edd37565a6a17d164c08b421efff5b9503d13c0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:03:37 +0100 Subject: [PATCH 42/50] Update vitest monorepo to v3.0.6 (#24344) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 143 ++++++++++++++++++++++++--------------------------- 2 files changed, 69 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index 6e2aef5566..fb4b761a68 100644 --- a/package.json +++ b/package.json @@ -186,7 +186,7 @@ "@types/tar": "6.1.13", "@types/ua-parser-js": "0.7.39", "@types/webspeechapi": "0.0.29", - "@vitest/coverage-v8": "3.0.5", + "@vitest/coverage-v8": "3.0.6", "babel-loader": "9.2.1", "babel-plugin-template-html-minifier": "4.1.0", "browserslist-useragent-regexp": "4.1.3", @@ -227,7 +227,7 @@ "typescript": "5.7.3", "typescript-eslint": "8.24.1", "vite-tsconfig-paths": "5.1.4", - "vitest": "3.0.5", + "vitest": "3.0.6", "webpack-stats-plugin": "1.1.3", "webpackbar": "7.0.0", "workbox-build": "patch:workbox-build@npm%3A7.1.1#~/.yarn/patches/workbox-build-npm-7.1.1-a854f3faae.patch" diff --git a/yarn.lock b/yarn.lock index f49a3aa5c9..02c391d6a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5414,9 +5414,9 @@ __metadata: languageName: node linkType: hard -"@vitest/coverage-v8@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/coverage-v8@npm:3.0.5" +"@vitest/coverage-v8@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/coverage-v8@npm:3.0.6" dependencies: "@ampproject/remapping": "npm:^2.3.0" "@bcoe/v8-coverage": "npm:^1.0.2" @@ -5431,32 +5431,32 @@ __metadata: test-exclude: "npm:^7.0.1" tinyrainbow: "npm:^2.0.0" peerDependencies: - "@vitest/browser": 3.0.5 - vitest: 3.0.5 + "@vitest/browser": 3.0.6 + vitest: 3.0.6 peerDependenciesMeta: "@vitest/browser": optional: true - checksum: 10/aa1aa681b4ee86d5ecf53390c56e24e7b61ea7cb47a178630c224de4bdd7eaf8a30b184299741b6e358d214670759905e2f90fb08d0745abdc3974992dfa137f + checksum: 10/ed5c852e0d6e9e632f298b879bd2e69e89f2afd8b9c12cf5436a65a0e61da82f69096beacb8298238b6efe935783b08672ee7e2dd5e9a6f6a40094340d5df1b9 languageName: node linkType: hard -"@vitest/expect@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/expect@npm:3.0.5" +"@vitest/expect@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/expect@npm:3.0.6" dependencies: - "@vitest/spy": "npm:3.0.5" - "@vitest/utils": "npm:3.0.5" - chai: "npm:^5.1.2" + "@vitest/spy": "npm:3.0.6" + "@vitest/utils": "npm:3.0.6" + chai: "npm:^5.2.0" tinyrainbow: "npm:^2.0.0" - checksum: 10/e9dfaed51e3a2952306fa621b4fe6c4323b367c8b731fc57d661d971628df89d1bfa163be79e4de3004d6e2e32c99b496efb8d065db6cf41d6be01dc2b833f8d + checksum: 10/f14b44d2e152bda5133c971d0b8132b46ac134aca2ef1816bfb4d34eec396c031803504371365d74023906a7b350296489ad252671760e1276625a52ae185c13 languageName: node linkType: hard -"@vitest/mocker@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/mocker@npm:3.0.5" +"@vitest/mocker@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/mocker@npm:3.0.6" dependencies: - "@vitest/spy": "npm:3.0.5" + "@vitest/spy": "npm:3.0.6" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.17" peerDependencies: @@ -5467,20 +5467,11 @@ __metadata: optional: true vite: optional: true - checksum: 10/84f3f8bbefdde91467d4bb6e5ea62227fdd86dce5567d0a2a04329033e1ed6cffe140d5b1cd58d323792d4116ba67562539d22c80910d60310eede940c94eb8b + checksum: 10/c7d0c626075dd3cf39aa403304bf67d2720fd1064b61fa79b3b7da6bb91266fcd0a07ed335b9251dd6e3a8c63d82d5139f2f629febe98cb59d24675f44b7fd5d languageName: node linkType: hard -"@vitest/pretty-format@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/pretty-format@npm:3.0.5" - dependencies: - tinyrainbow: "npm:^2.0.0" - checksum: 10/1ffbee16e9aa2cd7862bc6b83c30b7b53031d29ddae0302d09e6b1f6bfa0e4338e5c74a2dfaeed1bab317aff300c4fd309004dbaa69baf9ebe71f6806b132e96 - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:^3.0.5": +"@vitest/pretty-format@npm:3.0.6, @vitest/pretty-format@npm:^3.0.6": version: 3.0.6 resolution: "@vitest/pretty-format@npm:3.0.6" dependencies: @@ -5489,44 +5480,44 @@ __metadata: languageName: node linkType: hard -"@vitest/runner@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/runner@npm:3.0.5" +"@vitest/runner@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/runner@npm:3.0.6" dependencies: - "@vitest/utils": "npm:3.0.5" - pathe: "npm:^2.0.2" - checksum: 10/7aedf5d445aec3da83790cc94e135f64a1c407e437276694ca5a0567db055f49481b2622ab24faabb4482a1829d18dbc5cae31738b5a015669651cda8e0e7238 + "@vitest/utils": "npm:3.0.6" + pathe: "npm:^2.0.3" + checksum: 10/7fa15d58b19bc407e8c2d8edf234e572b04ce37195bda740f49044ef36fdfe1bfeed71f9bdd61cabc1fdf87a280feb664475f4d96051240d5f861f9b1c5954bd languageName: node linkType: hard -"@vitest/snapshot@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/snapshot@npm:3.0.5" +"@vitest/snapshot@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/snapshot@npm:3.0.6" dependencies: - "@vitest/pretty-format": "npm:3.0.5" + "@vitest/pretty-format": "npm:3.0.6" magic-string: "npm:^0.30.17" - pathe: "npm:^2.0.2" - checksum: 10/3c6a3165556dc4a3fc50c9532dc047b5bf57df1bbad657ca7e34ca65e9aeb61740a0eaebe9eb6200a30d92f457a402ce3d22b21700a1763a5ec4bddf81733709 + pathe: "npm:^2.0.3" + checksum: 10/6ab4cef960b32baa05ae6eb7c67bb963272f6b19b7b1969f30930285397a54c3c67b37b5736c14a747123a5942fe9657382284a8b725f68f775077d155fabaaf languageName: node linkType: hard -"@vitest/spy@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/spy@npm:3.0.5" +"@vitest/spy@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/spy@npm:3.0.6" dependencies: tinyspy: "npm:^3.0.2" - checksum: 10/ed85319cd03f3f35121e84ce31721316daf94a7c01d493dff746ff5469d12e40b218cc728d57c5a71612c5a3882e8e66d9cefe82b82c2044d5f257954ec7e9d8 + checksum: 10/d30b7415c5aff38a0cc8cde6f73629e11e293fe68cf078083f513a22c71b73a668d634daf7717b75740d37afbdd73bb041fd3550cc8c7abe12f599bff029bb45 languageName: node linkType: hard -"@vitest/utils@npm:3.0.5": - version: 3.0.5 - resolution: "@vitest/utils@npm:3.0.5" +"@vitest/utils@npm:3.0.6": + version: 3.0.6 + resolution: "@vitest/utils@npm:3.0.6" dependencies: - "@vitest/pretty-format": "npm:3.0.5" - loupe: "npm:^3.1.2" + "@vitest/pretty-format": "npm:3.0.6" + loupe: "npm:^3.1.3" tinyrainbow: "npm:^2.0.0" - checksum: 10/4e85a7514592df63870eb4ec27c434034cc91c9e63c052bcb2304c4cc2f4fbb49350099280480313e93526247d020b42bea52436cf7f93fee0bd98cfac51a644 + checksum: 10/67f903ec931a1767fcd8421697fde6751cebbbc9491527c2f7df202366ee269856b2befa694f5f71f912af34b9df13a51783e502251f68142304140d68532562 languageName: node linkType: hard @@ -6527,7 +6518,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^5.1.2": +"chai@npm:^5.2.0": version: 5.2.0 resolution: "chai@npm:5.2.0" dependencies: @@ -9457,7 +9448,7 @@ __metadata: "@vaadin/combo-box": "npm:24.6.5" "@vaadin/vaadin-themable-mixin": "npm:24.6.5" "@vibrant/color": "npm:4.0.0" - "@vitest/coverage-v8": "npm:3.0.5" + "@vitest/coverage-v8": "npm:3.0.6" "@vue/web-component-wrapper": "npm:1.3.0" "@webcomponents/scoped-custom-element-registry": "npm:0.0.9" "@webcomponents/webcomponentsjs": "npm:2.8.0" @@ -9546,7 +9537,7 @@ __metadata: vis-data: "npm:7.1.9" vis-network: "npm:9.1.9" vite-tsconfig-paths: "npm:5.1.4" - vitest: "npm:3.0.5" + vitest: "npm:3.0.6" vue: "npm:2.7.16" vue2-daterange-picker: "npm:0.6.8" webpack-stats-plugin: "npm:1.1.3" @@ -11112,7 +11103,7 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0, loupe@npm:^3.1.2": +"loupe@npm:^3.1.0, loupe@npm:^3.1.3": version: 3.1.3 resolution: "loupe@npm:3.1.3" checksum: 10/9e98c34daf0eba48ccc603595e51f2ae002110982d84879cf78c51de2c632f0c571dfe82ce4210af60c32203d06b443465c269bda925076fe6d9b612cc65c321 @@ -12336,7 +12327,7 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^2.0.2": +"pathe@npm:^2.0.3": version: 2.0.3 resolution: "pathe@npm:2.0.3" checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d @@ -15228,18 +15219,18 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:3.0.5": - version: 3.0.5 - resolution: "vite-node@npm:3.0.5" +"vite-node@npm:3.0.6": + version: 3.0.6 + resolution: "vite-node@npm:3.0.6" dependencies: cac: "npm:^6.7.14" debug: "npm:^4.4.0" es-module-lexer: "npm:^1.6.0" - pathe: "npm:^2.0.2" + pathe: "npm:^2.0.3" vite: "npm:^5.0.0 || ^6.0.0" bin: vite-node: vite-node.mjs - checksum: 10/804d3a4a794f9fa7d5c7b433e96b0813eee39b8c0d4da5c8fe28c9a2aa226702ec711e272a66a5208944f26a35e46d931fc09b1404b04db1cf607f58af1baf6b + checksum: 10/77fad00a16ec032fa1146c5c685f73a29dc5f544a5bf35ee46fef963c7e065230983a1b5b49a110ca138b0a28c40ec710f8cb2854b6e608caad780215838473d languageName: node linkType: hard @@ -15311,36 +15302,36 @@ __metadata: languageName: node linkType: hard -"vitest@npm:3.0.5": - version: 3.0.5 - resolution: "vitest@npm:3.0.5" +"vitest@npm:3.0.6": + version: 3.0.6 + resolution: "vitest@npm:3.0.6" dependencies: - "@vitest/expect": "npm:3.0.5" - "@vitest/mocker": "npm:3.0.5" - "@vitest/pretty-format": "npm:^3.0.5" - "@vitest/runner": "npm:3.0.5" - "@vitest/snapshot": "npm:3.0.5" - "@vitest/spy": "npm:3.0.5" - "@vitest/utils": "npm:3.0.5" - chai: "npm:^5.1.2" + "@vitest/expect": "npm:3.0.6" + "@vitest/mocker": "npm:3.0.6" + "@vitest/pretty-format": "npm:^3.0.6" + "@vitest/runner": "npm:3.0.6" + "@vitest/snapshot": "npm:3.0.6" + "@vitest/spy": "npm:3.0.6" + "@vitest/utils": "npm:3.0.6" + chai: "npm:^5.2.0" debug: "npm:^4.4.0" expect-type: "npm:^1.1.0" magic-string: "npm:^0.30.17" - pathe: "npm:^2.0.2" + pathe: "npm:^2.0.3" std-env: "npm:^3.8.0" tinybench: "npm:^2.9.0" tinyexec: "npm:^0.3.2" tinypool: "npm:^1.0.2" tinyrainbow: "npm:^2.0.0" vite: "npm:^5.0.0 || ^6.0.0" - vite-node: "npm:3.0.5" + vite-node: "npm:3.0.6" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/debug": ^4.1.12 "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 3.0.5 - "@vitest/ui": 3.0.5 + "@vitest/browser": 3.0.6 + "@vitest/ui": 3.0.6 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -15360,7 +15351,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/63bf6474d314e0694489d23236a6aebd4f2173b40e47f861824668fe4b3dde5b6b95d30134acc7b1a0694c0b82b4996deb7ebc7c0ae62cb58823ff51cdcadbe1 + checksum: 10/12d7d6e31d5ec3b9242cb478e5b799a1a4e52fd3c951bb98c3c99091d6d76c7aee63b80c6523704afa70bcb660e586fd8f342c933d1c19fa30aee6cc8ac76ae0 languageName: node linkType: hard From 5eec8149884835b5859222d61d5c3de9fdbf6190 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Sat, 22 Feb 2025 01:43:18 -0500 Subject: [PATCH 43/50] Hide hardware integrations from the "add integration" dialog (#24345) --- src/panels/config/integrations/dialog-add-integration.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/panels/config/integrations/dialog-add-integration.ts b/src/panels/config/integrations/dialog-add-integration.ts index 17c6b0d715..1ace965ebf 100644 --- a/src/panels/config/integrations/dialog-add-integration.ts +++ b/src/panels/config/integrations/dialog-add-integration.ts @@ -185,6 +185,14 @@ class AddIntegrationDialog extends LitElement { const yamlIntegrations: IntegrationListItem[] = []; Object.entries(i).forEach(([domain, integration]) => { + if ( + "integration_type" in integration && + integration.integration_type === "hardware" + ) { + // Ignore hardware integrations, they cannot be added via UI + return; + } + if ( "integration_type" in integration && (integration.config_flow || From 3857c7321a1172d46b452ee90d111631605846ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 07:08:27 +0100 Subject: [PATCH 44/50] Update dependency eslint-plugin-wc to v2.2.1 (#24362) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index fb4b761a68..c4d2a39554 100644 --- a/package.json +++ b/package.json @@ -199,7 +199,7 @@ "eslint-plugin-lit": "1.15.0", "eslint-plugin-lit-a11y": "4.1.4", "eslint-plugin-unused-imports": "4.1.4", - "eslint-plugin-wc": "2.2.0", + "eslint-plugin-wc": "2.2.1", "fancy-log": "2.0.0", "fs-extra": "11.3.0", "glob": "11.0.1", diff --git a/yarn.lock b/yarn.lock index 02c391d6a1..2bcf11a782 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8089,15 +8089,15 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-wc@npm:2.2.0": - version: 2.2.0 - resolution: "eslint-plugin-wc@npm:2.2.0" +"eslint-plugin-wc@npm:2.2.1": + version: 2.2.1 + resolution: "eslint-plugin-wc@npm:2.2.1" dependencies: is-valid-element-name: "npm:^1.0.0" js-levenshtein-esm: "npm:^1.2.0" peerDependencies: eslint: ">=8.40.0" - checksum: 10/12ffc021f0e5a42d97b782e92f249fad923d7c1af4c2603384482c8371e72bbd6084891b14928cae71084e0a8cef9ad914acf746aad9cdaca6cd6212e499513d + checksum: 10/7861074dbf057be818dddfeaa3442e538696bdaeb3971038c9216337be071a67f775400d394d06b1166180b77171756c6037f92eb4d6ea5ae749f128f8d9654d languageName: node linkType: hard @@ -9477,7 +9477,7 @@ __metadata: eslint-plugin-lit: "npm:1.15.0" eslint-plugin-lit-a11y: "npm:4.1.4" eslint-plugin-unused-imports: "npm:4.1.4" - eslint-plugin-wc: "npm:2.2.0" + eslint-plugin-wc: "npm:2.2.1" fancy-log: "npm:2.0.0" fs-extra: "npm:11.3.0" fuse.js: "npm:7.1.0" From acf42d76379ee2ee162c61df9f080d397dac380e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:56:48 +0200 Subject: [PATCH 45/50] Update dependency globals to v16 (#24359) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c4d2a39554..d353fe22f3 100644 --- a/package.json +++ b/package.json @@ -241,7 +241,7 @@ "clean-css": "5.3.3", "@lit/reactive-element": "1.6.3", "@fullcalendar/daygrid": "6.1.15", - "globals": "15.15.0", + "globals": "16.0.0", "tslib": "2.8.1" }, "packageManager": "yarn@4.6.0" diff --git a/yarn.lock b/yarn.lock index 2bcf11a782..4b5bd200d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9076,10 +9076,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:15.15.0": - version: 15.15.0 - resolution: "globals@npm:15.15.0" - checksum: 10/7f561c87b2fd381b27fc2db7df8a4ea7a9bb378667b8a7193e61fd2ca3a876479174e2a303a74345fbea6e1242e16db48915c1fd3bf35adcf4060a795b425e18 +"globals@npm:16.0.0": + version: 16.0.0 + resolution: "globals@npm:16.0.0" + checksum: 10/aa05d569af9c763d9982e6885f3ac6d21c84cd54c9a12eeace55b3334d0631128f189902d34ae2a924694311f92d700dbd3e8e62e8a9e1094a882f9f8897149a languageName: node linkType: hard From 455a6761cd28c5ad50a0651d164d506680643dcf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:58:42 +0200 Subject: [PATCH 46/50] Bump actions/upload-artifact from 4.6.0 to 4.6.1 (#24365) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.0 to 4.6.1. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4.6.0...v4.6.1) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 4 ++-- .github/workflows/nightly.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4753c58f2a..9289f07191 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -89,7 +89,7 @@ jobs: env: IS_TEST: "true" - name: Upload bundle stats - uses: actions/upload-artifact@v4.6.0 + uses: actions/upload-artifact@v4.6.1 with: name: frontend-bundle-stats path: build/stats/*.json @@ -113,7 +113,7 @@ jobs: env: IS_TEST: "true" - name: Upload bundle stats - uses: actions/upload-artifact@v4.6.0 + uses: actions/upload-artifact@v4.6.1 with: name: supervisor-bundle-stats path: build/stats/*.json diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index 231bcfd15e..2c927c6736 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -57,14 +57,14 @@ jobs: run: tar -czvf translations.tar.gz translations - name: Upload build artifacts - uses: actions/upload-artifact@v4.6.0 + uses: actions/upload-artifact@v4.6.1 with: name: wheels path: dist/home_assistant_frontend*.whl if-no-files-found: error - name: Upload translations - uses: actions/upload-artifact@v4.6.0 + uses: actions/upload-artifact@v4.6.1 with: name: translations path: translations.tar.gz From a917383d7a0139d5629568ea86c49346f0f14288 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:59:27 +0200 Subject: [PATCH 47/50] Bump actions/cache from 4.2.0 to 4.2.1 (#24366) Bumps [actions/cache](https://github.com/actions/cache) from 4.2.0 to 4.2.1. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4.2.0...v4.2.1) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9289f07191..cfa1b10126 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -37,7 +37,7 @@ jobs: - name: Build resources run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages - name: Setup lint cache - uses: actions/cache@v4.2.0 + uses: actions/cache@v4.2.1 with: path: | node_modules/.cache/prettier From 680d81001c47743f36d68eb0af56289cf04b6306 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:00:19 +0200 Subject: [PATCH 48/50] Update rspack monorepo to v1.2.5 (#24353) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 102 +++++++++++++++++++++++++-------------------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index d353fe22f3..aa7cc9995a 100644 --- a/package.json +++ b/package.json @@ -166,8 +166,8 @@ "@octokit/plugin-retry": "7.1.4", "@octokit/rest": "21.1.1", "@rsdoctor/rspack-plugin": "0.4.13", - "@rspack/cli": "1.2.4", - "@rspack/core": "1.2.4", + "@rspack/cli": "1.2.5", + "@rspack/core": "1.2.5", "@types/babel__plugin-transform-runtime": "7.9.5", "@types/chromecast-caf-receiver": "6.0.21", "@types/chromecast-caf-sender": "1.0.11", diff --git a/yarn.lock b/yarn.lock index 4b5bd200d0..f1145bde9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4187,82 +4187,82 @@ __metadata: languageName: node linkType: hard -"@rspack/binding-darwin-arm64@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-darwin-arm64@npm:1.2.4" +"@rspack/binding-darwin-arm64@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-darwin-arm64@npm:1.2.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-darwin-x64@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-darwin-x64@npm:1.2.4" +"@rspack/binding-darwin-x64@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-darwin-x64@npm:1.2.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rspack/binding-linux-arm64-gnu@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-linux-arm64-gnu@npm:1.2.4" +"@rspack/binding-linux-arm64-gnu@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.2.5" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-arm64-musl@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-linux-arm64-musl@npm:1.2.4" +"@rspack/binding-linux-arm64-musl@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.2.5" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rspack/binding-linux-x64-gnu@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-linux-x64-gnu@npm:1.2.4" +"@rspack/binding-linux-x64-gnu@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.2.5" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-x64-musl@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-linux-x64-musl@npm:1.2.4" +"@rspack/binding-linux-x64-musl@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-linux-x64-musl@npm:1.2.5" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rspack/binding-win32-arm64-msvc@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-win32-arm64-msvc@npm:1.2.4" +"@rspack/binding-win32-arm64-msvc@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.2.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-win32-ia32-msvc@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-win32-ia32-msvc@npm:1.2.4" +"@rspack/binding-win32-ia32-msvc@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.2.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rspack/binding-win32-x64-msvc@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding-win32-x64-msvc@npm:1.2.4" +"@rspack/binding-win32-x64-msvc@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.2.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rspack/binding@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/binding@npm:1.2.4" +"@rspack/binding@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/binding@npm:1.2.5" dependencies: - "@rspack/binding-darwin-arm64": "npm:1.2.4" - "@rspack/binding-darwin-x64": "npm:1.2.4" - "@rspack/binding-linux-arm64-gnu": "npm:1.2.4" - "@rspack/binding-linux-arm64-musl": "npm:1.2.4" - "@rspack/binding-linux-x64-gnu": "npm:1.2.4" - "@rspack/binding-linux-x64-musl": "npm:1.2.4" - "@rspack/binding-win32-arm64-msvc": "npm:1.2.4" - "@rspack/binding-win32-ia32-msvc": "npm:1.2.4" - "@rspack/binding-win32-x64-msvc": "npm:1.2.4" + "@rspack/binding-darwin-arm64": "npm:1.2.5" + "@rspack/binding-darwin-x64": "npm:1.2.5" + "@rspack/binding-linux-arm64-gnu": "npm:1.2.5" + "@rspack/binding-linux-arm64-musl": "npm:1.2.5" + "@rspack/binding-linux-x64-gnu": "npm:1.2.5" + "@rspack/binding-linux-x64-musl": "npm:1.2.5" + "@rspack/binding-win32-arm64-msvc": "npm:1.2.5" + "@rspack/binding-win32-ia32-msvc": "npm:1.2.5" + "@rspack/binding-win32-x64-msvc": "npm:1.2.5" dependenciesMeta: "@rspack/binding-darwin-arm64": optional: true @@ -4282,13 +4282,13 @@ __metadata: optional: true "@rspack/binding-win32-x64-msvc": optional: true - checksum: 10/203907aaf7e4be345fc29597e49e4579e0b06fddbb58aae0987d9d6a8e93f0f98e0fa20e0e923d6d763914ad482e8b8336fbfd9929ec24ef8789c9a12984f468 + checksum: 10/f5d482f80e2ecd5a35656a41079021bab8b75e57c8bd048973515a51aefa763ada6b76b467bfbafc30cf10ee98c9a553217184df811c3a652ec2f0bb5cd32785 languageName: node linkType: hard -"@rspack/cli@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/cli@npm:1.2.4" +"@rspack/cli@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/cli@npm:1.2.5" dependencies: "@discoveryjs/json-ext": "npm:^0.5.7" "@rspack/dev-server": "npm:1.0.10" @@ -4306,16 +4306,16 @@ __metadata: optional: true bin: rspack: bin/rspack.js - checksum: 10/a4ef1a54ba8cfc40b3737bfd0d57b4d82ab5211575d11281a47d9bd490de601ff098ee451a142d2aad1e47c6baeac73e3de89f39ef9827a370f5e28c76d2c801 + checksum: 10/7f00742b79985bd344bb78bab66192f9c8fae28d5cf7e2c73cc87a213ab1c816b48a4123c59ada252aa6ea58a156ef91c5347b25927bd45e4fd9a843bc0ef041 languageName: node linkType: hard -"@rspack/core@npm:1.2.4": - version: 1.2.4 - resolution: "@rspack/core@npm:1.2.4" +"@rspack/core@npm:1.2.5": + version: 1.2.5 + resolution: "@rspack/core@npm:1.2.5" dependencies: "@module-federation/runtime-tools": "npm:0.8.4" - "@rspack/binding": "npm:1.2.4" + "@rspack/binding": "npm:1.2.5" "@rspack/lite-tapable": "npm:1.0.1" caniuse-lite: "npm:^1.0.30001616" peerDependencies: @@ -4326,7 +4326,7 @@ __metadata: optional: true "@swc/helpers": optional: true - checksum: 10/dd662bde28b6166cad2f393f1ce5505c809799057c76b53095b354bddc6a520d3c723565193e428e852e6f5b170b1a9f53c38edeb80027daddd5a677314a8a07 + checksum: 10/9d4bade382e26d0faf11a4967c165fbc25ee861f1e2b35f01307806360ecb4f2b4d69aba66e86b063d5d7cdb181799b1e0a47ea9561efe7d6d2833c7fbffd1a1 languageName: node linkType: hard @@ -9424,8 +9424,8 @@ __metadata: "@polymer/polymer": "npm:3.5.2" "@replit/codemirror-indentation-markers": "npm:6.5.3" "@rsdoctor/rspack-plugin": "npm:0.4.13" - "@rspack/cli": "npm:1.2.4" - "@rspack/core": "npm:1.2.4" + "@rspack/cli": "npm:1.2.5" + "@rspack/core": "npm:1.2.5" "@thomasloven/round-slider": "npm:0.6.0" "@types/babel__plugin-transform-runtime": "npm:7.9.5" "@types/chromecast-caf-receiver": "npm:6.0.21" From 783132ae4655bfb102dac15db9ef69f3b0c4f717 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:08:55 -0800 Subject: [PATCH 49/50] Fix solar order in compare stack for usage graph (#24360) * Fix solar order in compare stack for usage graph * remove accidental commit --- .../energy/hui-energy-usage-graph-card.ts | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts index 18e737696f..cda61fecbf 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts @@ -291,20 +291,19 @@ export class HuiEnergyUsageGraphCard true ) ); - } else { - // add empty dataset so compare bars are first - // `stack: usage` so it doesn't take up space yet - const firstId = statIds.from_grid?.[0] ?? "placeholder"; - datasets.push({ - id: "compare-" + firstId, - type: "bar", - stack: "usage", - data: [], - // @ts-expect-error - order: 0, - }); } + // add empty dataset so compare bars are first + // `stack: usage` so it doesn't take up space yet + datasets.push({ + id: "compare-placeholder", + type: "bar", + stack: energyData.statsCompare ? "compare" : "usage", + data: [], + // @ts-expect-error + order: 0, + }); + datasets.push( ...this._processDataSet( energyData.stats, From a438fc5e41de7c904b357d801fe0bff986b6daed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 24 Feb 2025 09:37:17 +0100 Subject: [PATCH 50/50] Add connection check and dialog with results for cloud login (#24301) --- src/data/cloud.ts | 1 + .../cloud/cloud-step-signin.ts | 18 ++ .../dialog-cloud-already-connected.ts | 171 ++++++++++++++++++ .../show-dialog-cloud-already-connected.ts | 21 +++ src/panels/config/cloud/login/cloud-login.ts | 19 ++ src/translations/en.json | 17 ++ 6 files changed, 247 insertions(+) create mode 100644 src/panels/config/cloud/dialog-cloud-already-connected/dialog-cloud-already-connected.ts create mode 100644 src/panels/config/cloud/dialog-cloud-already-connected/show-dialog-cloud-already-connected.ts diff --git a/src/data/cloud.ts b/src/data/cloud.ts index b7fea8fae2..59882cae75 100644 --- a/src/data/cloud.ts +++ b/src/data/cloud.ts @@ -73,6 +73,7 @@ export interface CloudWebhook { interface CloudLoginBase { hass: HomeAssistant; email: string; + check_connection?: boolean; } export interface CloudLoginPassword extends CloudLoginBase { diff --git a/src/dialogs/voice-assistant-setup/cloud/cloud-step-signin.ts b/src/dialogs/voice-assistant-setup/cloud/cloud-step-signin.ts index 2de5a88bb5..fe7adc84a0 100644 --- a/src/dialogs/voice-assistant-setup/cloud/cloud-step-signin.ts +++ b/src/dialogs/voice-assistant-setup/cloud/cloud-step-signin.ts @@ -10,6 +10,7 @@ import "../../../components/ha-svg-icon"; import "../../../components/ha-textfield"; import type { HaTextField } from "../../../components/ha-textfield"; import { cloudLogin } from "../../../data/cloud"; +import { showCloudAlreadyConnectedDialog } from "../../../panels/config/cloud/dialog-cloud-already-connected/show-dialog-cloud-already-connected"; import type { HomeAssistant } from "../../../types"; import { showAlertDialog, @@ -25,6 +26,8 @@ export class CloudStepSignin extends LitElement { @state() private _error?: string; + @state() private _checkConnection = true; + @query("#email", true) private _emailField!: HaTextField; @query("#password", true) private _passwordField!: HaPasswordField; @@ -115,6 +118,7 @@ export class CloudStepSignin extends LitElement { hass: this.hass, email: username, ...(code ? { code } : { password }), + check_connection: this._checkConnection, }); } catch (err: any) { const errCode = err && err.body && err.body.code; @@ -139,6 +143,20 @@ export class CloudStepSignin extends LitElement { } } + if (errCode === "alreadyconnectederror") { + showCloudAlreadyConnectedDialog(this, { + details: JSON.parse(err.body.message), + logInHereAction: () => { + this._checkConnection = false; + doLogin(username); + }, + closeDialog: () => { + this._requestInProgress = false; + }, + }); + return; + } + if (errCode === "usernotfound" && username !== username.toLowerCase()) { await doLogin(username.toLowerCase()); return; diff --git a/src/panels/config/cloud/dialog-cloud-already-connected/dialog-cloud-already-connected.ts b/src/panels/config/cloud/dialog-cloud-already-connected/dialog-cloud-already-connected.ts new file mode 100644 index 0000000000..8daccffeea --- /dev/null +++ b/src/panels/config/cloud/dialog-cloud-already-connected/dialog-cloud-already-connected.ts @@ -0,0 +1,171 @@ +import type { CSSResultGroup } from "lit"; +import { css, html, LitElement, nothing } from "lit"; +import { customElement, state } from "lit/decorators"; +import { mdiEye, mdiEyeOff } from "@mdi/js"; +import { formatDateTime } from "../../../../common/datetime/format_date_time"; +import { fireEvent } from "../../../../common/dom/fire_event"; +import "../../../../components/ha-alert"; +import "../../../../components/ha-button"; +import "../../../../components/ha-icon-button"; +import { createCloseHeading } from "../../../../components/ha-dialog"; +import { haStyleDialog } from "../../../../resources/styles"; +import type { HomeAssistant } from "../../../../types"; +import type { CloudAlreadyConnectedParams as CloudAlreadyConnectedDialogParams } from "./show-dialog-cloud-already-connected"; +import { obfuscateUrl } from "../../../../util/url"; + +@customElement("dialog-cloud-already-connected") +class DialogCloudAlreadyConnected extends LitElement { + public hass!: HomeAssistant; + + @state() private _params?: CloudAlreadyConnectedDialogParams; + + @state() private _obfuscateIp = true; + + public showDialog(params: CloudAlreadyConnectedDialogParams) { + this._params = params; + } + + public closeDialog() { + this._params?.closeDialog(); + this._params = undefined; + this._obfuscateIp = true; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render() { + if (!this._params) { + return nothing; + } + const { details } = this._params; + + return html` + +
+ + ${this.hass.localize( + "ui.panel.config.cloud.dialog_already_connected.description" + )} + + + ${this.hass.localize( + "ui.panel.config.cloud.dialog_already_connected.other_home_assistant" + )} + +
+
+
+ + ${this.hass.localize( + "ui.panel.config.cloud.dialog_already_connected.ip_address" + )}: + +
+ + ${this._obfuscateIp + ? obfuscateUrl(details.remote_ip_address) + : details.remote_ip_address} + + + +
+
+
+ + ${this.hass.localize( + "ui.panel.config.cloud.dialog_already_connected.connected_at" + )}: + + + ${formatDateTime( + new Date(details.connected_at), + this.hass.locale, + this.hass.config + )} + +
+
+ + ${this.hass.localize( + "ui.panel.config.cloud.dialog_already_connected.info_backups.description" + )} + + + + ${this.hass!.localize("ui.common.cancel")} + + + ${this.hass!.localize( + "ui.panel.config.cloud.dialog_already_connected.login_here" + )} + +
+ `; + } + + private _toggleObfuscateIp() { + this._obfuscateIp = !this._obfuscateIp; + } + + private _logInHere() { + this._params?.logInHereAction(); + this.closeDialog(); + } + + static get styles(): CSSResultGroup { + return [ + haStyleDialog, + css` + ha-dialog { + --mdc-dialog-max-width: 535px; + } + .intro b { + display: block; + margin-top: 16px; + } + .instance-details { + display: flex; + flex-direction: column; + margin-bottom: 16px; + } + .instance-detail { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + } + .obfuscated { + align-items: center; + display: flex; + flex-direction: row; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-cloud-already-connected": DialogCloudAlreadyConnected; + } +} diff --git a/src/panels/config/cloud/dialog-cloud-already-connected/show-dialog-cloud-already-connected.ts b/src/panels/config/cloud/dialog-cloud-already-connected/show-dialog-cloud-already-connected.ts new file mode 100644 index 0000000000..7c95db2247 --- /dev/null +++ b/src/panels/config/cloud/dialog-cloud-already-connected/show-dialog-cloud-already-connected.ts @@ -0,0 +1,21 @@ +import { fireEvent } from "../../../../common/dom/fire_event"; + +export interface CloudAlreadyConnectedParams { + details: { + remote_ip_address: string; + connected_at: string; + }; + logInHereAction: () => void; + closeDialog: () => void; +} + +export const showCloudAlreadyConnectedDialog = ( + element: HTMLElement, + webhookDialogParams: CloudAlreadyConnectedParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-cloud-already-connected", + dialogImport: () => import("./dialog-cloud-already-connected"), + dialogParams: webhookDialogParams, + }); +}; diff --git a/src/panels/config/cloud/login/cloud-login.ts b/src/panels/config/cloud/login/cloud-login.ts index 5fe14e24ba..bc03fe8cb8 100644 --- a/src/panels/config/cloud/login/cloud-login.ts +++ b/src/panels/config/cloud/login/cloud-login.ts @@ -28,6 +28,7 @@ import { haStyle } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; import "../../ha-config-section"; import { showSupportPackageDialog } from "../account/show-dialog-cloud-support-package"; +import { showCloudAlreadyConnectedDialog } from "../dialog-cloud-already-connected/show-dialog-cloud-already-connected"; @customElement("cloud-login") export class CloudLogin extends LitElement { @@ -47,6 +48,8 @@ export class CloudLogin extends LitElement { @state() private _error?: string; + @state() private _checkConnection = true; + @query("#email", true) private _emailField!: HaTextField; @query("#password", true) private _passwordField!: HaPasswordField; @@ -244,6 +247,7 @@ export class CloudLogin extends LitElement { hass: this.hass, email: username, ...(code ? { code } : { password }), + check_connection: this._checkConnection, }); this.email = ""; this._password = ""; @@ -283,6 +287,21 @@ export class CloudLogin extends LitElement { return; } } + if (errCode === "alreadyconnectederror") { + showCloudAlreadyConnectedDialog(this, { + details: JSON.parse(err.body.message), + logInHereAction: () => { + this._checkConnection = false; + doLogin(username); + }, + closeDialog: () => { + this._requestInProgress = false; + this.email = ""; + this._password = ""; + }, + }); + return; + } if (errCode === "PasswordChangeRequired") { showAlertDialog(this, { title: this.hass.localize( diff --git a/src/translations/en.json b/src/translations/en.json index d039401df7..382aaf3193 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4730,6 +4730,23 @@ "fingerprint": "Certificate fingerprint:", "close": "Close" }, + "dialog_already_connected": { + "heading": "Account linked to other Home Assistant", + "description": "We noticed that another instance is currently connected to your Home Assistant Cloud account. Your Home Assistant Cloud account can only be signed into one Home Assistant instance at a time. If you log in here, the other instance will be disconnected along with its Cloud services.", + "other_home_assistant": "Other Home Assistant", + "ip_address": "IP Address", + "connected_at": "Connected at", + "obfuscated_ip": { + "show": "Show IP address", + "hide": "Hide IP address" + }, + "info_backups": { + "title": "Home Assistant Cloud backups", + "description": "Your Cloud backup may be overwritten if you proceed. We strongly recommend downloading your current backup from your Nabu Casa account page before continuing." + }, + "close": "Close", + "login_here": "Log in here" + }, "dialog_cloudhook": { "webhook_for": "Webhook for {name}", "managed_by_integration": "This webhook is managed by an integration and cannot be disabled.",