diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28c3318..1a10d4f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@
All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
+## [0.5.6] — 2025-06-24
+
+### Changed
+
+- Fixed white theme button disappearing issue
+
## [0.5.4] — 2025-06-12
### Changed
diff --git a/Makefile b/Makefile
index 5648165..0494de2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
IMAGE?=localstack/localstack-docker-desktop
-TAG?=0.5.4
+TAG?=0.5.6
BUILDER=buildx-multi-arch
diff --git a/ui/package-lock.json b/ui/package-lock.json
index 1466498..089bfad 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -5700,6 +5700,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -6948,6 +6960,19 @@
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -7086,11 +7111,52 @@
"resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-module-lexer": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-shim-unscopables": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -8617,6 +8683,21 @@
"node": ">=6"
}
},
+ "node_modules/form-data": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
+ "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -8682,9 +8763,12 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/function.prototype.name": {
"version": "1.1.5",
@@ -8728,13 +8812,23 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -8753,6 +8847,18 @@
"node": ">=8.0.0"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -8876,6 +8982,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -8949,9 +9066,9 @@
}
},
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"engines": {
"node": ">= 0.4"
},
@@ -8960,11 +9077,11 @@
}
},
"node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -8973,6 +9090,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -11784,19 +11912,6 @@
}
}
},
- "node_modules/jsdom/node_modules/form-data": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
- "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -12152,6 +12267,14 @@
"tmpl": "1.0.5"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -21292,6 +21415,15 @@
"get-intrinsic": "^1.0.2"
}
},
+ "call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -22197,6 +22329,16 @@
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
"duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -22305,11 +22447,40 @@
"resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
},
+ "es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
+ },
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+ },
"es-module-lexer": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
+ "es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "requires": {
+ "es-errors": "^1.3.0"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ }
+ },
"es-shim-unscopables": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -23378,6 +23549,18 @@
}
}
},
+ "form-data": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
+ "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.35"
+ }
+ },
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -23420,9 +23603,9 @@
"optional": true
},
"function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"function.prototype.name": {
"version": "1.1.5",
@@ -23451,13 +23634,20 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
"get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
}
},
"get-own-enumerable-property-symbols": {
@@ -23470,6 +23660,15 @@
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
},
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -23556,6 +23755,11 @@
"slash": "^3.0.0"
}
},
+ "gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
+ },
"graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -23611,16 +23815,24 @@
}
},
"has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
},
"has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"requires": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "requires": {
+ "function-bind": "^1.1.2"
}
},
"he": {
@@ -25654,18 +25866,6 @@
"whatwg-url": "^8.5.0",
"ws": "^7.4.6",
"xml-name-validator": "^3.0.0"
- },
- "dependencies": {
- "form-data": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
- "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- }
}
},
"jsesc": {
@@ -25959,6 +26159,11 @@
"tmpl": "1.0.5"
}
},
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
+ },
"mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
diff --git a/ui/src/components/Feedback/ConfirmableButton.tsx b/ui/src/components/Feedback/ConfirmableButton.tsx
index 1233fb4..890231c 100644
--- a/ui/src/components/Feedback/ConfirmableButton.tsx
+++ b/ui/src/components/Feedback/ConfirmableButton.tsx
@@ -79,7 +79,7 @@ export const ConfirmableButton = ({
- mountPoint.setMountPointData({ ...mountPoint, showForm: true })}>
+ mountPoint.setMountPointData({ ...mountPoint, showForm: true })}>
Change mount point
diff --git a/ui/src/components/Views/Configs/SettingsForm.tsx b/ui/src/components/Views/Configs/SettingsForm.tsx
index 47f756b..3833305 100644
--- a/ui/src/components/Views/Configs/SettingsForm.tsx
+++ b/ui/src/components/Views/Configs/SettingsForm.tsx
@@ -25,23 +25,38 @@ import {
} from '../../../services';
import { ConfirmableButton } from '../../Feedback';
-const ShrinkedCircularProgress = (): ReactElement => ;
+const ShrinkedCircularProgress = (): ReactElement => (
+
+);
interface MountPointFormProps {
initialState: number;
}
-export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElement => {
-
- const [userState, setUserState] = useState({ loading: false, selectedUser: '', users: [] });
- const [osState, setOsState] = useState({ loading: false, selectedOS: '', OSs: [] });
+export const SettingsForm = ({
+ initialState,
+}: MountPointFormProps): ReactElement => {
+ const [userState, setUserState] = useState({
+ loading: false,
+ selectedUser: '',
+ users: [],
+ });
+ const [osState, setOsState] = useState({
+ loading: false,
+ selectedOS: '',
+ OSs: [],
+ });
const [triggerUserCheck, setTriggerUserCheck] = useState(false);
const [activeStep, setActiveStep] = useState(initialState);
const { setMountPointData, user, os } = useMountPoint();
const { client: ddClient } = useDDClient();
- const steps = ['Enable Docker Desktop option', 'Launching pro container', 'Set mount point'];
+ const steps = [
+ 'Enable Docker Desktop option',
+ 'Launching pro container',
+ 'Set mount point',
+ ];
const handleNext = () => {
if (activeStep !== steps.length - 1) {
@@ -55,9 +70,13 @@ export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElemen
const getMountPointPath = (): string => {
if (ddClient.host.platform === 'darwin') {
- return `/Users/${userState.selectedUser || 'loading...'}/Library/Caches/localstack/volume`;
+ return `/Users/${
+ userState.selectedUser || 'loading...'
+ }/Library/Caches/localstack/volume`;
}
- return `/home/${userState.selectedUser || 'loading...'}/.cache/localstack/volume`;
+ return `/home/${
+ userState.selectedUser || 'loading...'
+ }/.cache/localstack/volume`;
};
const checkWindowsDistro = async () => {
@@ -67,7 +86,11 @@ export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElemen
const foundOSs = getOSsFromBinary(res.stdout);
- setOsState({ loading: false, selectedOS: os || foundOSs[0], OSs: foundOSs });
+ setOsState({
+ loading: false,
+ selectedOS: os || foundOSs[0],
+ OSs: foundOSs,
+ });
setTriggerUserCheck(true);
};
@@ -77,7 +100,9 @@ export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElemen
let res: ExecResult;
let foundUsers = [];
if (ddClient.host.platform === 'win32') {
- res = await ddClient.extension.host?.cli.exec('checkUser.cmd', [osState.selectedOS]);
+ res = await ddClient.extension.host?.cli.exec('checkUser.cmd', [
+ osState.selectedOS,
+ ]);
foundUsers = getUsersFromBinaryWindows(res.stdout);
} else {
res = await ddClient.extension.host?.cli.exec('checkUser.sh', []);
@@ -85,11 +110,17 @@ export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElemen
}
if (res.stderr || !res.stdout) {
- ddClient.desktopUI.toast.error(`Error while locating users: ${res.stderr} using /tmp as mount point`);
+ ddClient.desktopUI.toast.error(
+ `Error while locating users: ${res.stderr} using /tmp as mount point`,
+ );
closeWithoutSetting();
}
- setUserState({ loading: false, selectedUser: user || foundUsers[0], users: foundUsers });
+ setUserState({
+ loading: false,
+ selectedUser: user || foundUsers[0],
+ users: foundUsers,
+ });
};
const locateMountPoint = async () => {
@@ -102,8 +133,10 @@ export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElemen
useEffect(() => {
const execChecks = async () => {
- if (userState.users.length === 0
- || (ddClient.host.platform === 'win32' && osState.OSs.length === 0)) {
+ if (
+ userState.users.length === 0 ||
+ (ddClient.host.platform === 'win32' && osState.OSs.length === 0)
+ ) {
locateMountPoint();
}
};
@@ -154,94 +187,117 @@ export const SettingsForm = ({ initialState }: MountPointFormProps): ReactElemen
{label}
- ),
- )}
+ ))}
- {activeStep === 0 &&
+ {activeStep === 0 && (
<>
- Make sure to have the option "Show Docker Extensions system containers" enabled.
- To enable it visit your settings:
+ Make sure to have the option "Show Docker Extensions system
+ containers" enabled. To enable it visit your settings:
- Navigate to Settings
- Select the Extensions tab
- - Next to Show Docker Extensions system containers, select the checkbox
+ -
+ Next to Show Docker Extensions system containers, select the
+ checkbox
+
- In the bottom-right corner, select Apply & Restart
>
- }
- {
- activeStep === 1 &&
+ )}
+ {activeStep === 1 && (
- In order to start the Pro container, add a configuration with the variable LOCALSTACK_AUTH_TOKEN
- set to your auth token and select that configuration in the top right corner.
- API Keys are also supported, but will be deprecated in the future.
+ In order to start the Pro container, add a configuration with the
+ variable LOCALSTACK_AUTH_TOKEN set to your auth token and select
+ that configuration in the top right corner. API Keys are also
+ supported, but will be deprecated in the future.
- }
- {activeStep === 2 &&
+ )}
+ {activeStep === 2 && (
<>
-
- Default mount point settings
-
- {ddClient.host.platform === 'win32' &&
+ Default mount point settings
+
+
+ {ddClient.host.platform === 'win32' && (
<>
-
- WSL distro
-
-
+ WSL distro
+
Select in which WSL distro you want to mount the container
- {osState.loading ?
+ {osState.loading ? (
- :
-
+ ) : (
+
- }
+
+ )}
- >}
+ >
+ )}
<>
-
- User
-
-
+ User
+
Select under which user you want to mount the container
- {userState.loading || osState.loading ?
+ {userState.loading || osState.loading ? (
- :
-
+ ) : (
+
- }
+
+ )}
>
-
+
+
+
{`The LocalStack container will be mounted under ${getMountPointPath()}`}
-
- *You can still change this by overriding the LOCALSTACK_VOLUME_DIR environment variable
- >
- }
+
+
+ *You can still change this by overriding the
+ LOCALSTACK_VOLUME_DIR environment variable
+
+ >
+ )}
- {
- activeStep === steps.length - 1 ?
- <>
-
- Close
-
-
- Confirm
-
- >
- :
-
- Next
+ >
+ Close
+
+
+ Confirm
- }
+ >
+ ) : (
+
+ Next
+
+ )}
-
+
);
};
diff --git a/ui/src/components/Views/Configs/UpsertConfig.tsx b/ui/src/components/Views/Configs/UpsertConfig.tsx
index dbb5715..440c8dc 100644
--- a/ui/src/components/Views/Configs/UpsertConfig.tsx
+++ b/ui/src/components/Views/Configs/UpsertConfig.tsx
@@ -191,7 +191,7 @@ export const UpsertConfig = ({ config, open, onClose }: Props): ReactElement =>
Cancel
diff --git a/ui/src/services/hooks/api.ts b/ui/src/services/hooks/api.ts
index 5dc623c..b72fce6 100644
--- a/ui/src/services/hooks/api.ts
+++ b/ui/src/services/hooks/api.ts
@@ -1,29 +1,53 @@
import useSWR from 'swr';
-import { STORAGE_KEY_ENVVARS, STORAGE_KEY_LOCALSTACK, STORAGE_KEY_MOUNT } from '../../constants';
-import { ConfigData, DockerContainer, mountPointData, RunConfig } from '../../types';
+import {
+ STORAGE_KEY_ENVVARS,
+ STORAGE_KEY_LOCALSTACK,
+ STORAGE_KEY_MOUNT,
+} from '../../constants';
+import {
+ ConfigData,
+ DockerContainer,
+ mountPointData,
+ RunConfig,
+} from '../../types';
import { isALocalStackContainer, isJson } from '../util';
import { useDDClient } from './utils';
interface useRunConfigsReturn {
- configData: ConfigData,
- isLoading: boolean,
+ configData: ConfigData;
+ isLoading: boolean;
setRunningConfig: (data: string) => unknown;
createConfig: (data: RunConfig) => unknown;
updateConfig: (data: RunConfig) => unknown;
deleteConfig: (data: string) => unknown;
}
-interface HTTPMessage {
- data: {
- Message: string,
- },
-}
+// This is what backend calls send in MacOS
+type BaseMessage = {
+ Message: string;
+};
+
+// This is what backend calls send on Linux
+type LinuxMessage = {
+ data: BaseMessage;
+};
+
+type HTTPMessage = LinuxMessage | BaseMessage;
+
+const isBaseMessage = (msg: HTTPMessage): msg is BaseMessage => (msg as BaseMessage).Message !== undefined;
+
+const resolveOSMessage = (message: HTTPMessage | undefined): BaseMessage | undefined => {
+ if (!message) return undefined;
+ if (isBaseMessage(message)) return message;
+ return message.data;
+};
const adaptVersionData = (message: HTTPMessage, error: Error) => {
- const newData = (!message || !message.data?.Message || error) ?
- { configs: [], runningConfig: null }
- :
- JSON.parse(message.data?.Message);
+ const data = resolveOSMessage(message);
+ const newData =
+ !data || !data?.Message || error
+ ? { configs: [], runningConfig: null }
+ : JSON.parse(data?.Message);
if (Array.isArray(newData)) {
return { configs: newData, runningConfig: newData.at(0).id ?? null };
}
@@ -35,21 +59,27 @@ export const useRunConfigs = (): useRunConfigsReturn => {
const { client: ddClient } = useDDClient();
const { data, mutate, isValidating, error } = useSWR(
cacheKey,
- () => (ddClient.extension.vm.service.get('/configs') as Promise),
+ () => ddClient.extension.vm.service.get('/configs') as Promise,
);
const updateConfig = async (newData: RunConfig) => {
- await ddClient.extension.vm.service.put('/configs', { Data: JSON.stringify(newData) });
+ await ddClient.extension.vm.service.put('/configs', {
+ Data: JSON.stringify(newData),
+ });
mutate();
};
const setRunningConfig = async (configId: string) => {
- await ddClient.extension.vm.service.put('/configs/running', { Data: JSON.stringify(configId) });
+ await ddClient.extension.vm.service.put('/configs/running', {
+ Data: JSON.stringify(configId),
+ });
mutate();
};
const createConfig = async (newData: RunConfig) => {
- await ddClient.extension.vm.service.post('/configs', { Data: JSON.stringify(newData) });
+ await ddClient.extension.vm.service.post('/configs', {
+ Data: JSON.stringify(newData),
+ });
mutate();
};
@@ -58,7 +88,6 @@ export const useRunConfigs = (): useRunConfigsReturn => {
mutate();
};
-
return {
configData: adaptVersionData(data, error),
isLoading: isValidating || (!error && !data),
@@ -70,12 +99,12 @@ export const useRunConfigs = (): useRunConfigsReturn => {
};
interface useMountPointReturn {
- user: string | null,
- os: string | null,
- showForm: boolean,
- showSetupWarning: boolean,
- hasSkippedConfiguration: boolean,
- isLoading: boolean,
+ user: string | null;
+ os: string | null;
+ showForm: boolean;
+ showSetupWarning: boolean;
+ hasSkippedConfiguration: boolean;
+ isLoading: boolean;
setMountPointData: (data: mountPointData) => void;
}
@@ -85,30 +114,41 @@ export const useMountPoint = (): useMountPointReturn => {
const { data, mutate, isValidating, error } = useSWR(
cacheKey,
- async () => (ddClient.extension.vm.service.get('/mount') as Promise),
+ async () =>
+ ddClient.extension.vm.service.get('/mount') as Promise,
);
const setMountPointData = async (data: mountPointData) => {
- await ddClient.extension.vm.service.post('/mount', { Data: JSON.stringify(data) });
+ await ddClient.extension.vm.service.post('/mount', {
+ Data: JSON.stringify(data),
+ });
mutate();
};
- const fileContent = (!error && data) ? data.data.Message : null;
- const mountPointData = isJson(fileContent) ? JSON.parse(fileContent) as mountPointData : null;
+ const adaptedData = resolveOSMessage(data);
+
+ const fileContent = !error && adaptedData ? adaptedData.Message : null;
+ const mountPointData = isJson(fileContent)
+ ? (JSON.parse(fileContent) as mountPointData)
+ : null;
return {
user: mountPointData?.user,
os: mountPointData?.os,
- showForm: mountPointData?.showForm == null ? true : mountPointData?.showForm,
- showSetupWarning: mountPointData?.showSetupWarning == null ? true : mountPointData?.showSetupWarning,
+ showForm:
+ mountPointData?.showForm == null ? true : mountPointData?.showForm,
+ showSetupWarning:
+ mountPointData?.showSetupWarning == null
+ ? true
+ : mountPointData?.showSetupWarning,
hasSkippedConfiguration: mountPointData?.hasSkippedConfiguration || false,
- isLoading: isValidating || (!error && !data),
+ isLoading: isValidating || (!error && !adaptedData),
setMountPointData,
};
};
interface useLocalStackReturn {
- data: DockerContainer | null,
+ data: DockerContainer | null;
mutate: () => void;
}
@@ -118,15 +158,21 @@ export const useLocalStack = (): useLocalStackReturn => {
const { data, mutate } = useSWR(
cacheKey,
- async () => (await ddClient.docker.listContainers() as [DockerContainer])
- .find(container =>
- isALocalStackContainer(container) && container.Command !== 'bin/localstack update docker-images',
- ), {
- refreshInterval: 2000, compare:
- /*
- * compares whether the old (b) status aligns with that of new (a) status
- */
- (a, b) => a?.Id === b?.Id && a?.Status.includes('unhealthy') === b?.Status.includes('unhealthy'),
+ async () =>
+ ((await ddClient.docker.listContainers()) as [DockerContainer]).find(
+ (container) =>
+ isALocalStackContainer(container) &&
+ container.Command !== 'bin/localstack update docker-images',
+ ),
+ {
+ refreshInterval: 2000,
+ compare:
+ /*
+ * compares whether the old (b) status aligns with that of new (a) status
+ */
+ (a, b) =>
+ a?.Id === b?.Id &&
+ a?.Status.includes('unhealthy') === b?.Status.includes('unhealthy'),
},
);