From c99ff5c1b7d37b0e680871923855535c4ab9c7c3 Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Fri, 30 Oct 2026 20:19:50 +1100 Subject: [PATCH 1/9] refactor: remove unused files and dependencies Replace the 1,259-line timezone table with Intl.supportedValuesOf. Delete the unused rich text input, the IE check and its page, and 10 unused packages. Declare js-yaml with types; this dropped two strict options that js-yaml 4 never supported. Co-Authored-By: Claude Opus 5.5 --- bun.lock | 310 ++-- package.json | 14 +- public/assets/not-supported.html | 156 -- src/app/app.ts | 7 +- src/app/common/general.ts | 53 - src/app/common/timezones.ts | 1262 +---------------- src/app/systems/systems.utilities.ts | 4 +- .../rich-text-input.component.ts | 251 ---- src/app/ui/forms/settings-form.component.ts | 2 +- src/app/zones/zone-form.component.ts | 2 +- src/tests/common/general.spec.ts | 71 - src/tests/common/timezones.spec.ts | 221 +-- .../modules/module-form.component.spec.ts | 3 - .../overlays/confirm-modal.component.spec.ts | 31 +- .../repository-form.component.spec.ts | 2 - .../components/context-menu.component.spec.ts | 3 +- .../fullscreen-modal-shell.component.spec.ts | 2 - .../components/simple-table.component.spec.ts | 3 +- .../support-group-picker.component.spec.ts | 7 +- 19 files changed, 216 insertions(+), 2188 deletions(-) delete mode 100644 public/assets/not-supported.html delete mode 100644 src/app/ui/custom-fields/rich-text-input.component.ts diff --git a/bun.lock b/bun.lock index 59f550b20..c43973d88 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,6 @@ "": { "name": "@backoffice/source", "dependencies": { - "@angular/animations": "22.2.3", "@angular/common": "22.2.3", "@angular/compiler": "22.2.3", "@angular/core": "22.2.3", @@ -30,10 +29,8 @@ "@angular/compiler-cli": "22.2.3", "@angular/language-service": "22.2.3", "@angular/material": "22.2.4", - "@angular/pwa": "22.2.3", "@eslint/js": "^9.8.0", "@fontsource-variable/roboto": "^5.3.0", - "@ngneat/spectator": "^22.1.0", "@nx/angular": "23.3.0", "@nx/devkit": "23.3.0", "@nx/eslint": "23.3.0", @@ -53,26 +50,24 @@ "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@tailwindcss/postcss": "^4.1.17", + "@types/js-yaml": "^4.0.9", "@types/node": "20.19.9", "@typescript-eslint/utils": "8.65.0", "@vitest/coverage-v8": "^4.0.8", "@vitest/ui": "^4.0.8", - "@xterm/xterm": "^5.5.0", "angular-eslint": "22.6.0", - "autoprefixer": "^10.4.16", "date-fns": "^4.1.0", - "date-fns-tz": "^3.2.0", "eslint": "^9.8.0", "eslint-config-prettier": "^10.0.0", "eslint-plugin-playwright": "^1.6.2", "firacode": "^6.2.0", "git-describe": "^4.1.1", "jiti": "2.4.2", + "js-yaml": "^4.1.1", "jsdom": "~22.1.0", "marked": "^17.0.0", "material-symbols": "^0.39.3", "monaco-editor": "^0.54.0", - "mqtt": "^5.14.1", "ng-mocks": "^14.14.0", "nx": "23.3.0", "postcss-import": "^16.1.1", @@ -81,16 +76,13 @@ "prettier": "^3.6.2", "prettier-plugin-organize-imports": "^4.3.0", "prettier-plugin-tailwindcss": "^0.7.1", - "qr": "^0.5.2", "rxjs": "^7.8.2", - "suneditor": "^2.47.8", "ts-md5": "^2.0.1", "tslib": "^2.3.0", "typescript": "~6.0.3", "typescript-eslint": "8.65.0", "vite": "8.3.5", "vitest": "^4.0.8", - "yaml": "^2.8.1", }, }, }, @@ -123,8 +115,6 @@ "@angular-eslint/utils": ["@angular-eslint/utils@22.6.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "22.6.0" }, "peerDependencies": { "@typescript-eslint/utils": "^8.0.0", "eslint": "^9.0.0 || ^10.0.0", "typescript": "*" } }, "sha512-Nd5pZGgkBTvcCNMBt88iG6r/Tzk1XTWHpQQccwYUWYhz4PMim0yyXAEvqAabxag8S9iLPUEufpaOw20OOxNJ3w=="], - "@angular/animations": ["@angular/animations@22.2.3", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "22.2.3" } }, "sha512-sslKnTrKwHwtTvT/pWj7UoYq0cfuX3PijZM7v0JtCajQkK1Nj0Ljob0mebxXBXUVBrOixfCnfBS0EG4JNEznFA=="], - "@angular/build": ["@angular/build@22.2.3", "", { "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.2202.3", "@babel/core": "8.0.5", "@inquirer/confirm": "6.3.2", "@parcel/watcher": "2.6.0", "@vitejs/plugin-basic-ssl": "2.3.0", "beasties": "0.5.4", "browserslist": "^4.26.0", "chokidar": "5.0.0", "esbuild": "0.28.2", "https-proxy-agent": "9.1.0", "jsonc-parser": "3.3.1", "listr2": "11.1.0", "magic-string": "1.4.1", "mrmime": "2.0.1", "oxc-parser": "0.150.0", "parse5-html-rewriting-stream": "8.0.1", "picomatch": "4.0.7", "piscina": "5.3.2", "rolldown": "1.2.8", "sass": "1.104.1", "sass-embedded": "1.104.1", "semver": "7.8.5", "source-map-support": "0.5.21", "tinyglobby": "0.2.17", "vite": "8.3.0", "xxhash-wasm": "1.1.0" }, "optionalDependencies": { "lmdb": "3.5.6" }, "peerDependencies": { "@angular/compiler": "^22.0.0", "@angular/compiler-cli": "^22.0.0", "@angular/core": "^22.0.0", "@angular/localize": "^22.0.0", "@angular/platform-browser": "^22.0.0", "@angular/platform-server": "^22.0.0", "@angular/service-worker": "^22.0.0", "@angular/ssr": "^22.2.3", "istanbul-lib-instrument": "^6.0.0", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^22.0.0", "postcss": "^8.4.0", "rollup": "^4.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", "typescript": ">=6.0 <6.1", "vitest": "^4.0.8 || ^5.0.0" }, "optionalPeers": ["@angular/core", "@angular/localize", "@angular/platform-browser", "@angular/platform-server", "@angular/service-worker", "@angular/ssr", "istanbul-lib-instrument", "karma", "less", "ng-packagr", "postcss", "rollup", "tailwindcss", "vitest"] }, "sha512-EtNEuPBUCyIuzdXrQ/nINvgFzW8bUI5AkAZtJiSn7nsFOlvaygaKN0kENNTO3zRl3T9B4GDog+Ks5Nec3FBkhg=="], "@angular/cdk": ["@angular/cdk@22.2.4", "", { "dependencies": { "parse5": "^8.0.0", "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "^22.0.0 || ^23.0.0", "@angular/core": "^22.0.0 || ^23.0.0", "@angular/forms": "^22.0.0 || ^23.0.0", "@angular/platform-browser": "^22.0.0 || ^23.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-c/DSWyCnN17f/EIl9Y1zVmSEWCAEdp4yeS53WWiHghIPg3kDX32Qbe/9b0/hlYfxcBSdPxtcgZMLSvqtu6hvkA=="], @@ -147,8 +137,6 @@ "@angular/platform-browser": ["@angular/platform-browser@22.2.3", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "22.2.3", "@angular/common": "22.2.3", "@angular/core": "22.2.3" }, "optionalPeers": ["@angular/animations"] }, "sha512-eWZGsbG4bSrSg9UB/NE8wORGVrh1u+x6rirPGpMWqq/mTi6q+nS+pnPxAxmiEs8wmPH5nCz5b2pRKQeYUkhAGA=="], - "@angular/pwa": ["@angular/pwa@22.2.3", "", { "dependencies": { "@angular-devkit/schematics": "22.2.3", "@schematics/angular": "22.2.3", "parse5-html-rewriting-stream": "8.0.1" }, "peerDependencies": { "@angular/cli": "^22.2.3" }, "optionalPeers": ["@angular/cli"] }, "sha512-ORyFtRHLRnLTWhOWY/Q+mVdCAorKEYVwi/USs6qMT+tJ4AQbNmxJ7klF337Uh9l/Tc1Tknjf3dM63uv1iGP64w=="], - "@angular/router": ["@angular/router@22.2.3", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "22.2.3", "@angular/core": "22.2.3", "@angular/platform-browser": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-h4C3iJ3OXM9HItErmTo9fFrFRDj1DSqbvweHAWl8eYJvyuhDD80gBNgdpN8/5gpt9K1HV+PXk0YbyjyQ0zMfPA=="], "@angular/service-worker": ["@angular/service-worker@22.2.3", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0" }, "bin": { "ngsw-config": "ngsw-config.js" } }, "sha512-saMdoMws2M9nIGfM2hdhCHhPospGq1UC1xR3V8pcPQWW9EgQqkpjLZODPrXxJjzxpvprnuHY7w/OSt7dqfbbtA=="], @@ -651,8 +639,6 @@ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.4", "", { "dependencies": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ=="], - "@ngneat/spectator": ["@ngneat/spectator@22.1.0", "", { "dependencies": { "@testing-library/dom": "^10.4.1", "jquery": "^3.7.1", "tslib": "^2.6.2" }, "peerDependencies": { "@angular/animations": ">= 20.0.0", "@angular/common": ">= 20.0.0", "@angular/router": ">= 20.0.0" } }, "sha512-5UxMxiSp8LeWCdAtMktd2NVPJhbm88nBbNoOlmBty7b4paHAFwEhr7NNSdNlnFH2ZF/iAE5fLqzkUAgCGSGmDA=="], - "@nx/angular": ["@nx/angular@23.3.0", "", { "dependencies": { "@nx/devkit": "23.3.0", "@nx/eslint": "23.3.0", "@nx/js": "23.3.0", "@nx/web": "23.3.0", "@phenomnomnominal/tsquery": "~6.2.0", "@typescript-eslint/type-utils": "^8.0.0", "jsonc-parser": "^3.2.0", "magic-string": "~0.30.2", "picocolors": "^1.1.0", "picomatch": "4.0.4", "semver": "^7.6.3", "tslib": "^2.3.0" }, "peerDependencies": { "@angular-devkit/build-angular": ">= 20.0.0 < 23.0.0", "@angular-devkit/core": ">= 20.0.0 < 23.0.0", "@angular-devkit/schematics": ">= 20.0.0 < 23.0.0", "@angular/build": ">= 20.0.0 < 23.0.0", "@nx/cypress": "23.3.0", "@nx/module-federation": "23.3.0", "@nx/playwright": "23.3.0", "@nx/rspack": "23.3.0", "@nx/webpack": "23.3.0", "@schematics/angular": ">= 20.0.0 < 23.0.0", "ng-packagr": ">= 20.0.0 < 23.0.0", "rxjs": "^6.5.3 || ^7.5.0", "webpack-merge": "^5.8.0" }, "optionalPeers": ["@angular-devkit/build-angular", "@angular/build", "@nx/cypress", "@nx/module-federation", "@nx/playwright", "@nx/rspack", "@nx/webpack", "ng-packagr", "webpack-merge"] }, "sha512-rRDHaJODyX0WXD5NCLmz21MihIhiUPg6LlSKDdTiLOCIAz7vLaJypQJeRCZUkgOdfFZkCvZKW/K95r67gUbLIw=="], "@nx/devkit": ["@nx/devkit@23.3.0", "", { "dependencies": { "ejs": "5.0.1", "minimatch": "10.2.5", "semver": "^7.6.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" }, "peerDependencies": { "nx": ">= 22 <= 24 || ^23.0.0-0" } }, "sha512-xGSV4gCwQsVdt49VRcfxd2L31dAO/9t9Isv2bM5O89vyEzwd/tkW/IQwUzWn3OdhCnHayd37S1tDyJ5DilCv7w=="], @@ -965,14 +951,10 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.17", "@tailwindcss/oxide": "4.1.17", "postcss": "^8.4.41", "tailwindcss": "4.1.17" } }, "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw=="], - "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], - "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], - "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], @@ -987,6 +969,8 @@ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], + "@types/jsesc": ["@types/jsesc@2.5.1", "", {}, "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], @@ -997,14 +981,10 @@ "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], - "@types/readable-stream": ["@types/readable-stream@4.0.22", "", { "dependencies": { "@types/node": "*" } }, "sha512-/FFhJpfCLAPwAcN3mFycNUa77ddnr8jTgF5VmSNetaemWB2cIlfCA9t0YTM3JAT0wOcv8D4tjPo7pkDhK3EJIg=="], - "@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.65.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/type-utils": "8.65.0", "@typescript-eslint/utils": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.65.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.65.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/types": "8.65.0", "@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA=="], @@ -1047,16 +1027,12 @@ "@vitest/utils": ["@vitest/utils@4.1.8", "", { "dependencies": { "@vitest/pretty-format": "4.1.8", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg=="], - "@xterm/xterm": ["@xterm/xterm@5.5.0", "", {}, "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="], - "@yarnpkg/lockfile": ["@yarnpkg/lockfile@1.1.0", "", {}, "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="], "@zkochan/js-yaml": ["@zkochan/js-yaml@0.0.7", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ=="], "abab": ["abab@2.0.6", "", {}, "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="], - "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -1079,7 +1055,7 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], @@ -1121,8 +1097,6 @@ "brace-expansion": ["brace-expansion@5.0.12", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ=="], - "broker-factory": ["broker-factory@3.1.10", "", { "dependencies": { "@babel/runtime": "^7.28.4", "fast-unique-numbers": "^9.0.24", "tslib": "^2.8.1", "worker-factory": "^7.0.46" } }, "sha512-BzqK5GYFhvVFvO13uzPN0SCiOsOQuhMUbsGvTXDJMA2/N4GvIlFdxEuueE+60Zk841bBU5G3+fl2cqYEo0wgGg=="], - "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], @@ -1141,7 +1115,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -1185,12 +1159,8 @@ "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "commist": ["commist@3.2.0", "", {}, "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw=="], - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="], - "confusing-browser-globals": ["confusing-browser-globals@1.0.11", "", {}, "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA=="], "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], @@ -1229,8 +1199,6 @@ "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], - "date-fns-tz": ["date-fns-tz@3.2.0", "", { "peerDependencies": { "date-fns": "^3.0.0 || ^4.0.0" } }, "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ=="], - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], @@ -1255,8 +1223,6 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], - "dom-serializer": ["dom-serializer@3.1.1", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "entities": "^8.0.0" } }, "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw=="], "domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], @@ -1343,12 +1309,8 @@ "event-emitter": ["event-emitter@0.3.5", "", { "dependencies": { "d": "1", "es5-ext": "~0.10.14" } }, "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA=="], - "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], - "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], - "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "ext": ["ext@1.7.0", "", { "dependencies": { "type": "^2.7.2" } }, "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw=="], @@ -1365,8 +1327,6 @@ "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], - "fast-unique-numbers": ["fast-unique-numbers@9.0.24", "", { "dependencies": { "@babel/runtime": "^7.28.4", "tslib": "^2.8.1" } }, "sha512-Dv0BYn4waOWse94j16rsZ5w/0zoaCa74O3q6IZjMqaXbtT92Q+Sb6pPk+phGzD8Xh+nueQmSRI3tSCaHKidzKw=="], - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="], @@ -1439,8 +1399,6 @@ "he": ["he@1.2.0", "", { "bin": "bin/he" }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], - "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], - "hosted-git-info": ["hosted-git-info@10.1.1", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ=="], "html-encoding-sniffer": ["html-encoding-sniffer@3.0.0", "", { "dependencies": { "whatwg-encoding": "^2.0.0" } }, "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA=="], @@ -1477,8 +1435,6 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], @@ -1515,10 +1471,6 @@ "jiti": ["jiti@2.4.2", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], - "jquery": ["jquery@3.7.1", "", {}, "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="], - - "js-sdsl": ["js-sdsl@4.3.0", "", {}, "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], @@ -1589,9 +1541,7 @@ "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], - "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - - "lz-string": ["lz-string@1.5.0", "", { "bin": "bin/bin.js" }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + "lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -1633,10 +1583,6 @@ "monaco-editor": ["monaco-editor@0.54.0", "", { "dependencies": { "dompurify": "3.1.7", "marked": "14.0.0" } }, "sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw=="], - "mqtt": ["mqtt@5.14.1", "", { "dependencies": { "@types/readable-stream": "^4.0.21", "@types/ws": "^8.18.1", "commist": "^3.2.0", "concat-stream": "^2.0.0", "debug": "^4.4.1", "help-me": "^5.0.0", "lru-cache": "^10.4.3", "minimist": "^1.2.8", "mqtt-packet": "^9.0.2", "number-allocator": "^1.0.14", "readable-stream": "^4.7.0", "rfdc": "^1.4.1", "socks": "^2.8.6", "split2": "^4.2.0", "worker-timers": "^8.0.23", "ws": "^8.18.3" }, "bin": { "mqtt": "build/bin/mqtt.js", "mqtt_pub": "build/bin/pub.js", "mqtt_sub": "build/bin/sub.js" } }, "sha512-NxkPxE70Uq3Ph7goefQa7ggSsVzHrayCD0OyxlJgITN/EbzlZN+JEPmaAZdxP1LsIT5FamDyILoQTF72W7Nnbw=="], - - "mqtt-packet": ["mqtt-packet@9.0.2", "", { "dependencies": { "bl": "^6.0.8", "debug": "^4.3.4", "process-nextick-args": "^2.0.1" } }, "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA=="], - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -1677,8 +1623,6 @@ "nth-check": ["nth-check@3.0.1", "", { "dependencies": { "boolbase": "^2.0.0" } }, "sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ=="], - "number-allocator": ["number-allocator@1.0.14", "", { "dependencies": { "debug": "^4.3.1", "js-sdsl": "4.3.0" } }, "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA=="], - "nwsapi": ["nwsapi@2.2.22", "", {}, "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ=="], "nx": ["nx@23.3.0", "", { "dependencies": { "@clack/core": "1.4.3", "@clack/prompts": "1.7.0", "@emnapi/core": "1.4.5", "@emnapi/runtime": "1.4.5", "@emnapi/wasi-threads": "1.0.4", "@jest/diff-sequences": "30.0.1", "@napi-rs/wasm-runtime": "0.2.4", "@tybys/wasm-util": "0.9.0", "@yarnpkg/lockfile": "1.1.0", "@zkochan/js-yaml": "0.0.7", "ansi-regex": "5.0.1", "ansi-styles": "4.3.0", "argparse": "2.0.1", "balanced-match": "4.0.3", "base64-js": "1.5.1", "bl": "4.1.0", "brace-expansion": "5.0.12", "buffer": "5.7.1", "bundle-name": "4.1.0", "chalk": "4.1.2", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", "cliui": "8.0.1", "clone": "1.0.4", "color-convert": "2.0.1", "color-name": "1.1.4", "default-browser": "5.2.1", "default-browser-id": "5.0.0", "defaults": "1.0.4", "define-lazy-prop": "3.0.0", "dotenv": "16.4.7", "dotenv-expand": "12.0.3", "ejs": "5.0.1", "emoji-regex": "8.0.0", "end-of-stream": "1.4.5", "escalade": "3.2.0", "escape-string-regexp": "1.0.5", "fast-string-truncated-width": "3.0.3", "fast-string-width": "3.0.2", "fast-wrap-ansi": "0.2.0", "figures": "3.2.0", "fs-constants": "1.0.0", "get-caller-file": "2.0.5", "has-flag": "4.0.0", "ieee754": "1.2.1", "ignore": "7.0.6", "inherits": "2.0.4", "is-docker": "3.0.0", "is-fullwidth-code-point": "3.0.0", "is-inside-container": "1.0.0", "is-interactive": "1.0.0", "is-unicode-supported": "0.1.0", "is-wsl": "3.1.0", "isexe": "2.0.0", "json5": "2.2.3", "jsonc-parser": "3.3.1", "lines-and-columns": "2.0.3", "log-symbols": "4.1.0", "mimic-fn": "2.1.0", "minimatch": "10.2.5", "minimist": "1.2.8", "npm-run-path": "4.0.1", "once": "1.4.0", "onetime": "5.1.2", "open": "10.1.0", "ora": "5.4.1", "path-key": "3.1.1", "picocolors": "1.1.1", "readable-stream": "3.6.2", "require-directory": "2.1.1", "resolve.exports": "2.0.3", "restore-cursor": "3.1.0", "run-applescript": "7.0.0", "safe-buffer": "5.2.1", "semver": "7.8.5", "signal-exit": "3.0.7", "sisteransi": "1.0.5", "smol-toml": "1.9.0", "string-width": "4.2.3", "string_decoder": "1.3.0", "strip-ansi": "6.0.1", "strip-bom": "3.0.0", "supports-color": "7.2.0", "tar-stream": "2.2.0", "tmp": "0.2.7", "tsconfig-paths": "4.2.0", "tslib": "2.8.1", "undici": "7.29.0", "util-deprecate": "1.0.2", "wcwidth": "1.0.1", "which": "3.0.1", "wrap-ansi": "7.0.0", "wrappy": "1.0.2", "y18n": "5.0.8", "yaml": "2.9.0", "yargs": "17.7.2", "yargs-parser": "21.1.1" }, "optionalDependencies": { "@nx/nx-darwin-arm64": "23.3.0", "@nx/nx-darwin-x64": "23.3.0", "@nx/nx-freebsd-x64": "23.3.0", "@nx/nx-linux-arm-gnueabihf": "23.3.0", "@nx/nx-linux-arm64-gnu": "23.3.0", "@nx/nx-linux-arm64-musl": "23.3.0", "@nx/nx-linux-x64-gnu": "23.3.0", "@nx/nx-linux-x64-musl": "23.3.0", "@nx/nx-win32-arm64-msvc": "23.3.0", "@nx/nx-win32-x64-msvc": "23.3.0" }, "peerDependencies": { "@swc-node/register": "^1.11.1", "@swc/core": "^1.15.8" }, "optionalPeers": ["@swc-node/register", "@swc/core"], "bin": { "nx": "./dist/bin/nx.js", "nx-cloud": "./dist/bin/nx-cloud.js" } }, "sha512-R7Kl+hURSGiG9uEjc19Cg3o+vGCDHqCVp6mioiBMEsOSol/LgzP+K8TVF06TnnSC8uzxMeB0ymu+LGMJGXnbbw=="], @@ -1823,14 +1767,8 @@ "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.7.1", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-sort-imports", "prettier-plugin-svelte"] }, "sha512-Bzv1LZcuiR1Sk02iJTS1QzlFNp/o5l2p3xkopwOrbPmtMeh3fK9rVW5M3neBQzHq+kGKj/4LGQMTNcTH4NGPtQ=="], - "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - "proc-log": ["proc-log@7.0.0", "", {}, "sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg=="], - "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], - - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], @@ -1845,17 +1783,13 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "qr": ["qr@0.5.2", "", {}, "sha512-91M3sVlA7xCFpkJtYX5xzVH8tDo4rNZ7jr8v+1CRgPVkZ4D+Vl9y8rtZWJ/YkEUM6U/h0FAu5W/JAK7iowOteA=="], - "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], - "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], - "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], @@ -1891,8 +1825,6 @@ "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], - "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - "rolldown": ["rolldown@1.2.8", "", { "dependencies": { "@oxc-project/types": "=0.149.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.8", "@rolldown/binding-android-arm64": "1.2.8", "@rolldown/binding-darwin-arm64": "1.2.8", "@rolldown/binding-darwin-x64": "1.2.8", "@rolldown/binding-freebsd-x64": "1.2.8", "@rolldown/binding-linux-arm-gnueabihf": "1.2.8", "@rolldown/binding-linux-arm64-gnu": "1.2.8", "@rolldown/binding-linux-arm64-musl": "1.2.8", "@rolldown/binding-linux-ppc64-gnu": "1.2.8", "@rolldown/binding-linux-s390x-gnu": "1.2.8", "@rolldown/binding-linux-x64-gnu": "1.2.8", "@rolldown/binding-linux-x64-musl": "1.2.8", "@rolldown/binding-openharmony-arm64": "1.2.8", "@rolldown/binding-win32-arm64-msvc": "1.2.8", "@rolldown/binding-win32-x64-msvc": "1.2.8" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ=="], "rollup": ["rollup@4.52.3", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.3", "@rollup/rollup-android-arm64": "4.52.3", "@rollup/rollup-darwin-arm64": "4.52.3", "@rollup/rollup-darwin-x64": "4.52.3", "@rollup/rollup-freebsd-arm64": "4.52.3", "@rollup/rollup-freebsd-x64": "4.52.3", "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", "@rollup/rollup-linux-arm-musleabihf": "4.52.3", "@rollup/rollup-linux-arm64-gnu": "4.52.3", "@rollup/rollup-linux-arm64-musl": "4.52.3", "@rollup/rollup-linux-loong64-gnu": "4.52.3", "@rollup/rollup-linux-ppc64-gnu": "4.52.3", "@rollup/rollup-linux-riscv64-gnu": "4.52.3", "@rollup/rollup-linux-riscv64-musl": "4.52.3", "@rollup/rollup-linux-s390x-gnu": "4.52.3", "@rollup/rollup-linux-x64-gnu": "4.52.3", "@rollup/rollup-linux-x64-musl": "4.52.3", "@rollup/rollup-openharmony-arm64": "4.52.3", "@rollup/rollup-win32-arm64-msvc": "4.52.3", "@rollup/rollup-win32-ia32-msvc": "4.52.3", "@rollup/rollup-win32-x64-gnu": "4.52.3", "@rollup/rollup-win32-x64-msvc": "4.52.3", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A=="], @@ -1979,12 +1911,8 @@ "slice-ansi": ["slice-ansi@9.0.1", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-aBY19bn/XA+hKOKX0qL7Z0UfdBsbQvc9hn993U8ALUjzxCvDcuZqLoRXjGJrUARWAlwMnsRVD9sw2AFNOYvalA=="], - "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - "smol-toml": ["smol-toml@1.9.0", "", {}, "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ=="], - "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], - "source-map": ["source-map@0.8.0", "", {}, "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -1993,8 +1921,6 @@ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], "std-env": ["std-env@4.1.0", "", {}, "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="], @@ -2013,8 +1939,6 @@ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "suneditor": ["suneditor@2.47.8", "", {}, "sha512-GGzaN1m+rFIR/zHdRxSH5JvzzJIF4UoaX2bWmcvk6NIcq2qgvdkR0iO+yFyjIL6zTVMeBI/GWkJMvOh8Qe5ehw=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -2065,8 +1989,6 @@ "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], - "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], @@ -2151,14 +2073,6 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "worker-factory": ["worker-factory@7.0.46", "", { "dependencies": { "@babel/runtime": "^7.28.4", "fast-unique-numbers": "^9.0.24", "tslib": "^2.8.1" } }, "sha512-Sr1hq2FMgNa04UVhYQacsw+i58BtMimzDb4+CqYphZ97OfefRpURu0UZ+JxMr/H36VVJBfuVkxTK7MytsanC3w=="], - - "worker-timers": ["worker-timers@8.0.25", "", { "dependencies": { "@babel/runtime": "^7.28.4", "tslib": "^2.8.1", "worker-timers-broker": "^8.0.11", "worker-timers-worker": "^9.0.11" } }, "sha512-X7Z5dmM6PlrEnaadtFQOyXHGD/IysPA3HZzaC2koqsU1VI+RvyGmjiiLiUBQixK8PH5R7ilkOzZupWskNRaXmA=="], - - "worker-timers-broker": ["worker-timers-broker@8.0.11", "", { "dependencies": { "@babel/runtime": "^7.28.4", "broker-factory": "^3.1.10", "fast-unique-numbers": "^9.0.24", "tslib": "^2.8.1", "worker-timers-worker": "^9.0.11" } }, "sha512-uwhxKru8BI9m2tsogxr2fB6POZ8LB2xH+Pu3R0mvQnAZLPgLD6K3IX4LNKPTEgTJ/j5VsuQPB+gLI1NBNKkPlg=="], - - "worker-timers-worker": ["worker-timers-worker@9.0.11", "", { "dependencies": { "@babel/runtime": "^7.28.4", "tslib": "^2.8.1", "worker-factory": "^7.0.46" } }, "sha512-pArb5xtgHWImYpXhjg1OFv7JFG0ubmccb73TFoXHXjG830fFj+16N57q9YeBnZX52dn+itRrMoJZ9HaZBVzDaA=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], @@ -2177,7 +2091,7 @@ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "yaml": ["yaml@2.8.1", "", { "bin": "bin.mjs" }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], + "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], "yargs": ["yargs@18.1.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="], @@ -2197,8 +2111,6 @@ "@angular-eslint/builder/@angular-devkit/architect": ["@angular-devkit/architect@0.2201.9", "", { "dependencies": { "@angular-devkit/core": "22.1.9", "rxjs": "7.8.2" }, "bin": { "architect": "bin/cli.js" } }, "sha512-earmt8lj9b/PadJJBTFEd+DMzZKbzaFDdXrTO2zdfmTViuo9OeRkupGQtZkH8KVPMGf9JwNoAvHSAr7k0i3oUA=="], - "@angular-eslint/eslint-plugin-template/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "@angular-eslint/schematics/ignore": ["ignore@7.0.12", "", {}, "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg=="], "@angular-eslint/template-parser/eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], @@ -2543,8 +2455,6 @@ "@tailwindcss/node/lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], - "@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@typescript-eslint/typescript-estree/semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="], "@typescript-eslint/typescript-estree/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], @@ -2561,6 +2471,8 @@ "autoprefixer/browserslist": ["browserslist@4.28.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", "electron-to-chromium": "^1.5.249", "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": "cli.js" }, "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ=="], + "autoprefixer/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "babel-plugin-const-enum/@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], "babel-plugin-const-enum/@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], @@ -2577,16 +2489,10 @@ "beasties/postcss": ["postcss@8.5.31", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg=="], - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "browserslist/caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], - "bundle-name/run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], "cli-truncate/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], - "concat-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "core-js-compat/browserslist": ["browserslist@4.28.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", "electron-to-chromium": "^1.5.249", "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": "cli.js" }, "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ=="], "cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], @@ -2609,8 +2515,6 @@ "git-describe/semver": ["semver@5.7.2", "", { "bin": "bin/semver" }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], - "hosted-git-info/lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], - "http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], "istanbul-lib-report/make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], @@ -2651,24 +2555,16 @@ "monaco-editor/marked": ["marked@14.0.0", "", { "bin": "bin/marked.js" }, "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ=="], - "mqtt/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" } }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], - - "mqtt-packet/bl": ["bl@6.1.4", "", { "dependencies": { "@types/readable-stream": "^4.0.0", "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^4.2.0" } }, "sha512-ZV/9asSuknOExbM/zPPA8z00lc1ihPKWaStHkkQrxHNeYx+yY+TmF+v80dpv2G0mv3HVXBu7ryoAsxbFFhf4eg=="], - "nx/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "nx/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], "nx/ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], - "nx/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "nx/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], "nx/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], - "nx/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "nx/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "open/default-browser": ["default-browser@5.4.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg=="], @@ -2697,10 +2593,6 @@ "postcss-preset-env/browserslist": ["browserslist@4.28.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", "electron-to-chromium": "^1.5.249", "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": "cli.js" }, "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ=="], - "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - "rolldown/@oxc-project/types": ["@oxc-project/types@0.149.0", "", {}, "sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA=="], "sass/source-map-js": ["source-map-js@1.2.2", "", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="], @@ -2713,8 +2605,6 @@ "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "tinyglobby/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], "vite/postcss": ["postcss@8.5.31", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg=="], @@ -4645,8 +4535,6 @@ "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], - "@testing-library/dom/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], - "@typescript-eslint/typescript-estree/tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "@vitest/ui/tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], @@ -4757,6 +4645,8 @@ "core-js-compat/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "core-js-compat/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "core-js-compat/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "core-js-compat/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -4793,8 +4683,6 @@ "magicast/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "mqtt-packet/bl/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - "open/default-browser/default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], "ora/cli-cursor/restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -4805,6 +4693,8 @@ "postcss-preset-env/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "postcss-preset-env/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "postcss-preset-env/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "postcss-preset-env/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -4957,6 +4847,8 @@ "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -5387,6 +5279,8 @@ "@babel/plugin-transform-classes/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-classes/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-classes/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-classes/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -5589,6 +5483,8 @@ "@babel/plugin-transform-function-name/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-function-name/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-function-name/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-function-name/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -5865,6 +5761,8 @@ "@babel/plugin-transform-object-rest-spread/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-object-rest-spread/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-object-rest-spread/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-object-rest-spread/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6231,6 +6129,8 @@ "@babel/preset-env/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/preset-env/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/preset-env/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/preset-env/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6447,6 +6347,8 @@ "@babel/helper-create-class-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-create-class-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-create-class-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-create-class-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6455,6 +6357,8 @@ "@babel/helper-create-regexp-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-create-regexp-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-create-regexp-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-create-regexp-features-plugin/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6463,6 +6367,8 @@ "@babel/helper-define-polyfill-provider/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-define-polyfill-provider/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-define-polyfill-provider/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-define-polyfill-provider/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6471,6 +6377,8 @@ "@babel/helper-module-transforms/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-module-transforms/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-module-transforms/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-module-transforms/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6479,6 +6387,8 @@ "@babel/helper-remap-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-remap-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-remap-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-remap-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6487,6 +6397,8 @@ "@babel/helper-replace-supers/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/helper-replace-supers/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/helper-replace-supers/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/helper-replace-supers/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6495,6 +6407,8 @@ "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6503,6 +6417,8 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-bugfix-safari-class-field-initializer-scope/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-bugfix-safari-class-field-initializer-scope/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-bugfix-safari-class-field-initializer-scope/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6511,6 +6427,8 @@ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6519,6 +6437,8 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6527,6 +6447,8 @@ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6535,6 +6457,8 @@ "@babel/plugin-proposal-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-proposal-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-proposal-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-proposal-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6543,6 +6467,8 @@ "@babel/plugin-proposal-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-proposal-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-proposal-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-proposal-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6551,6 +6477,8 @@ "@babel/plugin-syntax-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-syntax-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-syntax-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-syntax-decorators/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6559,6 +6487,8 @@ "@babel/plugin-syntax-import-assertions/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-syntax-import-assertions/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-syntax-import-assertions/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-syntax-import-assertions/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6567,6 +6497,8 @@ "@babel/plugin-syntax-import-attributes/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-syntax-import-attributes/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-syntax-import-attributes/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-syntax-import-attributes/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6575,6 +6507,8 @@ "@babel/plugin-syntax-jsx/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-syntax-jsx/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-syntax-jsx/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-syntax-jsx/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6583,6 +6517,8 @@ "@babel/plugin-syntax-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-syntax-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-syntax-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-syntax-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6591,6 +6527,8 @@ "@babel/plugin-syntax-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-syntax-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-syntax-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-syntax-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6599,6 +6537,8 @@ "@babel/plugin-transform-arrow-functions/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-arrow-functions/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-arrow-functions/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-arrow-functions/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6607,6 +6547,8 @@ "@babel/plugin-transform-async-generator-functions/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-async-generator-functions/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-async-generator-functions/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-async-generator-functions/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6615,6 +6557,8 @@ "@babel/plugin-transform-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-async-to-generator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6623,6 +6567,8 @@ "@babel/plugin-transform-block-scoped-functions/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-block-scoped-functions/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-block-scoped-functions/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-block-scoped-functions/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6631,6 +6577,8 @@ "@babel/plugin-transform-block-scoping/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-block-scoping/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-block-scoping/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-block-scoping/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6639,6 +6587,8 @@ "@babel/plugin-transform-class-properties/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-class-properties/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-class-properties/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-class-properties/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6647,6 +6597,8 @@ "@babel/plugin-transform-class-static-block/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-class-static-block/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-class-static-block/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-class-static-block/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6655,6 +6607,8 @@ "@babel/plugin-transform-classes/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-classes/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-classes/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-classes/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6663,6 +6617,8 @@ "@babel/plugin-transform-computed-properties/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-computed-properties/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-computed-properties/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-computed-properties/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6671,6 +6627,8 @@ "@babel/plugin-transform-destructuring/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-destructuring/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-destructuring/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-destructuring/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6679,6 +6637,8 @@ "@babel/plugin-transform-dotall-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-dotall-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-dotall-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-dotall-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6687,6 +6647,8 @@ "@babel/plugin-transform-duplicate-keys/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-duplicate-keys/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-duplicate-keys/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-duplicate-keys/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6695,6 +6657,8 @@ "@babel/plugin-transform-duplicate-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-duplicate-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-duplicate-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-duplicate-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6703,6 +6667,8 @@ "@babel/plugin-transform-dynamic-import/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-dynamic-import/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-dynamic-import/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-dynamic-import/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6711,6 +6677,8 @@ "@babel/plugin-transform-explicit-resource-management/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-explicit-resource-management/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-explicit-resource-management/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-explicit-resource-management/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6719,6 +6687,8 @@ "@babel/plugin-transform-exponentiation-operator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-exponentiation-operator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-exponentiation-operator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-exponentiation-operator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6727,6 +6697,8 @@ "@babel/plugin-transform-export-namespace-from/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-export-namespace-from/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-export-namespace-from/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-export-namespace-from/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6735,6 +6707,8 @@ "@babel/plugin-transform-for-of/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-for-of/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-for-of/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-for-of/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6743,6 +6717,8 @@ "@babel/plugin-transform-function-name/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-function-name/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-function-name/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-function-name/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6751,6 +6727,8 @@ "@babel/plugin-transform-json-strings/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-json-strings/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-json-strings/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-json-strings/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6759,6 +6737,8 @@ "@babel/plugin-transform-literals/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-literals/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-literals/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-literals/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6767,6 +6747,8 @@ "@babel/plugin-transform-logical-assignment-operators/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-logical-assignment-operators/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-logical-assignment-operators/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-logical-assignment-operators/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6775,6 +6757,8 @@ "@babel/plugin-transform-member-expression-literals/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-member-expression-literals/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-member-expression-literals/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-member-expression-literals/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6783,6 +6767,8 @@ "@babel/plugin-transform-modules-amd/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-modules-amd/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-modules-amd/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-modules-amd/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6793,6 +6779,8 @@ "@babel/plugin-transform-modules-commonjs/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-modules-commonjs/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-modules-commonjs/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-modules-commonjs/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6803,6 +6791,8 @@ "@babel/plugin-transform-modules-systemjs/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-modules-systemjs/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-modules-systemjs/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-modules-systemjs/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6811,6 +6801,8 @@ "@babel/plugin-transform-modules-umd/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-modules-umd/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-modules-umd/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-modules-umd/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6821,6 +6813,8 @@ "@babel/plugin-transform-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-named-capturing-groups-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6829,6 +6823,8 @@ "@babel/plugin-transform-new-target/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-new-target/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-new-target/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-new-target/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6837,6 +6833,8 @@ "@babel/plugin-transform-nullish-coalescing-operator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-nullish-coalescing-operator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-nullish-coalescing-operator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-nullish-coalescing-operator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6845,6 +6843,8 @@ "@babel/plugin-transform-numeric-separator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-numeric-separator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-numeric-separator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-numeric-separator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6853,6 +6853,8 @@ "@babel/plugin-transform-object-rest-spread/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-object-rest-spread/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-object-rest-spread/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-object-rest-spread/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6861,6 +6863,8 @@ "@babel/plugin-transform-object-super/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-object-super/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-object-super/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-object-super/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6869,6 +6873,8 @@ "@babel/plugin-transform-optional-catch-binding/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-optional-catch-binding/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-optional-catch-binding/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-optional-catch-binding/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6877,6 +6883,8 @@ "@babel/plugin-transform-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-optional-chaining/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6885,6 +6893,8 @@ "@babel/plugin-transform-parameters/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-parameters/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-parameters/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-parameters/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6893,6 +6903,8 @@ "@babel/plugin-transform-private-methods/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-private-methods/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-private-methods/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-private-methods/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6901,6 +6913,8 @@ "@babel/plugin-transform-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-private-property-in-object/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6909,6 +6923,8 @@ "@babel/plugin-transform-property-literals/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-property-literals/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-property-literals/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-property-literals/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6917,6 +6933,8 @@ "@babel/plugin-transform-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6925,6 +6943,8 @@ "@babel/plugin-transform-regexp-modifiers/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-regexp-modifiers/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-regexp-modifiers/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-regexp-modifiers/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6933,6 +6953,8 @@ "@babel/plugin-transform-reserved-words/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-reserved-words/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-reserved-words/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-reserved-words/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6941,6 +6963,8 @@ "@babel/plugin-transform-runtime/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-runtime/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-runtime/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-runtime/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6949,6 +6973,8 @@ "@babel/plugin-transform-shorthand-properties/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-shorthand-properties/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-shorthand-properties/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-shorthand-properties/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6957,6 +6983,8 @@ "@babel/plugin-transform-spread/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-spread/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-spread/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-spread/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6965,6 +6993,8 @@ "@babel/plugin-transform-sticky-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-sticky-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-sticky-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-sticky-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6973,6 +7003,8 @@ "@babel/plugin-transform-template-literals/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-template-literals/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-template-literals/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-template-literals/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6981,6 +7013,8 @@ "@babel/plugin-transform-typeof-symbol/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-typeof-symbol/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-typeof-symbol/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-typeof-symbol/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6989,6 +7023,8 @@ "@babel/plugin-transform-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -6997,6 +7033,8 @@ "@babel/plugin-transform-unicode-escapes/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-unicode-escapes/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-unicode-escapes/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-unicode-escapes/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7005,6 +7043,8 @@ "@babel/plugin-transform-unicode-property-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-unicode-property-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-unicode-property-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-unicode-property-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7013,6 +7053,8 @@ "@babel/plugin-transform-unicode-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-unicode-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-unicode-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-unicode-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7021,6 +7063,8 @@ "@babel/plugin-transform-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/plugin-transform-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/plugin-transform-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/plugin-transform-unicode-sets-regex/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7029,6 +7073,8 @@ "@babel/preset-env/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/preset-env/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/preset-env/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/preset-env/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7037,6 +7083,8 @@ "@babel/preset-modules/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/preset-modules/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/preset-modules/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/preset-modules/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7045,6 +7093,8 @@ "@babel/preset-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@babel/preset-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@babel/preset-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@babel/preset-typescript/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7053,6 +7103,8 @@ "@nx/js/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "@nx/js/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "@nx/js/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "@nx/js/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7061,6 +7113,8 @@ "babel-plugin-const-enum/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "babel-plugin-const-enum/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "babel-plugin-const-enum/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "babel-plugin-const-enum/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7069,6 +7123,8 @@ "babel-plugin-polyfill-corejs2/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "babel-plugin-polyfill-corejs2/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "babel-plugin-polyfill-corejs2/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "babel-plugin-polyfill-corejs2/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7077,6 +7133,8 @@ "babel-plugin-polyfill-corejs3/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "babel-plugin-polyfill-corejs3/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "babel-plugin-polyfill-corejs3/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "babel-plugin-polyfill-corejs3/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], @@ -7085,6 +7143,8 @@ "babel-plugin-polyfill-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": "dist/cli.js" }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "babel-plugin-polyfill-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], + "babel-plugin-polyfill-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], "babel-plugin-polyfill-regenerator/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], diff --git a/package.json b/package.json index 404560dee..f2ec144a7 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ }, "private": true, "dependencies": { - "@angular/animations": "22.2.3", "@angular/common": "22.2.3", "@angular/compiler": "22.2.3", "@angular/core": "22.2.3", @@ -40,10 +39,8 @@ "@angular/compiler-cli": "22.2.3", "@angular/language-service": "22.2.3", "@angular/material": "22.2.4", - "@angular/pwa": "22.2.3", "@eslint/js": "^9.8.0", "@fontsource-variable/roboto": "^5.3.0", - "@ngneat/spectator": "^22.1.0", "@nx/angular": "23.3.0", "@nx/devkit": "23.3.0", "@nx/eslint": "23.3.0", @@ -63,26 +60,24 @@ "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", "@tailwindcss/postcss": "^4.1.17", + "@types/js-yaml": "^4.0.9", "@types/node": "20.19.9", "@typescript-eslint/utils": "8.65.0", "@vitest/coverage-v8": "^4.0.8", "@vitest/ui": "^4.0.8", - "@xterm/xterm": "^5.5.0", "angular-eslint": "22.6.0", - "autoprefixer": "^10.4.16", "date-fns": "^4.1.0", - "date-fns-tz": "^3.2.0", "eslint": "^9.8.0", "eslint-config-prettier": "^10.0.0", "eslint-plugin-playwright": "^1.6.2", "firacode": "^6.2.0", "git-describe": "^4.1.1", "jiti": "2.4.2", + "js-yaml": "^4.1.1", "jsdom": "~22.1.0", "marked": "^17.0.0", "material-symbols": "^0.39.3", "monaco-editor": "^0.54.0", - "mqtt": "^5.14.1", "ng-mocks": "^14.14.0", "nx": "23.3.0", "postcss-import": "^16.1.1", @@ -91,16 +86,13 @@ "prettier": "^3.6.2", "prettier-plugin-organize-imports": "^4.3.0", "prettier-plugin-tailwindcss": "^0.7.1", - "qr": "^0.5.2", "rxjs": "^7.8.2", - "suneditor": "^2.47.8", "ts-md5": "^2.0.1", "tslib": "^2.3.0", "typescript": "~6.0.3", "typescript-eslint": "8.65.0", "vite": "8.3.5", - "vitest": "^4.0.8", - "yaml": "^2.8.1" + "vitest": "^4.0.8" }, "nx": { "includedScripts": [] diff --git a/public/assets/not-supported.html b/public/assets/not-supported.html deleted file mode 100644 index 0c4d9f4da..000000000 --- a/public/assets/not-supported.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - Browser not supported :O - - - - -
-
- -
-

- Oh snap! We don't support this version of your browser, and - neither should you! -

-

- You are visiting this page because we detected an unsupported - browser. Your browser does not support security features that we - require. We highly recommend that you update your browser. -

-

Recommended browsers:

-
-
-
- -
-
Chrome
- -
-
-
- -
-
Firefox
- -
- -
-
- -
-
Safari
- -
- -
-
- - diff --git a/src/app/app.ts b/src/app/app.ts index 65bf3a3a1..ca547c710 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -18,7 +18,7 @@ import { } from '@angular/router'; import { setupCache, updateAvailable } from './common/application'; import { AsyncHandler } from './common/async-handler.class'; -import { detectIE, log } from './common/general'; +import { log } from './common/general'; import { setNotifyOutlet } from './common/notifications'; import { PlaceSettings, setLoadingMessage, setupPlace } from './common/placeos'; import { initSentry } from './common/sentry'; @@ -185,11 +185,6 @@ export class AppComponent extends AsyncHandler implements OnInit { public async ngOnInit() { setLoadingMessage('Initialising application...'); - /* istanbul ignore if */ - if (detectIE() && detectIE() < 12) { - location.href = `${location.origin}${location.pathname}assets/not-supported.html`; - return; - } this._route.queryParamMap.subscribe((params) => { if (params.has('lang')) { const locale = params.get('lang'); diff --git a/src/app/common/general.ts b/src/app/common/general.ts index 861415f99..44018a457 100644 --- a/src/app/common/general.ts +++ b/src/app/common/general.ts @@ -37,37 +37,6 @@ export function log( } } -/* istanbul ignore next */ -/** - * detect IE - * returns version of IE or false, if browser is not Internet Explorer - */ -export function detectIE(): number { - const ua = window.navigator.userAgent; - - const msie = ua.indexOf('MSIE '); - if (msie > 0) { - // IE 10 or older => return version number - return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); - } - - const trident = ua.indexOf('Trident/'); - if (trident > 0) { - // IE 11 => return version number - const rv = ua.indexOf('rv:'); - return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); - } - - const edge = ua.indexOf('Edge/'); - if (edge > 0) { - // Edge (IE 12+) => return version number - return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); - } - - // other browser - return 0; -} - /** * Get item from the nested object * @param keys List of sub-keys to search for @@ -358,28 +327,6 @@ export function downloadFile(filename: string, contents: string) { document.body.removeChild(element); } -/* istanbul ignore next */ -/** - * Flatten nested array - * @param an_array Array to flatten - */ -export function flatten(an_array: T[]) { - const stack = [...an_array]; - const res = []; - while (stack.length) { - // pop value from stack - const next = stack.pop(); - if (Array.isArray(next)) { - // push back array items, won't modify the original input - stack.push(...next); - } else { - res.push(next); - } - } - // reverse to restore input order - return res.reverse(); -} - export const issueDescription = (hash, date) => ` **Describe the bug** A clear and concise description of what the bug is. diff --git a/src/app/common/timezones.ts b/src/app/common/timezones.ts index 59cb3e378..adc7393bc 100644 --- a/src/app/common/timezones.ts +++ b/src/app/common/timezones.ts @@ -1,1259 +1,3 @@ -import { flatten, unique } from './general'; - -export const TIMEZONES = [ - { - value: 'Dateline Standard Time', - abbr: 'DST', - offset: -12, - isdst: false, - text: '(UTC-12:00) International Date Line West', - utc: ['Etc/GMT+12'], - }, - { - value: 'UTC-11', - abbr: 'U', - offset: -11, - isdst: false, - text: '(UTC-11:00) Coordinated Universal Time-11', - utc: [ - 'Etc/GMT+11', - 'Pacific/Midway', - 'Pacific/Niue', - 'Pacific/Pago_Pago', - ], - }, - { - value: 'Hawaiian Standard Time', - abbr: 'HST', - offset: -10, - isdst: false, - text: '(UTC-10:00) Hawaii', - utc: [ - 'Etc/GMT+10', - 'Pacific/Honolulu', - 'Pacific/Johnston', - 'Pacific/Rarotonga', - 'Pacific/Tahiti', - ], - }, - { - value: 'Alaskan Standard Time', - abbr: 'AKDT', - offset: -8, - isdst: true, - text: '(UTC-09:00) Alaska', - utc: [ - 'America/Anchorage', - 'America/Juneau', - 'America/Nome', - 'America/Sitka', - 'America/Yakutat', - ], - }, - { - value: 'Pacific Standard Time (Mexico)', - abbr: 'PDT', - offset: -7, - isdst: true, - text: '(UTC-08:00) Baja California', - utc: ['America/Santa_Isabel'], - }, - { - value: 'Pacific Daylight Time', - abbr: 'PDT', - offset: -7, - isdst: true, - text: '(UTC-07:00) Pacific Time (US & Canada)', - utc: [ - 'America/Dawson', - 'America/Los_Angeles', - 'America/Tijuana', - 'America/Vancouver', - 'America/Whitehorse', - ], - }, - { - value: 'Pacific Standard Time', - abbr: 'PST', - offset: -8, - isdst: false, - text: '(UTC-08:00) Pacific Time (US & Canada)', - utc: [ - 'America/Dawson', - 'America/Los_Angeles', - 'America/Tijuana', - 'America/Vancouver', - 'America/Whitehorse', - 'PST8PDT', - ], - }, - { - value: 'US Mountain Standard Time', - abbr: 'UMST', - offset: -7, - isdst: false, - text: '(UTC-07:00) Arizona', - utc: [ - 'America/Creston', - 'America/Dawson_Creek', - 'America/Hermosillo', - 'America/Phoenix', - 'Etc/GMT+7', - ], - }, - { - value: 'Mountain Standard Time (Mexico)', - abbr: 'MDT', - offset: -6, - isdst: true, - text: '(UTC-07:00) Chihuahua, La Paz, Mazatlan', - utc: ['America/Chihuahua', 'America/Mazatlan'], - }, - { - value: 'Mountain Standard Time', - abbr: 'MDT', - offset: -6, - isdst: true, - text: '(UTC-07:00) Mountain Time (US & Canada)', - utc: [ - 'America/Boise', - 'America/Cambridge_Bay', - 'America/Denver', - 'America/Edmonton', - 'America/Inuvik', - 'America/Ojinaga', - 'America/Yellowknife', - 'MST7MDT', - ], - }, - { - value: 'Central America Standard Time', - abbr: 'CAST', - offset: -6, - isdst: false, - text: '(UTC-06:00) Central America', - utc: [ - 'America/Belize', - 'America/Costa_Rica', - 'America/El_Salvador', - 'America/Guatemala', - 'America/Managua', - 'America/Tegucigalpa', - 'Etc/GMT+6', - 'Pacific/Galapagos', - ], - }, - { - value: 'Central Standard Time', - abbr: 'CDT', - offset: -5, - isdst: true, - text: '(UTC-06:00) Central Time (US & Canada)', - utc: [ - 'America/Chicago', - 'America/Indiana/Knox', - 'America/Indiana/Tell_City', - 'America/Matamoros', - 'America/Menominee', - 'America/North_Dakota/Beulah', - 'America/North_Dakota/Center', - 'America/North_Dakota/New_Salem', - 'America/Rainy_River', - 'America/Rankin_Inlet', - 'America/Resolute', - 'America/Winnipeg', - 'CST6CDT', - ], - }, - { - value: 'Central Standard Time (Mexico)', - abbr: 'CDT', - offset: -5, - isdst: true, - text: '(UTC-06:00) Guadalajara, Mexico City, Monterrey', - utc: [ - 'America/Bahia_Banderas', - 'America/Cancun', - 'America/Merida', - 'America/Mexico_City', - 'America/Monterrey', - ], - }, - { - value: 'Canada Central Standard Time', - abbr: 'CCST', - offset: -6, - isdst: false, - text: '(UTC-06:00) Saskatchewan', - utc: ['America/Regina', 'America/Swift_Current'], - }, - { - value: 'SA Pacific Standard Time', - abbr: 'SPST', - offset: -5, - isdst: false, - text: '(UTC-05:00) Bogota, Lima, Quito', - utc: [ - 'America/Bogota', - 'America/Cayman', - 'America/Coral_Harbour', - 'America/Eirunepe', - 'America/Guayaquil', - 'America/Jamaica', - 'America/Lima', - 'America/Panama', - 'America/Rio_Branco', - 'Etc/GMT+5', - ], - }, - { - value: 'Eastern Standard Time', - abbr: 'EDT', - offset: -4, - isdst: true, - text: '(UTC-05:00) Eastern Time (US & Canada)', - utc: [ - 'America/Detroit', - 'America/Havana', - 'America/Indiana/Petersburg', - 'America/Indiana/Vincennes', - 'America/Indiana/Winamac', - 'America/Iqaluit', - 'America/Kentucky/Monticello', - 'America/Louisville', - 'America/Montreal', - 'America/Nassau', - 'America/New_York', - 'America/Nipigon', - 'America/Pangnirtung', - 'America/Port-au-Prince', - 'America/Thunder_Bay', - 'America/Toronto', - 'EST5EDT', - ], - }, - { - value: 'US Eastern Standard Time', - abbr: 'UEDT', - offset: -4, - isdst: true, - text: '(UTC-05:00) Indiana (East)', - utc: [ - 'America/Indiana/Marengo', - 'America/Indiana/Vevay', - 'America/Indianapolis', - ], - }, - { - value: 'Venezuela Standard Time', - abbr: 'VST', - offset: -4.5, - isdst: false, - text: '(UTC-04:30) Caracas', - utc: ['America/Caracas'], - }, - { - value: 'Paraguay Standard Time', - abbr: 'PYT', - offset: -4, - isdst: false, - text: '(UTC-04:00) Asuncion', - utc: ['America/Asuncion'], - }, - { - value: 'Atlantic Standard Time', - abbr: 'ADT', - offset: -3, - isdst: true, - text: '(UTC-04:00) Atlantic Time (Canada)', - utc: [ - 'America/Glace_Bay', - 'America/Goose_Bay', - 'America/Halifax', - 'America/Moncton', - 'America/Thule', - 'Atlantic/Bermuda', - ], - }, - { - value: 'Central Brazilian Standard Time', - abbr: 'CBST', - offset: -4, - isdst: false, - text: '(UTC-04:00) Cuiaba', - utc: ['America/Campo_Grande', 'America/Cuiaba'], - }, - { - value: 'SA Western Standard Time', - abbr: 'SWST', - offset: -4, - isdst: false, - text: '(UTC-04:00) Georgetown, La Paz, Manaus, San Juan', - utc: [ - 'America/Anguilla', - 'America/Antigua', - 'America/Aruba', - 'America/Barbados', - 'America/Blanc-Sablon', - 'America/Boa_Vista', - 'America/Curacao', - 'America/Dominica', - 'America/Grand_Turk', - 'America/Grenada', - 'America/Guadeloupe', - 'America/Guyana', - 'America/Kralendijk', - 'America/La_Paz', - 'America/Lower_Princes', - 'America/Manaus', - 'America/Marigot', - 'America/Martinique', - 'America/Montserrat', - 'America/Port_of_Spain', - 'America/Porto_Velho', - 'America/Puerto_Rico', - 'America/Santo_Domingo', - 'America/St_Barthelemy', - 'America/St_Kitts', - 'America/St_Lucia', - 'America/St_Thomas', - 'America/St_Vincent', - 'America/Tortola', - 'Etc/GMT+4', - ], - }, - { - value: 'Pacific SA Standard Time', - abbr: 'PSST', - offset: -4, - isdst: false, - text: '(UTC-04:00) Santiago', - utc: ['America/Santiago', 'Antarctica/Palmer'], - }, - { - value: 'Newfoundland Standard Time', - abbr: 'NDT', - offset: -2.5, - isdst: true, - text: '(UTC-03:30) Newfoundland', - utc: ['America/St_Johns'], - }, - { - value: 'E. South America Standard Time', - abbr: 'ESAST', - offset: -3, - isdst: false, - text: '(UTC-03:00) Brasilia', - utc: ['America/Sao_Paulo'], - }, - { - value: 'Argentina Standard Time', - abbr: 'AST', - offset: -3, - isdst: false, - text: '(UTC-03:00) Buenos Aires', - utc: [ - 'America/Argentina/La_Rioja', - 'America/Argentina/Rio_Gallegos', - 'America/Argentina/Salta', - 'America/Argentina/San_Juan', - 'America/Argentina/San_Luis', - 'America/Argentina/Tucuman', - 'America/Argentina/Ushuaia', - 'America/Buenos_Aires', - 'America/Catamarca', - 'America/Cordoba', - 'America/Jujuy', - 'America/Mendoza', - ], - }, - { - value: 'SA Eastern Standard Time', - abbr: 'SEST', - offset: -3, - isdst: false, - text: '(UTC-03:00) Cayenne, Fortaleza', - utc: [ - 'America/Araguaina', - 'America/Belem', - 'America/Cayenne', - 'America/Fortaleza', - 'America/Maceio', - 'America/Paramaribo', - 'America/Recife', - 'America/Santarem', - 'Antarctica/Rothera', - 'Atlantic/Stanley', - 'Etc/GMT+3', - ], - }, - { - value: 'Greenland Standard Time', - abbr: 'GDT', - offset: -3, - isdst: true, - text: '(UTC-03:00) Greenland', - utc: ['America/Godthab'], - }, - { - value: 'Montevideo Standard Time', - abbr: 'MST', - offset: -3, - isdst: false, - text: '(UTC-03:00) Montevideo', - utc: ['America/Montevideo'], - }, - { - value: 'Bahia Standard Time', - abbr: 'BST', - offset: -3, - isdst: false, - text: '(UTC-03:00) Salvador', - utc: ['America/Bahia'], - }, - { - value: 'UTC-02', - abbr: 'U', - offset: -2, - isdst: false, - text: '(UTC-02:00) Coordinated Universal Time-02', - utc: ['America/Noronha', 'Atlantic/South_Georgia', 'Etc/GMT+2'], - }, - { - value: 'Mid-Atlantic Standard Time', - abbr: 'MDT', - offset: -1, - isdst: true, - text: '(UTC-02:00) Mid-Atlantic - Old', - utc: [], - }, - { - value: 'Azores Standard Time', - abbr: 'ADT', - offset: 0, - isdst: true, - text: '(UTC-01:00) Azores', - utc: ['America/Scoresbysund', 'Atlantic/Azores'], - }, - { - value: 'Cape Verde Standard Time', - abbr: 'CVST', - offset: -1, - isdst: false, - text: '(UTC-01:00) Cape Verde Is.', - utc: ['Atlantic/Cape_Verde', 'Etc/GMT+1'], - }, - { - value: 'Morocco Standard Time', - abbr: 'MDT', - offset: 1, - isdst: true, - text: '(UTC) Casablanca', - utc: ['Africa/Casablanca', 'Africa/El_Aaiun'], - }, - { - value: 'UTC', - abbr: 'UTC', - offset: 0, - isdst: false, - text: '(UTC) Coordinated Universal Time', - utc: ['America/Danmarkshavn', 'Etc/GMT'], - }, - { - value: 'GMT Standard Time', - abbr: 'GMT', - offset: 0, - isdst: false, - text: '(UTC) Edinburgh, London', - utc: [ - 'Europe/Isle_of_Man', - 'Europe/Guernsey', - 'Europe/Jersey', - 'Europe/London', - ], - }, - { - value: 'British Summer Time', - abbr: 'BST', - offset: 1, - isdst: true, - text: '(UTC+01:00) Edinburgh, London', - utc: [ - 'Europe/Isle_of_Man', - 'Europe/Guernsey', - 'Europe/Jersey', - 'Europe/London', - ], - }, - { - value: 'GMT Standard Time', - abbr: 'GDT', - offset: 1, - isdst: true, - text: '(UTC) Dublin, Lisbon', - utc: [ - 'Atlantic/Canary', - 'Atlantic/Faeroe', - 'Atlantic/Madeira', - 'Europe/Dublin', - 'Europe/Lisbon', - ], - }, - { - value: 'Greenwich Standard Time', - abbr: 'GST', - offset: 0, - isdst: false, - text: '(UTC) Monrovia, Reykjavik', - utc: [ - 'Africa/Abidjan', - 'Africa/Accra', - 'Africa/Bamako', - 'Africa/Banjul', - 'Africa/Bissau', - 'Africa/Conakry', - 'Africa/Dakar', - 'Africa/Freetown', - 'Africa/Lome', - 'Africa/Monrovia', - 'Africa/Nouakchott', - 'Africa/Ouagadougou', - 'Africa/Sao_Tome', - 'Atlantic/Reykjavik', - 'Atlantic/St_Helena', - ], - }, - { - value: 'W. Europe Standard Time', - abbr: 'WEDT', - offset: 2, - isdst: true, - text: '(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna', - utc: [ - 'Arctic/Longyearbyen', - 'Europe/Amsterdam', - 'Europe/Andorra', - 'Europe/Berlin', - 'Europe/Busingen', - 'Europe/Gibraltar', - 'Europe/Luxembourg', - 'Europe/Malta', - 'Europe/Monaco', - 'Europe/Oslo', - 'Europe/Rome', - 'Europe/San_Marino', - 'Europe/Stockholm', - 'Europe/Vaduz', - 'Europe/Vatican', - 'Europe/Vienna', - 'Europe/Zurich', - ], - }, - { - value: 'Central Europe Standard Time', - abbr: 'CEDT', - offset: 2, - isdst: true, - text: '(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague', - utc: [ - 'Europe/Belgrade', - 'Europe/Bratislava', - 'Europe/Budapest', - 'Europe/Ljubljana', - 'Europe/Podgorica', - 'Europe/Prague', - 'Europe/Tirane', - ], - }, - { - value: 'Romance Standard Time', - abbr: 'RDT', - offset: 2, - isdst: true, - text: '(UTC+01:00) Brussels, Copenhagen, Madrid, Paris', - utc: [ - 'Africa/Ceuta', - 'Europe/Brussels', - 'Europe/Copenhagen', - 'Europe/Madrid', - 'Europe/Paris', - ], - }, - { - value: 'Central European Standard Time', - abbr: 'CEDT', - offset: 2, - isdst: true, - text: '(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb', - utc: [ - 'Europe/Sarajevo', - 'Europe/Skopje', - 'Europe/Warsaw', - 'Europe/Zagreb', - ], - }, - { - value: 'W. Central Africa Standard Time', - abbr: 'WCAST', - offset: 1, - isdst: false, - text: '(UTC+01:00) West Central Africa', - utc: [ - 'Africa/Algiers', - 'Africa/Bangui', - 'Africa/Brazzaville', - 'Africa/Douala', - 'Africa/Kinshasa', - 'Africa/Lagos', - 'Africa/Libreville', - 'Africa/Luanda', - 'Africa/Malabo', - 'Africa/Ndjamena', - 'Africa/Niamey', - 'Africa/Porto-Novo', - 'Africa/Tunis', - 'Etc/GMT-1', - ], - }, - { - value: 'Namibia Standard Time', - abbr: 'NST', - offset: 1, - isdst: false, - text: '(UTC+01:00) Windhoek', - utc: ['Africa/Windhoek'], - }, - { - value: 'GTB Standard Time', - abbr: 'GDT', - offset: 3, - isdst: true, - text: '(UTC+02:00) Athens, Bucharest', - utc: [ - 'Asia/Nicosia', - 'Europe/Athens', - 'Europe/Bucharest', - 'Europe/Chisinau', - ], - }, - { - value: 'Middle East Standard Time', - abbr: 'MEDT', - offset: 3, - isdst: true, - text: '(UTC+02:00) Beirut', - utc: ['Asia/Beirut'], - }, - { - value: 'Egypt Standard Time', - abbr: 'EST', - offset: 2, - isdst: false, - text: '(UTC+02:00) Cairo', - utc: ['Africa/Cairo'], - }, - { - value: 'Syria Standard Time', - abbr: 'SDT', - offset: 3, - isdst: true, - text: '(UTC+02:00) Damascus', - utc: ['Asia/Damascus'], - }, - { - value: 'E. Europe Standard Time', - abbr: 'EEDT', - offset: 3, - isdst: true, - text: '(UTC+02:00) E. Europe', - utc: [ - 'Asia/Nicosia', - 'Europe/Athens', - 'Europe/Bucharest', - 'Europe/Chisinau', - 'Europe/Helsinki', - 'Europe/Kiev', - 'Europe/Mariehamn', - 'Europe/Nicosia', - 'Europe/Riga', - 'Europe/Sofia', - 'Europe/Tallinn', - 'Europe/Uzhgorod', - 'Europe/Vilnius', - 'Europe/Zaporozhye', - ], - }, - { - value: 'South Africa Standard Time', - abbr: 'SAST', - offset: 2, - isdst: false, - text: '(UTC+02:00) Harare, Pretoria', - utc: [ - 'Africa/Blantyre', - 'Africa/Bujumbura', - 'Africa/Gaborone', - 'Africa/Harare', - 'Africa/Johannesburg', - 'Africa/Kigali', - 'Africa/Lubumbashi', - 'Africa/Lusaka', - 'Africa/Maputo', - 'Africa/Maseru', - 'Africa/Mbabane', - 'Etc/GMT-2', - ], - }, - { - value: 'FLE Standard Time', - abbr: 'FDT', - offset: 3, - isdst: true, - text: '(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius', - utc: [ - 'Europe/Helsinki', - 'Europe/Kiev', - 'Europe/Mariehamn', - 'Europe/Riga', - 'Europe/Sofia', - 'Europe/Tallinn', - 'Europe/Uzhgorod', - 'Europe/Vilnius', - 'Europe/Zaporozhye', - ], - }, - { - value: 'Turkey Standard Time', - abbr: 'TDT', - offset: 3, - isdst: false, - text: '(UTC+03:00) Istanbul', - utc: ['Europe/Istanbul'], - }, - { - value: 'Israel Standard Time', - abbr: 'JDT', - offset: 3, - isdst: true, - text: '(UTC+02:00) Jerusalem', - utc: ['Asia/Jerusalem'], - }, - { - value: 'Libya Standard Time', - abbr: 'LST', - offset: 2, - isdst: false, - text: '(UTC+02:00) Tripoli', - utc: ['Africa/Tripoli'], - }, - { - value: 'Jordan Standard Time', - abbr: 'JST', - offset: 3, - isdst: false, - text: '(UTC+03:00) Amman', - utc: ['Asia/Amman'], - }, - { - value: 'Arabic Standard Time', - abbr: 'AST', - offset: 3, - isdst: false, - text: '(UTC+03:00) Baghdad', - utc: ['Asia/Baghdad'], - }, - { - value: 'Kaliningrad Standard Time', - abbr: 'KST', - offset: 3, - isdst: false, - text: '(UTC+02:00) Kaliningrad', - utc: ['Europe/Kaliningrad'], - }, - { - value: 'Arab Standard Time', - abbr: 'AST', - offset: 3, - isdst: false, - text: '(UTC+03:00) Kuwait, Riyadh', - utc: [ - 'Asia/Aden', - 'Asia/Bahrain', - 'Asia/Kuwait', - 'Asia/Qatar', - 'Asia/Riyadh', - ], - }, - { - value: 'E. Africa Standard Time', - abbr: 'EAST', - offset: 3, - isdst: false, - text: '(UTC+03:00) Nairobi', - utc: [ - 'Africa/Addis_Ababa', - 'Africa/Asmera', - 'Africa/Dar_es_Salaam', - 'Africa/Djibouti', - 'Africa/Juba', - 'Africa/Kampala', - 'Africa/Khartoum', - 'Africa/Mogadishu', - 'Africa/Nairobi', - 'Antarctica/Syowa', - 'Etc/GMT-3', - 'Indian/Antananarivo', - 'Indian/Comoro', - 'Indian/Mayotte', - ], - }, - { - value: 'Moscow Standard Time', - abbr: 'MSK', - offset: 3, - isdst: false, - text: '(UTC+03:00) Moscow, St. Petersburg, Volgograd, Minsk', - utc: [ - 'Europe/Kirov', - 'Europe/Moscow', - 'Europe/Simferopol', - 'Europe/Volgograd', - 'Europe/Minsk', - ], - }, - { - value: 'Samara Time', - abbr: 'SAMT', - offset: 4, - isdst: false, - text: '(UTC+04:00) Samara, Ulyanovsk, Saratov', - utc: ['Europe/Astrakhan', 'Europe/Samara', 'Europe/Ulyanovsk'], - }, - { - value: 'Iran Standard Time', - abbr: 'IDT', - offset: 4.5, - isdst: true, - text: '(UTC+03:30) Tehran', - utc: ['Asia/Tehran'], - }, - { - value: 'Arabian Standard Time', - abbr: 'AST', - offset: 4, - isdst: false, - text: '(UTC+04:00) Abu Dhabi, Muscat', - utc: ['Asia/Dubai', 'Asia/Muscat', 'Etc/GMT-4'], - }, - { - value: 'Azerbaijan Standard Time', - abbr: 'ADT', - offset: 5, - isdst: true, - text: '(UTC+04:00) Baku', - utc: ['Asia/Baku'], - }, - { - value: 'Mauritius Standard Time', - abbr: 'MST', - offset: 4, - isdst: false, - text: '(UTC+04:00) Port Louis', - utc: ['Indian/Mahe', 'Indian/Mauritius', 'Indian/Reunion'], - }, - { - value: 'Georgian Standard Time', - abbr: 'GET', - offset: 4, - isdst: false, - text: '(UTC+04:00) Tbilisi', - utc: ['Asia/Tbilisi'], - }, - { - value: 'Caucasus Standard Time', - abbr: 'CST', - offset: 4, - isdst: false, - text: '(UTC+04:00) Yerevan', - utc: ['Asia/Yerevan'], - }, - { - value: 'Afghanistan Standard Time', - abbr: 'AST', - offset: 4.5, - isdst: false, - text: '(UTC+04:30) Kabul', - utc: ['Asia/Kabul'], - }, - { - value: 'West Asia Standard Time', - abbr: 'WAST', - offset: 5, - isdst: false, - text: '(UTC+05:00) Ashgabat, Tashkent', - utc: [ - 'Antarctica/Mawson', - 'Asia/Aqtau', - 'Asia/Aqtobe', - 'Asia/Ashgabat', - 'Asia/Dushanbe', - 'Asia/Oral', - 'Asia/Samarkand', - 'Asia/Tashkent', - 'Etc/GMT-5', - 'Indian/Kerguelen', - 'Indian/Maldives', - ], - }, - { - value: 'Yekaterinburg Time', - abbr: 'YEKT', - offset: 5, - isdst: false, - text: '(UTC+05:00) Yekaterinburg', - utc: ['Asia/Yekaterinburg'], - }, - { - value: 'Pakistan Standard Time', - abbr: 'PKT', - offset: 5, - isdst: false, - text: '(UTC+05:00) Islamabad, Karachi', - utc: ['Asia/Karachi'], - }, - { - value: 'India Standard Time', - abbr: 'IST', - offset: 5.5, - isdst: false, - text: '(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi', - utc: ['Asia/Kolkata'], - }, - { - value: 'Sri Lanka Standard Time', - abbr: 'SLST', - offset: 5.5, - isdst: false, - text: '(UTC+05:30) Sri Jayawardenepura', - utc: ['Asia/Colombo'], - }, - { - value: 'Nepal Standard Time', - abbr: 'NST', - offset: 5.75, - isdst: false, - text: '(UTC+05:45) Kathmandu', - utc: ['Asia/Kathmandu'], - }, - { - value: 'Central Asia Standard Time', - abbr: 'CAST', - offset: 6, - isdst: false, - text: '(UTC+06:00) Nur-Sultan (Astana)', - utc: [ - 'Antarctica/Vostok', - 'Asia/Almaty', - 'Asia/Bishkek', - 'Asia/Qyzylorda', - 'Asia/Urumqi', - 'Etc/GMT-6', - 'Indian/Chagos', - ], - }, - { - value: 'Bangladesh Standard Time', - abbr: 'BST', - offset: 6, - isdst: false, - text: '(UTC+06:00) Dhaka', - utc: ['Asia/Dhaka', 'Asia/Thimphu'], - }, - { - value: 'Myanmar Standard Time', - abbr: 'MST', - offset: 6.5, - isdst: false, - text: '(UTC+06:30) Yangon (Rangoon)', - utc: ['Asia/Rangoon', 'Indian/Cocos'], - }, - { - value: 'SE Asia Standard Time', - abbr: 'SAST', - offset: 7, - isdst: false, - text: '(UTC+07:00) Bangkok, Hanoi, Jakarta', - utc: [ - 'Antarctica/Davis', - 'Asia/Bangkok', - 'Asia/Hovd', - 'Asia/Jakarta', - 'Asia/Phnom_Penh', - 'Asia/Pontianak', - 'Asia/Saigon', - 'Asia/Vientiane', - 'Etc/GMT-7', - 'Indian/Christmas', - ], - }, - { - value: 'N. Central Asia Standard Time', - abbr: 'NCAST', - offset: 7, - isdst: false, - text: '(UTC+07:00) Novosibirsk', - utc: ['Asia/Novokuznetsk', 'Asia/Novosibirsk', 'Asia/Omsk'], - }, - { - value: 'China Standard Time', - abbr: 'CST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi', - utc: ['Asia/Hong_Kong', 'Asia/Macau', 'Asia/Shanghai'], - }, - { - value: 'North Asia Standard Time', - abbr: 'NAST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Krasnoyarsk', - utc: ['Asia/Krasnoyarsk'], - }, - { - value: 'Singapore Standard Time', - abbr: 'MPST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Kuala Lumpur, Singapore', - utc: [ - 'Asia/Brunei', - 'Asia/Kuala_Lumpur', - 'Asia/Kuching', - 'Asia/Makassar', - 'Asia/Manila', - 'Asia/Singapore', - 'Etc/GMT-8', - ], - }, - { - value: 'W. Australia Standard Time', - abbr: 'WAST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Perth', - utc: ['Antarctica/Casey', 'Australia/Perth'], - }, - { - value: 'Taipei Standard Time', - abbr: 'TST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Taipei', - utc: ['Asia/Taipei'], - }, - { - value: 'Ulaanbaatar Standard Time', - abbr: 'UST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Ulaanbaatar', - utc: ['Asia/Choibalsan', 'Asia/Ulaanbaatar'], - }, - { - value: 'North Asia East Standard Time', - abbr: 'NAEST', - offset: 8, - isdst: false, - text: '(UTC+08:00) Irkutsk', - utc: ['Asia/Irkutsk'], - }, - { - value: 'Japan Standard Time', - abbr: 'JST', - offset: 9, - isdst: false, - text: '(UTC+09:00) Osaka, Sapporo, Tokyo', - utc: [ - 'Asia/Dili', - 'Asia/Jayapura', - 'Asia/Tokyo', - 'Etc/GMT-9', - 'Pacific/Palau', - ], - }, - { - value: 'Korea Standard Time', - abbr: 'KST', - offset: 9, - isdst: false, - text: '(UTC+09:00) Seoul', - utc: ['Asia/Pyongyang', 'Asia/Seoul'], - }, - { - value: 'Cen. Australia Standard Time', - abbr: 'CAST', - offset: 9.5, - isdst: false, - text: '(UTC+09:30) Adelaide', - utc: ['Australia/Adelaide', 'Australia/Broken_Hill'], - }, - { - value: 'AUS Central Standard Time', - abbr: 'ACST', - offset: 9.5, - isdst: false, - text: '(UTC+09:30) Darwin', - utc: ['Australia/Darwin'], - }, - { - value: 'E. Australia Standard Time', - abbr: 'EAST', - offset: 10, - isdst: false, - text: '(UTC+10:00) Brisbane', - utc: ['Australia/Brisbane', 'Australia/Lindeman'], - }, - { - value: 'AUS Eastern Standard Time', - abbr: 'AEST', - offset: 10, - isdst: false, - text: '(UTC+10:00) Canberra, Melbourne, Sydney', - utc: ['Australia/Melbourne', 'Australia/Sydney'], - }, - { - value: 'West Pacific Standard Time', - abbr: 'WPST', - offset: 10, - isdst: false, - text: '(UTC+10:00) Guam, Port Moresby', - utc: [ - 'Antarctica/DumontDUrville', - 'Etc/GMT-10', - 'Pacific/Guam', - 'Pacific/Port_Moresby', - 'Pacific/Saipan', - 'Pacific/Truk', - ], - }, - { - value: 'Tasmania Standard Time', - abbr: 'TST', - offset: 10, - isdst: false, - text: '(UTC+10:00) Hobart', - utc: ['Australia/Currie', 'Australia/Hobart'], - }, - { - value: 'Yakutsk Standard Time', - abbr: 'YST', - offset: 9, - isdst: false, - text: '(UTC+09:00) Yakutsk', - utc: ['Asia/Chita', 'Asia/Khandyga', 'Asia/Yakutsk'], - }, - { - value: 'Central Pacific Standard Time', - abbr: 'CPST', - offset: 11, - isdst: false, - text: '(UTC+11:00) Solomon Is., New Caledonia', - utc: [ - 'Antarctica/Macquarie', - 'Etc/GMT-11', - 'Pacific/Efate', - 'Pacific/Guadalcanal', - 'Pacific/Kosrae', - 'Pacific/Noumea', - 'Pacific/Ponape', - ], - }, - { - value: 'Vladivostok Standard Time', - abbr: 'VST', - offset: 11, - isdst: false, - text: '(UTC+11:00) Vladivostok', - utc: ['Asia/Sakhalin', 'Asia/Ust-Nera', 'Asia/Vladivostok'], - }, - { - value: 'New Zealand Standard Time', - abbr: 'NZST', - offset: 12, - isdst: false, - text: '(UTC+12:00) Auckland, Wellington', - utc: ['Antarctica/McMurdo', 'Pacific/Auckland'], - }, - { - value: 'UTC+12', - abbr: 'U', - offset: 12, - isdst: false, - text: '(UTC+12:00) Coordinated Universal Time+12', - utc: [ - 'Etc/GMT-12', - 'Pacific/Funafuti', - 'Pacific/Kwajalein', - 'Pacific/Majuro', - 'Pacific/Nauru', - 'Pacific/Tarawa', - 'Pacific/Wake', - 'Pacific/Wallis', - ], - }, - { - value: 'Fiji Standard Time', - abbr: 'FST', - offset: 12, - isdst: false, - text: '(UTC+12:00) Fiji', - utc: ['Pacific/Fiji'], - }, - { - value: 'Magadan Standard Time', - abbr: 'MST', - offset: 12, - isdst: false, - text: '(UTC+12:00) Magadan', - utc: [ - 'Asia/Anadyr', - 'Asia/Kamchatka', - 'Asia/Magadan', - 'Asia/Srednekolymsk', - ], - }, - { - value: 'Kamchatka Standard Time', - abbr: 'KDT', - offset: 13, - isdst: true, - text: '(UTC+12:00) Petropavlovsk-Kamchatsky - Old', - utc: ['Asia/Kamchatka'], - }, - { - value: 'Tonga Standard Time', - abbr: 'TST', - offset: 13, - isdst: false, - text: "(UTC+13:00) Nuku'alofa", - utc: [ - 'Etc/GMT-13', - 'Pacific/Enderbury', - 'Pacific/Fakaofo', - 'Pacific/Tongatapu', - ], - }, - { - value: 'Samoa Standard Time', - abbr: 'SST', - offset: 13, - isdst: false, - text: '(UTC+13:00) Samoa', - utc: ['Pacific/Apia'], - }, -]; - -export const TIMEZONES_IANA = unique( - flatten(TIMEZONES.map((_) => _.utc)), -).sort(); +/** Sorted IANA timezone names that the browser supports. Used for timezone autocomplete. */ +export const TIMEZONES_IANA: readonly string[] = + Intl.supportedValuesOf('timeZone'); diff --git a/src/app/systems/systems.utilities.ts b/src/app/systems/systems.utilities.ts index 7e5726e45..b8c497b14 100644 --- a/src/app/systems/systems.utilities.ts +++ b/src/app/systems/systems.utilities.ts @@ -1,15 +1,15 @@ import { AbstractControl } from '@angular/forms'; import { PlaceSystem, PlaceZone } from '@placeos/ts-client'; -import * as yaml from 'js-yaml'; import { email, required, SchemaFn, validate } from '@angular/forms/signals'; +import * as yaml from 'js-yaml'; import { isValidUrl } from '../common/validation'; export function validateYAML(control: AbstractControl) { const value = control.value || ''; let message = ''; try { - yaml.load(value, { strict: true }); + yaml.load(value); } catch (e) { // console.error(e); message = e.message; diff --git a/src/app/ui/custom-fields/rich-text-input.component.ts b/src/app/ui/custom-fields/rich-text-input.component.ts deleted file mode 100644 index 021a6ed3c..000000000 --- a/src/app/ui/custom-fields/rich-text-input.component.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { - AfterViewInit, - Component, - ElementRef, - forwardRef, - input, - OnChanges, - signal, - SimpleChanges, - viewChild, -} from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { apiKey, token } from '@placeos/ts-client'; - -import SunEditor from 'suneditor'; -import { font, fontSize, formatBlock, link, list } from 'suneditor/src/plugins'; -import { AsyncHandler } from '../../common/async-handler.class'; -import { escapeHtml } from '../../common/general'; -import { uploadFile } from '../../common/uploads'; - -@Component({ - selector: 'rich-text-input', - template: ` -
-
-
- `, - styles: [ - ` - :host { - display: block; - position: relative; - min-height: 8rem; - margin-bottom: 4rem; - z-index: 10; - } - `, - ], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - /* istanbul ignore next */ - useExisting: forwardRef(() => RichTextInputComponent), - multi: true, - }, - ], -}) -export class RichTextInputComponent - extends AsyncHandler - implements ControlValueAccessor, OnChanges, AfterViewInit -{ - public readonly placeholder = input(''); - public readonly readonly = input(false); - public readonly images_allowed = input(false); - public readonly disabled = signal(false); - - private readonly _container_el = - viewChild>('container'); - private readonly _editor_el = - viewChild>('editor'); - - private _editor: ReturnType; - private _onChange: (_: string) => void; - private _onTouch: (_: string) => void; - - public readonly registerOnChange = (fn: (_: string) => void) => - (this._onChange = fn); - public readonly registerOnTouched = (fn: (_: string) => void) => - (this._onTouch = fn); - - public ngOnChanges(changes: SimpleChanges) { - if (changes.images_allowed) { - this.timeout('init', () => this._initialiseEditor()); - } - } - - public ngAfterViewInit() { - this.timeout('init', () => this._initialiseEditor()); - } - - public override ngOnDestroy() { - this._editor?.destroy(); - delete this._editor; - super.ngOnDestroy(); - } - - /** - * Update the form field value - * @param new_value New value to set on the form field - */ - public setValue(new_value: string): void { - if (this.disabled()) return; - /* istanbul ignore else */ - if (this._onChange) this._onChange(new_value); - this._onTouch?.(new_value); - } - - /** - * Update local value when form control value is changed - * @param value The new value for the component - */ - public writeValue(value: string) { - this.timeout('write', () => { - if (this._editor) { - this._setAuth(); - setTimeout(() => { - this._editor?.setContents(value); - }, 100); - } else this.timeout('write', () => this.writeValue(value)); - }); - } - - private _initialiseEditor() { - const _editor_el = this._editor_el()?.nativeElement; - const _container_el = this._container_el()?.nativeElement; - if (!_editor_el || !_container_el) { - return this.timeout('init', () => this._initialiseEditor()); - } - const buttons = [ - ['font'], - ['fontSize'], - ['formatBlock'], - ['bold', 'underline', 'italic'], - ['align', 'list'], - ['link'], - ]; - if (this.images_allowed()) { - buttons.push(['embedImage', 'embedAttachment']); - } - if (this._editor) { - this.unsub('changes'); - this._editor.destroy(); - _editor_el.innerHTML = ''; - delete this._editor; - } - const embedImagePlugin = { - name: 'embedImage', - display: 'command', - title: 'Insert Image', - innerHTML: - '
image
', - add: (_core: unknown, _targetElement: unknown) => { - // Plugin initialization if needed - }, - action: () => this._embedImage(), - }; - - const embedAttachmentPlugin = { - name: 'embedAttachment', - display: 'command', - title: 'Insert Attachment', - innerHTML: - '
attachment
', - add: (_core: unknown, _targetElement: unknown) => { - // Plugin initialization if needed - }, - action: () => this._embedAttachment(), - }; - const box = - this._container_el()?.nativeElement.getBoundingClientRect() || { - top: 0, - left: 0, - width: 0, - height: 0, - }; - this._editor = SunEditor.create(_editor_el, { - placeholder: this.placeholder(), - height: `${box.height}`, - plugins: [ - font, - fontSize, - formatBlock, - list, - link, - embedImagePlugin, - embedAttachmentPlugin, - ], - buttonList: buttons, - }); - this._editor.readOnly(this.readonly() || this.disabled()); - this._editor.onChange = (c) => this.setValue(c); - } - - public setDisabledState(disabled: boolean) { - this.disabled.set(disabled); - this._editor?.readOnly(this.readonly() || disabled); - } - - private _embedImage() { - if (!this._editor || this.disabled()) return; - // Create a File input element - const file_input = document.createElement('input'); - file_input.setAttribute('type', 'file'); - file_input.setAttribute('accept', 'image/*'); - file_input.click(); - - file_input.onchange = () => { - const file = file_input.files[0]; - uploadFile(file, true).subscribe((upload) => { - if (!upload.id) return; - const link = `/api/engine/v2/uploads/${encodeURIComponent(upload.id)}/url`; - this._setAuth(); - setTimeout(() => { - this._editor?.insertHTML( - `${escapeHtml(file.name)}`, - ); - }, 100); - }); - }; - } - - private _embedAttachment() { - if (!this._editor || this.disabled()) return; - // Create a File input element - const file_input = document.createElement('input'); - file_input.setAttribute('type', 'file'); - file_input.click(); - - file_input.onchange = () => { - const file = file_input.files[0]; - uploadFile(file, true).subscribe((upload) => { - if (!upload.id) return; - const link = `/api/engine/v2/uploads/${encodeURIComponent(upload.id)}/url`; - const is_image = file.type.startsWith('image/'); - this._setAuth(); - setTimeout(() => { - if (is_image) { - this._editor?.insertHTML( - `${escapeHtml(file.name)}`, - ); - } else { - this._editor?.insertHTML( - `${escapeHtml(file.name)}`, - ); - } - }, 100); - }); - }; - } - - private _setAuth() { - const tkn = token(); - document.cookie = `${ - tkn === 'x-api-key' - ? 'api-key=' + encodeURIComponent(apiKey()) - : 'bearer_token=' + encodeURIComponent(tkn) - };max-age=30;path=/api/engine/v2/uploads;samesite=strict;${ - location.protocol === 'https:' ? 'secure;' : '' - }`; - } -} diff --git a/src/app/ui/forms/settings-form.component.ts b/src/app/ui/forms/settings-form.component.ts index c6569b2b9..dd5a77786 100644 --- a/src/app/ui/forms/settings-form.component.ts +++ b/src/app/ui/forms/settings-form.component.ts @@ -681,7 +681,7 @@ export class SettingsFormComponent extends AsyncHandler implements OnInit { .concat(local_settings) .reduce((m, i) => ({ ...m, ...i }), {}); const settings_string = Object.keys(merged_settings).length - ? yaml.dump(merged_settings, { strict: true }) + ? yaml.dump(merged_settings) : ''; this.merge_decorations.set( this._decorationForSettings( diff --git a/src/app/zones/zone-form.component.ts b/src/app/zones/zone-form.component.ts index f1a14116d..69802e81a 100644 --- a/src/app/zones/zone-form.component.ts +++ b/src/app/zones/zone-form.component.ts @@ -356,7 +356,7 @@ export class ZoneFormComponent extends AsyncHandler implements OnInit { public readonly formModel = signal(generateZoneFormModel(this._data.item)); public readonly form = form(this.formModel, applyZoneFormSchema); - public readonly timezones = TIMEZONES_IANA as string[]; + public readonly timezones = TIMEZONES_IANA; public readonly timezone = computed( () => `${this.formModel().timezone || ''}`, ); diff --git a/src/tests/common/general.spec.ts b/src/tests/common/general.spec.ts index 536b9037f..f04512c76 100644 --- a/src/tests/common/general.spec.ts +++ b/src/tests/common/general.spec.ts @@ -2,11 +2,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { copyToClipboard, csvToJson, - detectIE, downloadFile, escapeHtml, eventToPoint, - flatten, getItemWithKeys, issueDescription, jsonToCsv, @@ -87,45 +85,6 @@ describe('general.ts utilities', () => { }); }); - describe('detectIE', () => { - const original_user_agent = navigator.userAgent; - - afterEach(() => { - Object.defineProperty(navigator, 'userAgent', { - value: original_user_agent, - writable: true, - }); - }); - - it('should return 0 for non-IE browsers', () => { - expect(detectIE()).toBe(0); - }); - - it('should detect MSIE version', () => { - Object.defineProperty(navigator, 'userAgent', { - value: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', - writable: true, - }); - expect(detectIE()).toBe(10); - }); - - it('should detect Trident (IE 11)', () => { - Object.defineProperty(navigator, 'userAgent', { - value: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko', - writable: true, - }); - expect(detectIE()).toBe(11); - }); - - it('should detect Edge', () => { - Object.defineProperty(navigator, 'userAgent', { - value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Edge/12.0', - writable: true, - }); - expect(detectIE()).toBe(12); - }); - }); - describe('getItemWithKeys', () => { it('should get value from nested object', () => { const obj = { a: { b: { c: 'value' } } }; @@ -517,36 +476,6 @@ describe('general.ts utilities', () => { }); }); - describe('flatten', () => { - it('should flatten nested arrays', () => { - const arr = [1, [2, 3], [4, [5, 6]]]; - expect(flatten(arr)).toEqual([1, 2, 3, 4, 5, 6]); - }); - - it('should handle empty array', () => { - expect(flatten([])).toEqual([]); - }); - - it('should handle already flat array', () => { - expect(flatten([1, 2, 3])).toEqual([1, 2, 3]); - }); - - it('should handle deeply nested arrays', () => { - const arr = [[[[1]]]]; - expect(flatten(arr)).toEqual([1]); - }); - - it('should preserve order', () => { - const arr = [1, [2, 3], 4]; - expect(flatten(arr)).toEqual([1, 2, 3, 4]); - }); - - it('should handle mixed types', () => { - const arr = [1, ['a', 'b'], [true, false]]; - expect(flatten(arr)).toEqual([1, 'a', 'b', true, false]); - }); - }); - describe('padLength', () => { it('should pad number to specified length', () => { expect(padLength(5, 3)).toBe('005'); diff --git a/src/tests/common/timezones.spec.ts b/src/tests/common/timezones.spec.ts index f164617d6..97a2edc8e 100644 --- a/src/tests/common/timezones.spec.ts +++ b/src/tests/common/timezones.spec.ts @@ -1,215 +1,10 @@ -import { describe, it, expect } from 'vitest'; -import { TIMEZONES, TIMEZONES_IANA } from '../../app/common/timezones'; - -describe('timezones.ts', () => { - describe('TIMEZONES', () => { - it('should be a non-empty array', () => { - expect(Array.isArray(TIMEZONES)).toBe(true); - expect(TIMEZONES.length).toBeGreaterThan(0); - }); - - it('should have over 80 timezone entries', () => { - expect(TIMEZONES.length).toBeGreaterThan(80); - }); - - it('should have required properties on each timezone', () => { - for (const tz of TIMEZONES) { - expect(tz).toHaveProperty('value'); - expect(tz).toHaveProperty('abbr'); - expect(tz).toHaveProperty('offset'); - expect(tz).toHaveProperty('isdst'); - expect(tz).toHaveProperty('text'); - expect(tz).toHaveProperty('utc'); - } - }); - - it('should have string value property', () => { - for (const tz of TIMEZONES) { - expect(typeof tz.value).toBe('string'); - expect(tz.value.length).toBeGreaterThan(0); - } - }); - - it('should have string abbr property', () => { - for (const tz of TIMEZONES) { - expect(typeof tz.abbr).toBe('string'); - } - }); - - it('should have numeric offset property', () => { - for (const tz of TIMEZONES) { - expect(typeof tz.offset).toBe('number'); - } - }); - - it('should have boolean isdst property', () => { - for (const tz of TIMEZONES) { - expect(typeof tz.isdst).toBe('boolean'); - } - }); - - it('should have string text property with UTC offset', () => { - for (const tz of TIMEZONES) { - expect(typeof tz.text).toBe('string'); - expect(tz.text).toContain('UTC'); - } - }); - - it('should have array utc property', () => { - for (const tz of TIMEZONES) { - expect(Array.isArray(tz.utc)).toBe(true); - } - }); - - it('should have offsets in valid range (-12 to +14)', () => { - for (const tz of TIMEZONES) { - expect(tz.offset).toBeGreaterThanOrEqual(-12); - expect(tz.offset).toBeLessThanOrEqual(14); - } - }); - - it('should include common timezones', () => { - const values = TIMEZONES.map((tz) => tz.value); - expect(values).toContain('UTC'); - expect(values).toContain('Pacific Standard Time'); - expect(values).toContain('Eastern Standard Time'); - expect(values).toContain('GMT Standard Time'); - }); - - it('should include Australia timezones', () => { - const values = TIMEZONES.map((tz) => tz.value); - expect(values).toContain('AUS Eastern Standard Time'); - expect(values).toContain('W. Australia Standard Time'); - }); - - it('should include Asia timezones', () => { - const values = TIMEZONES.map((tz) => tz.value); - expect(values).toContain('China Standard Time'); - expect(values).toContain('Japan Standard Time'); - expect(values).toContain('India Standard Time'); - }); - - it('should include Europe timezones', () => { - const values = TIMEZONES.map((tz) => tz.value); - expect(values).toContain('W. Europe Standard Time'); - expect(values).toContain('Central Europe Standard Time'); - }); - - it('should have fractional offsets for special zones', () => { - const india = TIMEZONES.find( - (tz) => tz.value === 'India Standard Time', - ); - expect(india?.offset).toBe(5.5); - - const nepal = TIMEZONES.find( - (tz) => tz.value === 'Nepal Standard Time', - ); - expect(nepal?.offset).toBe(5.75); - }); - }); - - describe('TIMEZONES_IANA', () => { - it('should be a non-empty array', () => { - expect(Array.isArray(TIMEZONES_IANA)).toBe(true); - expect(TIMEZONES_IANA.length).toBeGreaterThan(0); - }); - - it('should have more than 200 IANA timezone identifiers', () => { - expect(TIMEZONES_IANA.length).toBeGreaterThan(200); - }); - - it('should contain only strings', () => { - for (const tz of TIMEZONES_IANA) { - expect(typeof tz).toBe('string'); - } - }); - - it('should be sorted alphabetically', () => { - const sorted = [...TIMEZONES_IANA].sort(); - expect(TIMEZONES_IANA).toEqual(sorted); - }); - - it('should contain unique values', () => { - const unique_set = new Set(TIMEZONES_IANA); - expect(unique_set.size).toBe(TIMEZONES_IANA.length); - }); - - it('should include common IANA identifiers', () => { - expect(TIMEZONES_IANA).toContain('America/New_York'); - expect(TIMEZONES_IANA).toContain('America/Los_Angeles'); - expect(TIMEZONES_IANA).toContain('Europe/London'); - expect(TIMEZONES_IANA).toContain('Asia/Tokyo'); - expect(TIMEZONES_IANA).toContain('Australia/Sydney'); - }); - - it('should include UTC/Etc identifiers', () => { - const etc_zones = TIMEZONES_IANA.filter((tz) => - tz.startsWith('Etc/'), - ); - expect(etc_zones.length).toBeGreaterThan(0); - }); - - it('should include Pacific identifiers', () => { - const pacific_zones = TIMEZONES_IANA.filter((tz) => - tz.startsWith('Pacific/'), - ); - expect(pacific_zones.length).toBeGreaterThan(0); - }); - - it('should include Indian Ocean identifiers', () => { - const indian_zones = TIMEZONES_IANA.filter((tz) => - tz.startsWith('Indian/'), - ); - expect(indian_zones.length).toBeGreaterThan(0); - }); - - it('should include Antarctica identifiers', () => { - const antarctica_zones = TIMEZONES_IANA.filter((tz) => - tz.startsWith('Antarctica/'), - ); - expect(antarctica_zones.length).toBeGreaterThan(0); - }); - - it('should not contain empty strings', () => { - for (const tz of TIMEZONES_IANA) { - expect(tz.length).toBeGreaterThan(0); - } - }); - - it('should have valid IANA format (region/city or Etc/...)', () => { - for (const tz of TIMEZONES_IANA) { - // Most should contain / (region/city format) - // Some like PST8PDT, EST5EDT are exceptions - const is_standard_format = - tz.includes('/') || /^[A-Z]{3,4}\d?[A-Z]{0,3}$/.test(tz); - expect(is_standard_format).toBe(true); - } - }); - }); - - describe('data consistency', () => { - it('should have TIMEZONES_IANA derived from TIMEZONES utc arrays', () => { - // Count all utc entries in TIMEZONES - let total_utc = 0; - for (const tz of TIMEZONES) { - total_utc += tz.utc.length; - } - - // TIMEZONES_IANA should have unique values, so could be less - expect(TIMEZONES_IANA.length).toBeLessThanOrEqual(total_utc); - }); - - it('should have all IANA identifiers in source TIMEZONES', () => { - const all_utc = new Set(); - for (const tz of TIMEZONES) { - for (const utc of tz.utc) { - all_utc.add(utc); - } - } - - for (const iana of TIMEZONES_IANA) { - expect(all_utc.has(iana)).toBe(true); - } - }); +import { describe, expect, it } from 'vitest'; +import { TIMEZONES_IANA } from '../../app/common/timezones'; + +describe('TIMEZONES_IANA', () => { + it('should list common IANA timezones', () => { + expect(TIMEZONES_IANA).toContain('Australia/Sydney'); + expect(TIMEZONES_IANA).toContain('America/New_York'); + expect(TIMEZONES_IANA).toContain('Europe/London'); }); }); diff --git a/src/tests/modules/module-form.component.spec.ts b/src/tests/modules/module-form.component.spec.ts index 0668d135a..aaee6c928 100644 --- a/src/tests/modules/module-form.component.spec.ts +++ b/src/tests/modules/module-form.component.spec.ts @@ -1,7 +1,6 @@ import { provideZonelessChangeDetection } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { PlaceDriverRole, type PlaceDriver } from '@placeos/ts-client'; import { EMPTY } from 'rxjs'; import { beforeEach, describe, expect, it, vi } from 'vitest'; @@ -60,7 +59,6 @@ describe('ModuleFormComponent', () => { imports: [ModuleFormComponent], providers: [ provideZonelessChangeDetection(), - provideNoopAnimations(), { provide: MatDialogRef, useValue: { @@ -144,7 +142,6 @@ describe('creating a module', () => { imports: [ModuleFormComponent], providers: [ provideZonelessChangeDetection(), - provideNoopAnimations(), { provide: MatDialogRef, useValue: { diff --git a/src/tests/overlays/confirm-modal.component.spec.ts b/src/tests/overlays/confirm-modal.component.spec.ts index a37f7667d..419d192cd 100644 --- a/src/tests/overlays/confirm-modal.component.spec.ts +++ b/src/tests/overlays/confirm-modal.component.spec.ts @@ -6,7 +6,6 @@ import { MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Subject } from 'rxjs'; import { beforeEach, describe, expect, it, vi } from 'vitest'; @@ -64,11 +63,7 @@ describe('ConfirmModalComponent', () => { }; await TestBed.configureTestingModule({ - imports: [ - ConfirmModalComponent, - MatDialogModule, - NoopAnimationsModule, - ], + imports: [ConfirmModalComponent, MatDialogModule], providers: [ { provide: MatDialogRef, useValue: dialog_ref_mock }, { provide: MAT_DIALOG_DATA, useValue: default_data }, @@ -113,11 +108,7 @@ describe('ConfirmModalComponent', () => { it('label the confirm button Delete and style it as an error', async () => { await TestBed.resetTestingModule(); await TestBed.configureTestingModule({ - imports: [ - ConfirmModalComponent, - MatDialogModule, - NoopAnimationsModule, - ], + imports: [ConfirmModalComponent, MatDialogModule], providers: [ { provide: MatDialogRef, useValue: dialog_ref_mock }, { @@ -153,11 +144,7 @@ describe('ConfirmModalComponent', () => { await TestBed.resetTestingModule(); await TestBed.configureTestingModule({ - imports: [ - ConfirmModalComponent, - MatDialogModule, - NoopAnimationsModule, - ], + imports: [ConfirmModalComponent, MatDialogModule], providers: [ { provide: MatDialogRef, useValue: dialog_ref_mock }, { provide: MAT_DIALOG_DATA, useValue: {} }, @@ -206,11 +193,7 @@ describe('ConfirmModalComponent', () => { await TestBed.resetTestingModule(); await TestBed.configureTestingModule({ - imports: [ - ConfirmModalComponent, - MatDialogModule, - NoopAnimationsModule, - ], + imports: [ConfirmModalComponent, MatDialogModule], providers: [ { provide: MatDialogRef, useValue: dialog_ref_mock }, { @@ -266,11 +249,7 @@ describe('ConfirmModalComponent', () => { const build = async (option_overrides = {}) => { await TestBed.resetTestingModule(); await TestBed.configureTestingModule({ - imports: [ - ConfirmModalComponent, - MatDialogModule, - NoopAnimationsModule, - ], + imports: [ConfirmModalComponent, MatDialogModule], providers: [ { provide: MatDialogRef, useValue: dialog_ref_mock }, { diff --git a/src/tests/repositories/repository-form.component.spec.ts b/src/tests/repositories/repository-form.component.spec.ts index d2fb76657..445f3f36a 100644 --- a/src/tests/repositories/repository-form.component.spec.ts +++ b/src/tests/repositories/repository-form.component.spec.ts @@ -1,7 +1,6 @@ import { provideZonelessChangeDetection } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { PlaceRepositoryType, listRepositoryBranches, @@ -44,7 +43,6 @@ describe('RepositoryFormComponent', () => { imports: [RepositoryFormComponent], providers: [ provideZonelessChangeDetection(), - provideNoopAnimations(), { provide: MatDialogRef, useValue: { diff --git a/src/tests/ui/components/context-menu.component.spec.ts b/src/tests/ui/components/context-menu.component.spec.ts index 238b953b4..dd60616ad 100644 --- a/src/tests/ui/components/context-menu.component.spec.ts +++ b/src/tests/ui/components/context-menu.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { ContextMenuComponent } from '../../../app/ui/context-menu.component'; @@ -9,7 +8,7 @@ describe('ContextMenuComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ContextMenuComponent, NoopAnimationsModule], + imports: [ContextMenuComponent], }).compileComponents(); fixture = TestBed.createComponent(ContextMenuComponent); diff --git a/src/tests/ui/components/fullscreen-modal-shell.component.spec.ts b/src/tests/ui/components/fullscreen-modal-shell.component.spec.ts index 9944d8e23..d13d68054 100644 --- a/src/tests/ui/components/fullscreen-modal-shell.component.spec.ts +++ b/src/tests/ui/components/fullscreen-modal-shell.component.spec.ts @@ -9,7 +9,6 @@ import { TestBed } from '@angular/core/testing'; import { MatChipsModule } from '@angular/material/chips'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { MatSelectModule } from '@angular/material/select'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { Subject } from 'rxjs'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { openConfirmModal } from '../../../app/overlays/confirm-modal.component'; @@ -65,7 +64,6 @@ describe('FullscreenModalShellComponent', () => { imports: [TestFormComponent], providers: [ provideZonelessChangeDetection(), - provideNoopAnimations(), { provide: MatDialogRef, useValue: ref }, { provide: MatDialog, useValue: {} }, ], diff --git a/src/tests/ui/components/simple-table.component.spec.ts b/src/tests/ui/components/simple-table.component.spec.ts index 8ab0ee5de..8c539490a 100644 --- a/src/tests/ui/components/simple-table.component.spec.ts +++ b/src/tests/ui/components/simple-table.component.spec.ts @@ -2,7 +2,6 @@ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { SimpleTableComponent, @@ -21,7 +20,7 @@ describe('SimpleTableComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [SimpleTableComponent, NoopAnimationsModule], + imports: [SimpleTableComponent], }).compileComponents(); fixture = TestBed.createComponent(SimpleTableComponent); diff --git a/src/tests/ui/components/support-group-picker.component.spec.ts b/src/tests/ui/components/support-group-picker.component.spec.ts index 13a7c9071..d09be90ad 100644 --- a/src/tests/ui/components/support-group-picker.component.spec.ts +++ b/src/tests/ui/components/support-group-picker.component.spec.ts @@ -5,8 +5,8 @@ import { provideZonelessChangeDetection, } from '@angular/core'; import { TestBed } from '@angular/core/testing'; +import { MATERIAL_ANIMATIONS } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { SupportGroupPickerComponent } from '../../../app/ui/support-group-picker.component'; import { TranslatePipe } from '../../../app/ui/translate.pipe'; @@ -53,7 +53,10 @@ describe('support group picker', () => { imports: [SupportGroupPickerComponent], providers: [ provideZonelessChangeDetection(), - provideNoopAnimations(), + { + provide: MATERIAL_ANIMATIONS, + useValue: { animationsDisabled: true }, + }, ], }).overrideComponent(SupportGroupPickerComponent, { remove: { imports: [TranslatePipe] }, From 08ccbbba493f6faeea694ba242b45a3020fa2dd2 Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Fri, 30 Oct 2026 20:19:50 +1100 Subject: [PATCH 2/9] refactor: remove dead members, pipes and table options Remove inputs, outputs, getters and signals that nothing reads, the sanitize and formatList pipes, unused simple-table selection, filter and paging, the custom toSignal, and AsyncHandler from classes that never used it. Delete the date field timezone code and its helpers. Co-Authored-By: Claude Opus 5.5 --- src/app/admin/admin-data.service.ts | 12 +- src/app/admin/admin.component.ts | 9 +- .../cluster-task-list.component.ts | 9 +- src/app/admin/database-details.component.ts | 7 +- src/app/admin/details.component.ts | 9 +- .../signage-plugin-embed.component.ts | 7 - .../signage-plugin-modal.component.ts | 9 - .../signage-plugin-test-modal.component.ts | 12 +- src/app/admin/staff-tenant-modal.component.ts | 13 +- src/app/admin/storage/storage.fn.ts | 21 +- src/app/app.ts | 3 +- src/app/common/general.ts | 17 -- src/app/common/signals.ts | 26 +-- src/app/common/timezone-helpers.ts | 44 ---- src/app/domains/auth-sources.utilities.ts | 5 - src/app/domains/domain-about.component.ts | 4 +- .../domain-authentication.component.ts | 8 - src/app/domains/domain-users.component.ts | 5 - src/app/domains/domains.component.ts | 4 +- src/app/drivers/driver-about.component.ts | 1 - src/app/drivers/driver-devices.component.ts | 9 +- src/app/drivers/driver-state.service.ts | 17 +- src/app/drivers/drivers.component.ts | 1 - src/app/groups/group-about.component.ts | 5 +- .../groups/group-bulk-add-modal.component.ts | 1 - src/app/groups/groups.component.ts | 4 +- src/app/modules/modules.component.ts | 1 - .../overlays/auth-source-modal.component.ts | 3 +- .../bulk-item-modal.component.ts | 2 +- .../bulk-item-modal/csv-upload.component.ts | 4 +- .../overlays/select-item-modal.component.ts | 3 +- .../overlays/view-module-state.component.ts | 6 +- .../repositories/repositories.component.ts | 2 - .../repositories/repository-form.component.ts | 2 - src/app/systems/system-modules.component.ts | 8 +- src/app/systems/system-triggers.component.ts | 5 +- src/app/systems/systems.component.ts | 1 - src/app/triggers/trigger-about.component.ts | 18 +- .../triggers/trigger-instances.component.ts | 13 +- src/app/triggers/triggers.component.ts | 14 +- .../application-picker-tooltip.component.ts | 23 +- .../custom-fields/date-calendar.component.ts | 12 +- .../ui/custom-fields/date-field.component.ts | 115 +--------- .../item-search-field.component.ts | 12 +- .../object-list-field.component.ts | 6 +- .../function-argument.component.ts | 2 - src/app/ui/custom-tooltip.component.ts | 52 ++--- src/app/ui/debug-output.component.ts | 15 +- src/app/ui/extension-outlet.component.ts | 3 +- .../ui/forms/oauth-source-form.component.ts | 6 +- .../forms/trigger-action-modal.component.ts | 6 +- .../comparison-form.component.ts | 9 - .../time-form.component.ts | 6 +- .../trigger-condition-modal.component.ts | 3 +- src/app/ui/global-loading.component.ts | 6 +- src/app/ui/item-details.component.ts | 24 +- src/app/ui/item-selection.component.ts | 2 +- src/app/ui/item-sidebar.component.ts | 9 +- src/app/ui/item-tablist.component.ts | 2 +- src/app/ui/metadata-display.component.ts | 23 +- src/app/ui/pipes/format-list.pipe.ts | 10 - src/app/ui/pipes/safe.pipe.ts | 25 +-- src/app/ui/pipes/sanitise.pipe.ts | 45 ---- src/app/ui/sidebar-menu.component.ts | 28 +-- src/app/ui/simple-table.component.ts | 161 +------------- src/app/ui/virtual-scroll.component.ts | 3 +- src/app/users/user-history.component.ts | 10 +- src/app/users/users.component.ts | 17 +- src/app/users/users.service.ts | 3 - src/app/zones/zone-about.component.ts | 4 +- src/app/zones/zone-children.component.ts | 5 - src/app/zones/zone-triggers.component.ts | 5 - src/app/zones/zones.component.ts | 115 +++++----- src/tests/admin/storage.fn.spec.ts | 31 --- src/tests/common/general.spec.ts | 34 +-- src/tests/common/timezone-helpers.spec.ts | 86 ------- .../components/simple-table.component.spec.ts | 210 ------------------ .../ui/extension-outlet.component.spec.ts | 12 +- src/tests/ui/pipes/format-list.pipe.spec.ts | 37 --- src/tests/ui/pipes/safe.pipe.spec.ts | 50 ----- src/tests/ui/pipes/sanitise.pipe.spec.ts | 101 --------- 81 files changed, 196 insertions(+), 1476 deletions(-) delete mode 100644 src/app/common/timezone-helpers.ts delete mode 100644 src/app/ui/pipes/format-list.pipe.ts delete mode 100644 src/app/ui/pipes/sanitise.pipe.ts delete mode 100644 src/tests/common/timezone-helpers.spec.ts delete mode 100644 src/tests/ui/pipes/format-list.pipe.spec.ts delete mode 100644 src/tests/ui/pipes/sanitise.pipe.spec.ts diff --git a/src/app/admin/admin-data.service.ts b/src/app/admin/admin-data.service.ts index aa96d7098..b84b0242a 100644 --- a/src/app/admin/admin-data.service.ts +++ b/src/app/admin/admin-data.service.ts @@ -6,8 +6,6 @@ export type AdminSortState = [string, boolean]; @Service() export class AdminDataService { private readonly _domain_list = signal([]); - private readonly _loading_domains = signal(false); - private readonly _domain_error = signal(null); private readonly _selected_domains = new Map< string, WritableSignal @@ -17,8 +15,6 @@ export class AdminDataService { private _domain_request: Promise | null = null; public readonly domain_list = this._domain_list.asReadonly(); - public readonly loading_domains = this._loading_domains.asReadonly(); - public readonly domain_error = this._domain_error.asReadonly(); public selectedDomain(key: string): WritableSignal { let selected = this._selected_domains.get(key); @@ -60,20 +56,14 @@ export class AdminDataService { public async loadDomains(limit = 500): Promise { if (this._domain_list().length) return this._domain_list(); if (this._domain_request) return this._domain_request; - this._loading_domains.set(true); - this._domain_error.set(null); this._domain_request = queryDomains({ limit }) .then((response) => response.data || []) - .catch((error) => { - this._domain_error.set(error); - return [] as PlaceDomain[]; - }) + .catch(() => [] as PlaceDomain[]) .then((domains) => { this._domain_list.set(domains); return domains; }) .finally(() => { - this._loading_domains.set(false); this._domain_request = null; }); return this._domain_request; diff --git a/src/app/admin/admin.component.ts b/src/app/admin/admin.component.ts index 6e70ce58a..04cad210b 100644 --- a/src/app/admin/admin.component.ts +++ b/src/app/admin/admin.component.ts @@ -3,7 +3,6 @@ import { Component, OnInit, computed, inject } from '@angular/core'; import { MatRippleModule } from '@angular/material/core'; import { RouterModule } from '@angular/router'; import { extensionsForItem } from '../common/api'; -import { AsyncHandler } from '../common/async-handler.class'; import { PlaceDebugService } from '../common/debug.service'; import { ActiveItemService } from '../common/item.service'; import { i18n } from '../common/locale.service'; @@ -80,12 +79,6 @@ import { TranslatePipe } from '../ui/translate.pipe'; width: 100%; height: 100%; } - - .active { - background-color: var(--secondary) !important; - color: var(--secondary-content); - margin-right: -1px; - } `, ], imports: [ @@ -97,7 +90,7 @@ import { TranslatePipe } from '../ui/translate.pipe'; RouterModule, ], }) -export class PlaceComponent extends AsyncHandler implements OnInit { +export class PlaceComponent implements OnInit { private _settings = inject(SettingsService); private _service = inject(ActiveItemService); private _debug = inject(PlaceDebugService); diff --git a/src/app/admin/cluster-details/cluster-task-list.component.ts b/src/app/admin/cluster-details/cluster-task-list.component.ts index 96bfd46f2..08c55de0e 100644 --- a/src/app/admin/cluster-details/cluster-task-list.component.ts +++ b/src/app/admin/cluster-details/cluster-task-list.component.ts @@ -15,6 +15,7 @@ import { terminateProcess, } from '@placeos/ts-client'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormsModule } from '@angular/forms'; import { MatRippleModule } from '@angular/material/core'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -27,7 +28,6 @@ import { describeError } from '../../common/errors'; import { reportLoadError } from '../../common/load-error'; import { i18n } from '../../common/locale.service'; import { notifyError } from '../../common/notifications'; -import { signalFromSubscribable } from '../../common/signals'; import { CONFIRM_METADATA, ConfirmModalComponent, @@ -207,10 +207,9 @@ export class PlaceClusterTaskListComponent public readonly process_list = signal([]); public readonly filter = signal(''); - private readonly _param_map = signalFromSubscribable( - this._route.paramMap, - this._route.snapshot.paramMap, - ); + private readonly _param_map = toSignal(this._route.paramMap, { + initialValue: this._route.snapshot.paramMap, + }); private readonly _cluster_id = computed(() => this._param_map().get('id')); public readonly filtered_list = computed(() => diff --git a/src/app/admin/database-details.component.ts b/src/app/admin/database-details.component.ts index 85b43be87..fbbb1a29b 100644 --- a/src/app/admin/database-details.component.ts +++ b/src/app/admin/database-details.component.ts @@ -14,7 +14,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { AsyncHandler } from '../common/async-handler.class'; import { mapLimit } from '../common/cascade-delete'; import { readError } from '../common/errors'; -import { csvToJson, downloadFile, jsonToCsv } from '../common/general'; +import { downloadFile, jsonToCsv, parseCSV } from '../common/general'; import { notifyError, notifySuccess, @@ -380,10 +380,7 @@ export class PlaceDatabaseDetailsComponent const separator = file.name.toLowerCase().endsWith('.tsv') ? '\t' : ','; - const zones = csvToJson( - contents, - separator, - ) as ZoneTreeExportItem[]; + const zones = parseCSV(contents, separator) as ZoneTreeExportItem[]; await this.importZoneTree(zones); } catch (err) { notifyError( diff --git a/src/app/admin/details.component.ts b/src/app/admin/details.component.ts index 38f814f5f..c2cdb6db6 100644 --- a/src/app/admin/details.component.ts +++ b/src/app/admin/details.component.ts @@ -3,13 +3,11 @@ import { MatDialog } from '@angular/material/dialog'; import { apiEndpoint, get } from '@placeos/ts-client'; import { VERSION } from '../../env/version'; -import { AsyncHandler } from '../common/async-handler.class'; import { notifyError, notifyInfo } from '../common/notifications'; import { ChangelogModalComponent, ChangelogModalData, } from '../overlays/changelog-modal.component'; -import { BackofficeUsersService } from '../users/users.service'; import { DatePipe, SlicePipe } from '@angular/common'; import { format } from 'date-fns'; @@ -197,8 +195,7 @@ export interface PlaceServiceDetails { ], imports: [TranslatePipe, DatePipe, SlicePipe], }) -export class PlaceDetailsComponent extends AsyncHandler implements OnInit { - private _users = inject(BackofficeUsersService); +export class PlaceDetailsComponent implements OnInit { private _dialog = inject(MatDialog); /** Current details about the API */ @@ -207,10 +204,6 @@ export class PlaceDetailsComponent extends AsyncHandler implements OnInit { public readonly backend_version = signal(''); public readonly backoffice_logs = signal(''); - public get user() { - return this._users.user; - } - public get backoffice_version() { return VERSION?.stamp || ''; } diff --git a/src/app/admin/signage-plugins/signage-plugin-embed.component.ts b/src/app/admin/signage-plugins/signage-plugin-embed.component.ts index b96b85cd9..bed8cf300 100644 --- a/src/app/admin/signage-plugins/signage-plugin-embed.component.ts +++ b/src/app/admin/signage-plugins/signage-plugin-embed.component.ts @@ -42,13 +42,6 @@ export type SignagePluginMessageType = | 'error'; export type SignageHostMessageType = 'config' | 'play'; -export type SignageMessage = { - api: 'signage-plugin/v1'; - type: SignagePluginMessageType | SignageHostMessageType; - request_id?: string; - payload?: T; -}; - export type PluginLoadedPayload = { plugin: { name: string; diff --git a/src/app/admin/signage-plugins/signage-plugin-modal.component.ts b/src/app/admin/signage-plugins/signage-plugin-modal.component.ts index deb36b01c..a031bd1fa 100644 --- a/src/app/admin/signage-plugins/signage-plugin-modal.component.ts +++ b/src/app/admin/signage-plugins/signage-plugin-modal.component.ts @@ -2,10 +2,8 @@ import { Component, computed, effect, - EventEmitter, inject, OnInit, - Output, signal, viewChild, } from '@angular/core'; @@ -23,7 +21,6 @@ import { getInvalidSignalFields } from '../../common/forms'; import { HotkeysService } from '../../common/hotkeys.service'; import { i18n } from '../../common/locale.service'; import { notifyError, notifySuccess } from '../../common/notifications'; -import { DialogEvent } from '../../common/types'; import { FullscreenModalShellComponent } from '../../ui/fullscreen-modal-shell.component'; import { LoadingLabelDirective } from '../../ui/loading-label.directive'; import { SettingsToggleComponent } from '../../ui/settings-toggle.component'; @@ -265,8 +262,6 @@ export class SignagePluginModalComponent private readonly _schema_form_el = viewChild('schema_form_el'); - @Output() public event = new EventEmitter(); - public edit: boolean; public readonly formModel = signal( generateSignagePluginFormModel(this._data.item), @@ -377,10 +372,6 @@ export class SignagePluginModalComponent }; try { const result = await this._data.save(payload); - this.event.emit({ - reason: 'done', - metadata: { item: result }, - }); notifySuccess(i18n('ADMIN.SIGNAGE_PLUGINS_SAVE_SUCCESS')); this._dialog_ref.close({ reason: 'done', diff --git a/src/app/admin/signage-plugins/signage-plugin-test-modal.component.ts b/src/app/admin/signage-plugins/signage-plugin-test-modal.component.ts index 5f18ef8a6..c4353782e 100644 --- a/src/app/admin/signage-plugins/signage-plugin-test-modal.component.ts +++ b/src/app/admin/signage-plugins/signage-plugin-test-modal.component.ts @@ -1,11 +1,4 @@ -import { - Component, - EventEmitter, - OnInit, - Output, - inject, - signal, -} from '@angular/core'; +import { Component, OnInit, inject, signal } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatRippleModule } from '@angular/material/core'; import { @@ -17,7 +10,6 @@ import { MatProgressBarModule } from '@angular/material/progress-bar'; import { SignagePlugin } from '@placeos/ts-client'; import { AsyncHandler } from '../../common/async-handler.class'; -import { DialogEvent } from '../../common/types'; import { DialogTitleDirective } from '../../ui/dialog-title.directive'; import { IconComponent } from '../../ui/icon.component'; import { LoadingLabelDirective } from '../../ui/loading-label.directive'; @@ -269,8 +261,6 @@ export class SignagePluginTestModalComponent inject>(MatDialogRef); private _data = inject(MAT_DIALOG_DATA); - @Output() public event = new EventEmitter(); - public readonly sidebar_open = signal(true); public readonly schema_loading = signal(false); public readonly schema = signal>(null); diff --git a/src/app/admin/staff-tenant-modal.component.ts b/src/app/admin/staff-tenant-modal.component.ts index d51ef59d1..35b8525ad 100644 --- a/src/app/admin/staff-tenant-modal.component.ts +++ b/src/app/admin/staff-tenant-modal.component.ts @@ -1,11 +1,4 @@ -import { - Component, - computed, - inject, - model, - output, - signal, -} from '@angular/core'; +import { Component, computed, inject, model, signal } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { email, @@ -24,7 +17,7 @@ import { cleanObject, PlaceDomain, post, put } from '@placeos/ts-client'; import { getInvalidSignalFields } from '../common/forms'; import { i18n } from '../common/locale.service'; import { notifyError, notifySuccess } from '../common/notifications'; -import { DialogEvent, HashMap } from '../common/types'; +import { HashMap } from '../common/types'; import { ObjectListFieldComponent } from '../ui/custom-fields/object-list-field.component'; import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component'; import { IconComponent } from '../ui/icon.component'; @@ -608,8 +601,6 @@ export class StaffTenantModalComponent { private _dialog_ref = inject>(MatDialogRef); - public readonly event = output(); - public readonly tenant = this._data.tenant; public readonly domain = this._data.domain; public readonly loading = signal(''); diff --git a/src/app/admin/storage/storage.fn.ts b/src/app/admin/storage/storage.fn.ts index 38bc38d39..4982d0e4e 100644 --- a/src/app/admin/storage/storage.fn.ts +++ b/src/app/admin/storage/storage.fn.ts @@ -1,11 +1,4 @@ -import { - cleanObject, - create, - query, - remove, - show, - update, -} from '@placeos/ts-client'; +import { cleanObject, create, query, remove, update } from '@placeos/ts-client'; const PATH = 'storages'; @@ -62,18 +55,6 @@ export function queryStorage(query_params: StorageQueryParameters = {}) { return query({ query_params, fn: process, path: PATH }); } -/** - * Get the data for a system - * @param id ID of the system to retrieve - * @param query_params Query parameters to add the to request URL - */ -export function showStorage( - id: string, - query_params: StorageQueryParameters = {}, -) { - return show({ id, query_params, fn: process, path: PATH }); -} - /** * Update the storage in the database * @param id ID of the storage diff --git a/src/app/app.ts b/src/app/app.ts index ca547c710..cbf224915 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -17,7 +17,6 @@ import { RouterOutlet, } from '@angular/router'; import { setupCache, updateAvailable } from './common/application'; -import { AsyncHandler } from './common/async-handler.class'; import { log } from './common/general'; import { setNotifyOutlet } from './common/notifications'; import { PlaceSettings, setLoadingMessage, setupPlace } from './common/placeos'; @@ -157,7 +156,7 @@ function browserOnline() { MatTooltip, ], }) -export class AppComponent extends AsyncHandler implements OnInit { +export class AppComponent implements OnInit { private _settings = inject(SettingsService); private _users = inject(BackofficeUsersService); private _cache = inject(SwUpdate); diff --git a/src/app/common/general.ts b/src/app/common/general.ts index 44018a457..2cc2784d2 100644 --- a/src/app/common/general.ts +++ b/src/app/common/general.ts @@ -148,7 +148,6 @@ export function numberToPosition(num: number): string { return `${num}th`; } -export const csvToJson = parseCSV; /** * Parses a CSV string back into an array of JavaScript objects. * - It assumes the first row is the header row. @@ -360,19 +359,3 @@ If applicable, add screenshots to help explain your problem. **Hash:** ${hash} **Built:** ${date} `; - -/** - * Pad the start of a string or number with given character - * @param value String or number to pad - * @param length Length of the final string - * @param character Character to pad output string with. Defaults to `0`. - */ -export function padLength( - value: number | string, - length = 2, - character = '0', -): string { - let str = `${value}`; - while (str.length < length) str = `${character}${str}`; - return str; -} diff --git a/src/app/common/signals.ts b/src/app/common/signals.ts index c3bc93c18..3034b45de 100644 --- a/src/app/common/signals.ts +++ b/src/app/common/signals.ts @@ -1,4 +1,4 @@ -import { DestroyRef, Injector, Signal, inject, signal } from '@angular/core'; +import { DestroyRef, Signal, inject, signal } from '@angular/core'; import type { Signal as ClientSignal } from '@placeos/ts-client'; export interface SubscriptionLike { @@ -17,18 +17,6 @@ function disposeSubscription(subscription: SubscriptionLike | (() => void)) { } } -export function signalFromSubscribable( - source: Subscribable, - initialValue: T, - injector = inject(Injector), -): Signal { - const destroyRef = injector.get(DestroyRef); - const state = signal(initialValue); - const subscription = source.subscribe((value) => state.set(value)); - destroyRef.onDestroy(() => disposeSubscription(subscription)); - return state.asReadonly(); -} - export function signalFromClient( source: ClientSignal, initialValue: T = source.value, @@ -42,18 +30,6 @@ export function signalFromClient( return state.asReadonly(); } -export function toSignal( - source: Signal | Subscribable, - options: { initialValue?: T; injector?: Injector } = {}, -): Signal { - if (typeof source === 'function') return source as Signal; - return signalFromSubscribable( - source, - options.initialValue, - options.injector, - ); -} - export function waitForEvent( source: Subscribable, predicate: (value: T) => boolean = () => true, diff --git a/src/app/common/timezone-helpers.ts b/src/app/common/timezone-helpers.ts deleted file mode 100644 index da240b2f8..000000000 --- a/src/app/common/timezone-helpers.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { padLength } from './general'; - -const TIMZONE_OFFSET_STRINGS = {}; - -export function getTimezoneOffsetString(tz: string) { - if (TIMZONE_OFFSET_STRINGS[tz]) return TIMZONE_OFFSET_STRINGS[tz]; - const offset = getTimezoneOffsetInMinutes(tz); - const hours = Math.floor(Math.abs(offset) / 60); - const minutes = Math.abs(offset) % 60; - const output = `${offset >= 0 ? '+' : '-'}${padLength(hours, 2)}${padLength( - minutes, - 2, - )}`; - TIMZONE_OFFSET_STRINGS[tz] = output; - return output; -} - -/** - * Offset of the given timezone from UTC in minutes, at the given date. - * Positive values are ahead of UTC, e.g. `Asia/Kolkata` is `330`. - */ -export function getTimezoneOffsetInMinutes(timeZone, date = new Date()) { - // `longOffset` always gives a numeric offset (e.g. "GMT+05:30"), where - // `short` gives an abbreviation (e.g. "AEST") for many zones. - // A fixed locale keeps the digits and format predictable. - const formatter = new Intl.DateTimeFormat('en-US', { - timeZone, - timeZoneName: 'longOffset', - }); - const tz_offset_part = formatter - .formatToParts(date) - .find((part) => part.type === 'timeZoneName'); - // UTC is given as plain "GMT", which does not match - const offset_match = tz_offset_part?.value.match( - /GMT([+-])(\d{2}):(\d{2})/, - ); - if (!offset_match) return 0; - - const sign = offset_match[1] === '+' ? 1 : -1; - const hours = parseInt(offset_match[2], 10); - const minutes = parseInt(offset_match[3], 10); - - return sign * (hours * 60 + minutes); -} diff --git a/src/app/domains/auth-sources.utilities.ts b/src/app/domains/auth-sources.utilities.ts index bcda242d7..ce9b29598 100644 --- a/src/app/domains/auth-sources.utilities.ts +++ b/src/app/domains/auth-sources.utilities.ts @@ -52,11 +52,6 @@ export interface LDAPSourceFormModel { filter: string; } -export type AuthSourceFormModel = - | OAuthSourceFormModel - | SAMLSourceFormModel - | LDAPSourceFormModel; - /** * Generate form model for an OAuth authentication source * @param auth_source Auth source to apply changes to diff --git a/src/app/domains/domain-about.component.ts b/src/app/domains/domain-about.component.ts index e790e6001..1532339ee 100644 --- a/src/app/domains/domain-about.component.ts +++ b/src/app/domains/domain-about.component.ts @@ -8,7 +8,6 @@ import { Clipboard } from '@angular/cdk/clipboard'; import { MatRippleModule } from '@angular/material/core'; import { MatTabsModule } from '@angular/material/tabs'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { AsyncHandler } from '../common/async-handler.class'; import { readError } from '../common/errors'; import { i18n } from '../common/locale.service'; import { notifyError, notifySuccess } from '../common/notifications'; @@ -121,7 +120,7 @@ import { DomainStateService } from './domain-state.service'; MarkdownPipe, ], }) -export class DomainAboutComponent extends AsyncHandler { +export class DomainAboutComponent { private _service = inject(DomainStateService); private _clipboard = inject(Clipboard); @@ -153,7 +152,6 @@ export class DomainAboutComponent extends AsyncHandler { } constructor() { - super(); effect(() => { if (this._item()) this.loadForm(); }); diff --git a/src/app/domains/domain-authentication.component.ts b/src/app/domains/domain-authentication.component.ts index a54e4157d..3d630fcd1 100644 --- a/src/app/domains/domain-authentication.component.ts +++ b/src/app/domains/domain-authentication.component.ts @@ -1,10 +1,8 @@ import { Component, inject } from '@angular/core'; -import { PlaceDomain } from '@placeos/ts-client'; import { MatRippleModule } from '@angular/material/core'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { HashMap } from '../common/types'; import { IconComponent } from '../ui/icon.component'; import { LoadingLabelDirective } from '../ui/loading-label.directive'; import { SimpleTableComponent } from '../ui/simple-table.component'; @@ -116,16 +114,10 @@ export class DomainAuthenticationComponent { /** List of auth sources associated with the active domain */ public readonly auth_sources = this._service.auth_sources; public readonly loading = this._service.loading; - /** Mapping of auth sources to their type */ - public source_types: HashMap<'oauth' | 'saml' | 'ldap'> = {}; public readonly newAuthSource = () => this._service.editAuthSource(); public readonly editAuthSource = (source) => this._service.editAuthSource(source); public readonly removeAuthSource = (source) => this._service.deleteAuthSource(source); - - public get item(): PlaceDomain { - return this._service.active_item as PlaceDomain; - } } diff --git a/src/app/domains/domain-users.component.ts b/src/app/domains/domain-users.component.ts index 6a921492b..86253b114 100644 --- a/src/app/domains/domain-users.component.ts +++ b/src/app/domains/domain-users.component.ts @@ -1,5 +1,4 @@ import { Component, inject } from '@angular/core'; -import { PlaceDomain } from '@placeos/ts-client'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { LoadingLabelDirective } from '../ui/loading-label.directive'; @@ -85,8 +84,4 @@ export class DomainUsersComponent { public readonly users = this._service.users; public readonly loading = this._service.loading; - - public get item(): PlaceDomain { - return this._service.active_item as PlaceDomain; - } } diff --git a/src/app/domains/domains.component.ts b/src/app/domains/domains.component.ts index 0de45e903..846391552 100644 --- a/src/app/domains/domains.component.ts +++ b/src/app/domains/domains.component.ts @@ -4,7 +4,6 @@ import { MatTabNavPanel } from '@angular/material/tabs'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; import { extensionsForItem } from '../common/api'; -import { AsyncHandler } from '../common/async-handler.class'; import { ActiveItemService } from '../common/item.service'; import { i18n } from '../common/locale.service'; import { IconComponent } from '../ui/icon.component'; @@ -54,7 +53,6 @@ import { DomainStateService } from './domain-state.service'; } @else if (item()?.id) { this._service.updateDriver(); public readonly recompile = () => this._service.recompileDriver(); public readonly reload = () => this._service.reloadDriver(); - public readonly viewErrors = () => this._service.viewError(); public readonly item = this._service.item; public copyCommit(): void { diff --git a/src/app/drivers/driver-devices.component.ts b/src/app/drivers/driver-devices.component.ts index 627949c02..fc6d7bb46 100644 --- a/src/app/drivers/driver-devices.component.ts +++ b/src/app/drivers/driver-devices.component.ts @@ -9,7 +9,6 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; import { PlaceModule, PlaceSystem, querySystems } from '@placeos/ts-client'; -import { toSignal } from '../common/signals'; import { BindingDirective } from '../ui/binding.directive'; import { CustomTooltipComponent } from '../ui/custom-tooltip.component'; @@ -264,17 +263,13 @@ export class DriverModulesComponent { /** Signal holding the value of the search */ public readonly filter = model(''); /** Whether systems are being loaded */ - public readonly loading = toSignal(this._service.loading, { - initialValue: false, - }); + public readonly loading = this._service.loading; /** Currently active driver */ public readonly item = this._service.item; /** List of systems associated with modules */ public readonly systems = signal>({}); /** List of modules */ - public readonly module_list = toSignal(this._service.modules, { - initialValue: [] as PlaceModule[], - }); + public readonly module_list = this._service.modules; public readonly modules = computed(() => { const filter = this.filter().toLowerCase(); const modules = this.module_list(); diff --git a/src/app/drivers/driver-state.service.ts b/src/app/drivers/driver-state.service.ts index ae04af08b..e35840f5c 100644 --- a/src/app/drivers/driver-state.service.ts +++ b/src/app/drivers/driver-state.service.ts @@ -16,7 +16,7 @@ import { ActiveItemService } from '../common/item.service'; import { reportLoadError } from '../common/load-error'; import { notifyError, notifySuccess } from '../common/notifications'; import { collectPages } from '../common/support-access'; -import { HashMap, Identity } from '../common/types'; +import { Identity } from '../common/types'; import { openConfirmModal } from '../overlays/confirm-modal.component'; import { ViewResponseModalComponent } from '../overlays/view-response-modal.component'; import { DriverUpdateListModalComponent } from './driver-update-list-modal.component'; @@ -26,7 +26,6 @@ export class DriverStateService { private _state = inject(ActiveItemService); private _dialog = inject(MatDialog); - private _last_error = signal(null); private _poll = signal(0); private _modules_change = signal(0); @@ -37,8 +36,6 @@ export class DriverStateService { public readonly loading = computed( () => this._modules.isLoading() || this._docs.isLoading(), ); - /** Bumped each time a module of the driver is removed */ - public readonly modules_change = this._modules_change.asReadonly(); private readonly _updates_available = resource({ params: () => this._poll(), @@ -93,17 +90,6 @@ export class DriverStateService { this._dialog.open(DriverUpdateListModalComponent, {}); } - public viewError() { - const error = this._last_error(); - if (!error) return; - this._dialog.open( - ViewResponseModalComponent, - { - data: { title: 'Driver Compilation Error', content: error }, - }, - ); - } - public async updateDriver() { const item = this._state.active_item as PlaceDriver; if (!item.update_available) return notifyError('No update available.'); @@ -147,7 +133,6 @@ export class DriverStateService { .catch(async (e) => { console.log('Error:', e); const content = e instanceof Response ? await e.text() : e; - this._last_error.set(content); notifyError('Failed to recompile driver.', 'View Error', () => this._dialog.open( ViewResponseModalComponent, diff --git a/src/app/drivers/drivers.component.ts b/src/app/drivers/drivers.component.ts index 4e362a831..300b5034b 100644 --- a/src/app/drivers/drivers.component.ts +++ b/src/app/drivers/drivers.component.ts @@ -57,7 +57,6 @@ import { DriverStateService } from './driver-state.service'; } @else if (item()?.id) { diff --git a/src/app/groups/group-about.component.ts b/src/app/groups/group-about.component.ts index 456b6cd1d..b14288d5a 100644 --- a/src/app/groups/group-about.component.ts +++ b/src/app/groups/group-about.component.ts @@ -8,7 +8,6 @@ import { showDomain, showGroup, } from '@placeos/ts-client'; -import { toSignal } from '../common/signals'; import { DateFromPipe } from '../ui/pipes/date-from.pipe'; import { MarkdownPipe } from '../ui/pipes/markdown.pipe'; import { TranslatePipe } from '../ui/translate.pipe'; @@ -193,9 +192,7 @@ import { GroupStateService } from './group-state.service'; export class GroupAboutComponent { private _service = inject(GroupStateService); - public readonly item = toSignal(this._service.item, { - initialValue: null as PlaceGroup | null, - }); + public readonly item = this._service.item; public readonly parent = signal(null); public readonly authority = signal(null); public readonly permissionLabels = groupPermissionLabels; diff --git a/src/app/groups/group-bulk-add-modal.component.ts b/src/app/groups/group-bulk-add-modal.component.ts index 2ad5f86af..2648e229e 100644 --- a/src/app/groups/group-bulk-add-modal.component.ts +++ b/src/app/groups/group-bulk-add-modal.component.ts @@ -254,7 +254,6 @@ export class GroupBulkAddModalComponent { public readonly show_permissions = !!this._data.show_permissions; public readonly permission_flags = GROUP_PERMISSION_FLAGS; public readonly hasPermission = hasGroupPermission; - public readonly selected_count = computed(() => this.selected().length); private readonly _items = resource({ params: () => this.search().trim(), loader: async ({ params }) => { diff --git a/src/app/groups/groups.component.ts b/src/app/groups/groups.component.ts index 5bcbff46b..476a21cc7 100644 --- a/src/app/groups/groups.component.ts +++ b/src/app/groups/groups.component.ts @@ -3,7 +3,6 @@ import { MatRipple } from '@angular/material/core'; import { MatTabNavPanel } from '@angular/material/tabs'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; -import { AsyncHandler } from '../common/async-handler.class'; import { ActiveItemService } from '../common/item.service'; import { i18n } from '../common/locale.service'; import { IconComponent } from '../ui/icon.component'; @@ -56,7 +55,6 @@ import { GroupStateService } from './group-state.service'; } @else if (item()?.id) { @@ -106,7 +104,7 @@ import { GroupStateService } from './group-state.service'; SidebarMenuComponent, ], }) -export class GroupsComponent extends AsyncHandler { +export class GroupsComponent { private _service = inject(GroupStateService); protected _item = inject(ActiveItemService); diff --git a/src/app/modules/modules.component.ts b/src/app/modules/modules.component.ts index c31c2b84f..fe6dc6095 100644 --- a/src/app/modules/modules.component.ts +++ b/src/app/modules/modules.component.ts @@ -59,7 +59,6 @@ import { ModuleStateService } from './module-state.service'; } @else if (item()?.id) { diff --git a/src/app/overlays/auth-source-modal.component.ts b/src/app/overlays/auth-source-modal.component.ts index 12565cdf1..c37203a6a 100644 --- a/src/app/overlays/auth-source-modal.component.ts +++ b/src/app/overlays/auth-source-modal.component.ts @@ -24,7 +24,6 @@ import { import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; -import { AsyncHandler } from '../common/async-handler.class'; import { readError } from '../common/errors'; import { i18n } from '../common/locale.service'; import { notifyError, notifySuccess } from '../common/notifications'; @@ -123,7 +122,7 @@ export type AuthSourceTypes = 'oauth' | 'saml' | 'ldap'; OauthSourceFormComponent, ], }) -export class AuthSourceModalComponent extends AsyncHandler implements OnInit { +export class AuthSourceModalComponent implements OnInit { private _dialog = inject>(MatDialogRef); private _data = inject(MAT_DIALOG_DATA); diff --git a/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts b/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts index b0a7a7b72..e5d489634 100644 --- a/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts +++ b/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts @@ -238,7 +238,7 @@ export class BulkItemModalComponent< const Resource = this._data.constr; this.item_list.set( data.map((item) => { - // Values are already parsed by csvToJson/parseCSV, + // Values are already parsed by parseCSV, // so no need for additional JSON.parse here return new Resource(item); }), diff --git a/src/app/overlays/bulk-item-modal/csv-upload.component.ts b/src/app/overlays/bulk-item-modal/csv-upload.component.ts index c78c50623..5eccb42b4 100644 --- a/src/app/overlays/bulk-item-modal/csv-upload.component.ts +++ b/src/app/overlays/bulk-item-modal/csv-upload.component.ts @@ -2,7 +2,7 @@ import { Component, input, output, signal } from '@angular/core'; import { MatRippleModule } from '@angular/material/core'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { csvToJson, downloadFile, jsonToCsv } from '../../common/general'; +import { downloadFile, jsonToCsv, parseCSV } from '../../common/general'; import { notifyError, notifyWarn } from '../../common/notifications'; import { HashMap } from '../../common/types'; import { IconComponent } from '../../ui/icon.component'; @@ -157,7 +157,7 @@ export class CsvUploadComponent { private processCSVData(data: string, seperator: '\t' | ',' | ' ' = '\t') { try { - const list = csvToJson(data, seperator) || []; + const list = parseCSV(data, seperator) || []; this.loading = false; if (!list.length) { notifyWarn('No rows were found in the uploaded file.'); diff --git a/src/app/overlays/select-item-modal.component.ts b/src/app/overlays/select-item-modal.component.ts index 31c9f161f..66f1979e0 100644 --- a/src/app/overlays/select-item-modal.component.ts +++ b/src/app/overlays/select-item-modal.component.ts @@ -4,7 +4,6 @@ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { FormsModule } from '@angular/forms'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { AsyncHandler } from '../common/async-handler.class'; import { DialogEvent } from '../common/types'; import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component'; import { IconComponent } from '../ui/icon.component'; @@ -84,7 +83,7 @@ export interface SelectItemModalData { IconComponent, ], }) -export class SelectItemModalComponent extends AsyncHandler { +export class SelectItemModalComponent { private _data = inject(MAT_DIALOG_DATA); /** Emitter for user action on the modal */ diff --git a/src/app/overlays/view-module-state.component.ts b/src/app/overlays/view-module-state.component.ts index 529ba0b63..ff85eaeaa 100644 --- a/src/app/overlays/view-module-state.component.ts +++ b/src/app/overlays/view-module-state.component.ts @@ -9,7 +9,6 @@ import { import { FormsModule } from '@angular/forms'; import { MatRippleModule } from '@angular/material/core'; -import { AsyncHandler } from '../common/async-handler.class'; import { describeError } from '../common/errors'; import { notifyError } from '../common/notifications'; import { HashMap } from '../common/types'; @@ -124,10 +123,7 @@ export interface ModuleStateModalData { IconComponent, ], }) -export class ViewModuleStateModalComponent - extends AsyncHandler - implements OnInit -{ +export class ViewModuleStateModalComponent implements OnInit { private _data = inject(MAT_DIALOG_DATA); /** Current state of the selected module */ diff --git a/src/app/repositories/repositories.component.ts b/src/app/repositories/repositories.component.ts index e97bc1b93..6cd58d841 100644 --- a/src/app/repositories/repositories.component.ts +++ b/src/app/repositories/repositories.component.ts @@ -54,7 +54,6 @@ import { RepositoriesStateService } from './repositories-state.service'; } @else if (item()?.id) { @@ -118,7 +117,6 @@ export class RepositoriesComponent { public readonly loading = this._item.loading; public readonly driver_list_loading = this._service.loading; public readonly driver_list = this._service.driver_list; - public readonly driver_list_error = this._service.driver_list_error; public readonly has_changelog = this._service.has_changelog; public readonly driver_count = computed(() => { const list = this.driver_list(); diff --git a/src/app/repositories/repository-form.component.ts b/src/app/repositories/repository-form.component.ts index 5ec1dc340..3b56a64a5 100644 --- a/src/app/repositories/repository-form.component.ts +++ b/src/app/repositories/repository-form.component.ts @@ -47,7 +47,6 @@ import { isValidUrl } from '../common/validation'; import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component'; import { IconComponent } from '../ui/icon.component'; import { LoadingLabelDirective } from '../ui/loading-label.directive'; -import { DateFromPipe } from '../ui/pipes/date-from.pipe'; import { SettingsToggleComponent } from '../ui/settings-toggle.component'; import { TranslatePipe } from '../ui/translate.pipe'; import { @@ -578,7 +577,6 @@ export class RepositoryFormComponent extends AsyncHandler implements OnInit { /** List of available types of repositories */ public readonly repo_types: WritableSignal = signal([]); public readonly show_password = signal(false); - public date_pipe = new DateFromPipe(); public readonly is_editing = signal(false); /** Emits when URI, username, or password fields lose focus */ public readonly credentials_blur = signal(0); diff --git a/src/app/systems/system-modules.component.ts b/src/app/systems/system-modules.component.ts index c093a14a1..88bbd2591 100644 --- a/src/app/systems/system-modules.component.ts +++ b/src/app/systems/system-modules.component.ts @@ -23,11 +23,10 @@ import { queryModules, showModule, } from '@placeos/ts-client'; -import { AsyncHandler } from '../common/async-handler.class'; import { describeError } from '../common/errors'; import { i18n } from '../common/locale.service'; import { notifyError, notifySuccess } from '../common/notifications'; -import { AppLink, HashMap } from '../common/types'; +import { AppLink } from '../common/types'; import { ModuleStateModalData, ViewModuleStateModalComponent, @@ -407,12 +406,10 @@ import { SystemStateService } from './system-state.service'; MatProgressBarModule, ], }) -export class SystemModulesComponent extends AsyncHandler { +export class SystemModulesComponent { private _service = inject(SystemStateService); private _dialog = inject(MatDialog); - /** Whether a device should be listened to */ - public device_listener: HashMap = {}; /** Store for ID of new module to add to system */ public readonly new_module = signal(''); /** Whether to show exec block */ @@ -562,7 +559,6 @@ export class SystemModulesComponent extends AsyncHandler { } constructor() { - super(); // Tab is reused across systems. Drop the pending module on change. effect(() => { this._item_id(); diff --git a/src/app/systems/system-triggers.component.ts b/src/app/systems/system-triggers.component.ts index 847bf30c7..b3ac9c6ee 100644 --- a/src/app/systems/system-triggers.component.ts +++ b/src/app/systems/system-triggers.component.ts @@ -2,7 +2,6 @@ import { Component, computed, inject, model } from '@angular/core'; import { PlaceTrigger } from '@placeos/ts-client'; import { copyToClipboard, unique } from '../common/general'; import { notifyInfo } from '../common/notifications'; -import { toSignal } from '../common/signals'; import { FormsModule } from '@angular/forms'; import { MatRippleModule } from '@angular/material/core'; @@ -234,9 +233,7 @@ export class SystemTriggersComponent { public readonly loading = this._service.loading; - public readonly service_triggers = toSignal(this._service.triggers, { - initialValue: [] as (PlaceTrigger & { name: string })[], - }); + public readonly service_triggers = this._service.triggers; public readonly trigger_state: HashMap = {}; diff --git a/src/app/systems/systems.component.ts b/src/app/systems/systems.component.ts index d1a002557..8c3674481 100644 --- a/src/app/systems/systems.component.ts +++ b/src/app/systems/systems.component.ts @@ -57,7 +57,6 @@ import { SystemStateService } from './system-state.service'; } @else if (item()?.id) { diff --git a/src/app/triggers/trigger-about.component.ts b/src/app/triggers/trigger-about.component.ts index b54fec09e..05985f680 100644 --- a/src/app/triggers/trigger-about.component.ts +++ b/src/app/triggers/trigger-about.component.ts @@ -8,17 +8,14 @@ import { TriggerTimeCondition, querySystems, } from '@placeos/ts-client'; -import { toSignal } from '../common/signals'; import { AsyncPipe, DatePipe, JsonPipe } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatRippleModule } from '@angular/material/core'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { AsyncHandler } from '../common/async-handler.class'; import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component'; import { IconComponent } from '../ui/icon.component'; import { DateFromPipe } from '../ui/pipes/date-from.pipe'; -import { FormatListPipe } from '../ui/pipes/format-list.pipe'; import { MarkdownPipe } from '../ui/pipes/markdown.pipe'; import { SimpleTableComponent } from '../ui/simple-table.component'; import { TranslatePipe } from '../ui/translate.pipe'; @@ -274,7 +271,13 @@ import { TriggerStateService } from './trigger-state.service';
- {{ row.emails.length }} Address(es)  | Body Length: {{ row.content.length }}
@@ -318,7 +321,6 @@ import { TriggerStateService } from './trigger-state.service'; IconComponent, MatRippleModule, MatTooltipModule, - FormatListPipe, SimpleTableComponent, ItemSearchFieldComponent, FormsModule, @@ -329,16 +331,14 @@ import { TriggerStateService } from './trigger-state.service'; JsonPipe, ], }) -export class TriggerAboutComponent extends AsyncHandler { +export class TriggerAboutComponent { private _service = inject(TriggerStateService); /** System to use for conditions with systen variables and functions */ public readonly template_system = signal( undefined, ); - private readonly _item = toSignal(this._service.item, { - initialValue: {} as PlaceTrigger, - }); + private readonly _item = this._service.item; public get item(): PlaceTrigger { return this._item(); } diff --git a/src/app/triggers/trigger-instances.component.ts b/src/app/triggers/trigger-instances.component.ts index c3d39b044..0ea9edf09 100644 --- a/src/app/triggers/trigger-instances.component.ts +++ b/src/app/triggers/trigger-instances.component.ts @@ -1,6 +1,4 @@ import { Component, inject } from '@angular/core'; -import { PlaceTrigger } from '@placeos/ts-client'; -import { toSignal } from '../common/signals'; import { HashMap } from '../common/types'; @@ -8,7 +6,6 @@ import { MatRippleModule } from '@angular/material/core'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; -import { AsyncHandler } from '../common/async-handler.class'; import { IconComponent } from '../ui/icon.component'; import { LoadingLabelDirective } from '../ui/loading-label.directive'; import { DateFromPipe } from '../ui/pipes/date-from.pipe'; @@ -112,21 +109,15 @@ import { TriggerStateService } from './trigger-state.service'; DateFromPipe, ], }) -export class TriggerInstancesComponent extends AsyncHandler { +export class TriggerInstancesComponent { private _service = inject(TriggerStateService); /** List of systems associated with the trigger */ public readonly instances = this._service.instances; - public readonly loading = toSignal(this._service.loading, { - initialValue: false, - }); + public readonly loading = this._service.loading; /** Map of systems ids to connected status */ public connected: HashMap = {}; public readonly deleteTrigger = (s) => this._service.removeTriggerFromParent(s); - - public get item(): PlaceTrigger { - return this._service.active_item as PlaceTrigger; - } } diff --git a/src/app/triggers/triggers.component.ts b/src/app/triggers/triggers.component.ts index 0ba11f002..6b267f2c5 100644 --- a/src/app/triggers/triggers.component.ts +++ b/src/app/triggers/triggers.component.ts @@ -3,13 +3,10 @@ import { MatRippleModule } from '@angular/material/core'; import { MatTabNavPanel } from '@angular/material/tabs'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; -import { PlaceTrigger } from '@placeos/ts-client'; import { extensionsForItem } from '../common/api'; -import { AsyncHandler } from '../common/async-handler.class'; import { PlaceDebugService } from '../common/debug.service'; import { ActiveItemService } from '../common/item.service'; import { i18n } from '../common/locale.service'; -import { toSignal } from '../common/signals'; import { DebugOutputComponent } from '../ui/debug-output.component'; import { IconComponent } from '../ui/icon.component'; import { ItemDetailsSkeletonComponent } from '../ui/item-details-skeleton.component'; @@ -60,7 +57,6 @@ import { TriggerStateService } from './trigger-state.service'; } @else if (item()?.id) { @@ -122,7 +118,7 @@ import { TriggerStateService } from './trigger-state.service'; SidebarMenuComponent, ], }) -export class TriggersComponent extends AsyncHandler { +export class TriggersComponent { protected _service = inject(ActiveItemService); private _debug = inject(PlaceDebugService); private _state = inject(TriggerStateService); @@ -133,13 +129,9 @@ export class TriggersComponent extends AsyncHandler { public readonly instance_count = computed( () => this._state.instances().length, ); - public readonly loading = toSignal(this._service.loading, { - initialValue: false, - }); + public readonly loading = this._service.loading; public readonly debug_position = this._debug.position; - public readonly item = toSignal(this._service.item, { - initialValue: null as PlaceTrigger | null, - }); + public readonly item = this._service.item; public readonly newItem = () => this._service.create(); public readonly scroll = signal(0); public readonly tab_list = computed(() => [ diff --git a/src/app/ui/application-picker-tooltip.component.ts b/src/app/ui/application-picker-tooltip.component.ts index 851458359..6f9eb265b 100644 --- a/src/app/ui/application-picker-tooltip.component.ts +++ b/src/app/ui/application-picker-tooltip.component.ts @@ -17,6 +17,17 @@ interface SidebarApplication { const PAGE_SIZE = 9; +/** Whether an application redirect URI can open in a browser tab */ +export function isSupportedRedirectUri(uri: string) { + if (!uri) return false; + try { + const protocol = new URL(uri, location.origin).protocol; + return protocol === 'http:' || protocol === 'https:'; + } catch { + return false; + } +} + @Component({ selector: 'application-picker-tooltip', template: ` @@ -141,7 +152,7 @@ export class ApplicationPickerTooltipComponent implements OnInit { authority_id: active_authority.id, } as Record).catch(() => null); const applications = (response?.data || []) - .filter((app) => this.isSupportedRedirectUri(app?.redirect_uri)) + .filter((app) => isSupportedRedirectUri(app?.redirect_uri)) .sort((lhs, rhs) => (lhs.name || this.nameFromUri(lhs.redirect_uri)).localeCompare( rhs.name || this.nameFromUri(rhs.redirect_uri), @@ -209,16 +220,6 @@ export class ApplicationPickerTooltipComponent implements OnInit { } } - private isSupportedRedirectUri(uri: string) { - if (!uri) return false; - try { - const protocol = new URL(uri, location.origin).protocol; - return protocol === 'http:' || protocol === 'https:'; - } catch { - return false; - } - } - private faviconUrls(uri: string) { const path = this.redirectPath(uri); return [ diff --git a/src/app/ui/custom-fields/date-calendar.component.ts b/src/app/ui/custom-fields/date-calendar.component.ts index 06694943c..6814a1e8d 100644 --- a/src/app/ui/custom-fields/date-calendar.component.ts +++ b/src/app/ui/custom-fields/date-calendar.component.ts @@ -21,7 +21,6 @@ import { startOfMonth, startOfWeek, } from 'date-fns'; -import { AsyncHandler } from '../../common/async-handler.class'; import { SettingsService } from '../../common/settings.service'; import { IconComponent } from '../icon.component'; @@ -45,10 +44,7 @@ interface DateItem { icon matRipple name="schedule-next-month" - [disabled]=" - disabled() || - date_list()[0]?.id < from() - " + [disabled]="disabled() || date_list()[0]?.id < from()" (click)="changeMonth(-1)" > chevron_left @@ -58,10 +54,7 @@ interface DateItem { icon matRipple name="schedule-previous-month" - [disabled]=" - disabled() || - date_list()[34]?.id > to() - " + [disabled]="disabled() || date_list()[34]?.id > to()" (click)="changeMonth(1)" > chevron_right @@ -124,7 +117,6 @@ interface DateItem { imports: [IconComponent, DatePipe, SlicePipe], }) export class DateCalendarComponent - extends AsyncHandler implements ControlValueAccessor, OnChanges, OnInit { private _settings = inject(SettingsService); diff --git a/src/app/ui/custom-fields/date-field.component.ts b/src/app/ui/custom-fields/date-field.component.ts index 85d7160eb..dee36bc20 100644 --- a/src/app/ui/custom-fields/date-field.component.ts +++ b/src/app/ui/custom-fields/date-field.component.ts @@ -2,9 +2,6 @@ import { DatePipe } from '@angular/common'; import { Component, forwardRef, - inject, - Injector, - input, model, OnInit, signal, @@ -14,22 +11,13 @@ import { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, - NgControl, } from '@angular/forms'; import { addYears, endOfDay, set, startOfDay } from 'date-fns'; -import { AsyncHandler } from '../../common/async-handler.class'; -import { getTimezoneOffsetString } from '../../common/timezone-helpers'; import { CustomTooltipComponent } from '../custom-tooltip.component'; import { IconComponent } from '../icon.component'; import { TranslatePipe } from '../translate.pipe'; import { DateCalendarComponent } from './date-calendar.component'; -export enum TimezoneDiffRange { - Both, - Start, - End, -} - @Component({ selector: 'a-date-field', template: ` @@ -48,43 +36,25 @@ export enum TimezoneDiffRange { >
@if (date()) { - {{ date() | date: date_format }} + {{ date() | date: 'MMMM d, yyyy' }} } @else { {{ 'COMMON.DATE_EMPTY' | translate }} }
- @if (timezone() && tz) { -
- @if (range() !== 2) { - {{ start_of_day }} - } - @if (range() === 0) { - - - } - @if (range() !== 1) { - {{ end_of_day }} - } -
- }
today
-
- @if (has_error) { - - } -
+
@@ -107,91 +77,26 @@ export enum TimezoneDiffRange { DatePipe, ], }) -export class DateFieldComponent - extends AsyncHandler - implements OnInit, ControlValueAccessor -{ - private _injector = inject(Injector); - - /** Earliest date available the user is allowed to pick */ - public readonly from = input(startOfDay(Date.now()).valueOf()); - /** Latest date available the user is allowed to pick */ - public readonly to = input(undefined); - /** Index of the day to start the week on when displaying the calendar */ - public readonly week_start = input(0); - public readonly use_24hr = input(false); +export class DateFieldComponent implements OnInit, ControlValueAccessor { /** Whether form control is disabled */ public readonly disabled = model(false); - public readonly short = input(false); - public readonly timezone = input(''); - public readonly range = input(TimezoneDiffRange.Both); /** Currently selected date */ public readonly date = signal(null); public readonly now = Date.now(); + /** Earliest date the user is allowed to pick */ + public readonly from = startOfDay(this.now).valueOf(); + /** Latest date the user is allowed to pick */ + public readonly until = addYears(endOfDay(this.now), 1).valueOf(); /** Form control on change handler */ private _onChange: (_: number) => void; /** Form control on touch handler */ private _onTouch: (_: number) => void; - private _control?: NgControl; - - public get date_format() { - return this.short() ? 'MMM d, yyyy' : 'MMMM d, yyyy'; - } - - public get time_format() { - return this.use_24hr() ? 'HH : mm' : 'h : mm a'; - } - - private _date_pipe = new DatePipe('en'); - - public get start_of_day() { - const start = startOfDay(this.date()).valueOf(); - const format = `MMM d, ${this.time_format}${this.range() === 1 ? ' (z)' : ''}`; - return this._date_pipe.transform(start, format, this.tz); - } - - public get end_of_day() { - const end = endOfDay(this.date()).valueOf(); - const format = `MMM d, ${this.time_format}${this.range() === 1 ? ' (z)' : ''}`; - return this._date_pipe.transform(end, format, this.tz); - } - - public get has_error(): boolean { - return this._control?.invalid && this._control?.touched; - } - - private _local_tz = getTimezoneOffsetString( - Intl.DateTimeFormat().resolvedOptions().timeZone, - ); - - public get tz() { - const tz = this.timezone(); - if (!tz) return ''; - const tz_offset = getTimezoneOffsetString(tz); - return tz_offset === this._local_tz ? '' : tz_offset; - } private readonly _tooltip = viewChild(CustomTooltipComponent); - /** First allowed date on the calendar */ - public get fromDate(): number { - const date = new Date(this.from()); - return ( - isNaN(date.getTime()) ? startOfDay(new Date()) : date - ).valueOf(); - } - /** Current date value */ - public get until(): number { - const date = new Date(this.to()); - return ( - isNaN(date.getTime()) ? addYears(endOfDay(new Date()), 1) : date - ).valueOf(); - } - public ngOnInit() { - this._control = this._injector.get(NgControl); this.date.set(Date.now()); } @@ -208,9 +113,7 @@ export class DateFieldComponent minutes: old_date.getMinutes(), }).valueOf(); // Check that new date is before from - if (new_date < this.fromDate.valueOf()) { - new_date = this.fromDate.valueOf(); - } + if (new_date < this.from) new_date = this.from; this.date.set(new_date); if (this._onChange) { this._onChange(new_date); diff --git a/src/app/ui/custom-fields/item-search-field.component.ts b/src/app/ui/custom-fields/item-search-field.component.ts index b561c78da..3edee2648 100644 --- a/src/app/ui/custom-fields/item-search-field.component.ts +++ b/src/app/ui/custom-fields/item-search-field.component.ts @@ -32,7 +32,6 @@ import { escapeHtml } from '../../common/general'; import { HashMap } from '../../common/types'; import { IconComponent } from '../icon.component'; import { LoadingLabelDirective } from '../loading-label.directive'; -import { SanitizePipe } from '../pipes/sanitise.pipe'; interface SearchItem { id: string; @@ -144,10 +143,7 @@ interface SearchItem {
-
+
@if (option.notes) { {{ option.notes @@ -196,7 +192,6 @@ interface SearchItem { imports: [ LoadingLabelDirective, MatAutocompleteModule, - SanitizePipe, MatFormFieldModule, MatInputModule, FormsModule, @@ -263,9 +258,7 @@ export class ItemSearchFieldComponent options && options.length > 0 ? options : !min_length || trimmed_query.length >= min_length - ? await query_fn(trimmed_query).catch( - () => [] as T[], - ) + ? await query_fn(trimmed_query).catch(() => [] as T[]) : []; const search = trimmed_query.toLowerCase(); return list.filter((item: T) => @@ -315,7 +308,6 @@ export class ItemSearchFieldComponent } public ngOnChanges(changes: SimpleChanges): void { - if (changes.service) this.search_str.set(''); if (changes.options) this._changed.set(Date.now()); } diff --git a/src/app/ui/custom-fields/object-list-field.component.ts b/src/app/ui/custom-fields/object-list-field.component.ts index 3572397a3..564facf61 100644 --- a/src/app/ui/custom-fields/object-list-field.component.ts +++ b/src/app/ui/custom-fields/object-list-field.component.ts @@ -8,7 +8,6 @@ import { import { MatRippleModule } from '@angular/material/core'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { AsyncHandler } from '../../common/async-handler.class'; import { HashMap } from '../../common/types'; import { IconComponent } from '../icon.component'; import { TranslatePipe } from '../translate.pipe'; @@ -135,10 +134,7 @@ import { TranslatePipe } from '../translate.pipe'; MatInputModule, ], }) -export class ObjectListFieldComponent - extends AsyncHandler - implements ControlValueAccessor -{ +export class ObjectListFieldComponent implements ControlValueAccessor { /** List of fields that can be populated for each object */ public readonly fields = input(undefined); public readonly disabled = signal(false); diff --git a/src/app/ui/custom-fields/system-exec/function-argument.component.ts b/src/app/ui/custom-fields/system-exec/function-argument.component.ts index a82a87229..f02e024a7 100644 --- a/src/app/ui/custom-fields/system-exec/function-argument.component.ts +++ b/src/app/ui/custom-fields/system-exec/function-argument.component.ts @@ -16,7 +16,6 @@ import { import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { PlaceModuleFunction } from '@placeos/ts-client'; -import { AsyncHandler } from '../../../common/async-handler.class'; import { HashMap } from '../../../common/types'; import { TranslatePipe } from '../../translate.pipe'; @@ -114,7 +113,6 @@ const validateType = (type: string, raw_value: unknown) => { imports: [TranslatePipe, MatFormFieldModule, MatInputModule, FormsModule], }) export class FunctionArgumentComponent - extends AsyncHandler implements OnChanges, ControlValueAccessor { public readonly method = input(undefined); diff --git a/src/app/ui/custom-tooltip.component.ts b/src/app/ui/custom-tooltip.component.ts index 2a7287c15..a3b23645c 100644 --- a/src/app/ui/custom-tooltip.component.ts +++ b/src/app/ui/custom-tooltip.component.ts @@ -11,25 +11,18 @@ import { input, OnChanges, OnDestroy, - signal, SimpleChanges, TemplateRef, Type, viewChild, - WritableSignal, } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { filter } from 'rxjs'; import { AsyncHandler } from '../common/async-handler.class'; -import { SanitizePipe } from './pipes/sanitise.pipe'; -export class CustomTooltipData { - data: T; - close: () => void; - constructor(d) { - this.data = d.data; - this.close = d.close || (() => null); - } +/** Injected into tooltip content so it can close its tooltip */ +export abstract class CustomTooltipData { + abstract close: () => void; } @Component({ @@ -45,21 +38,16 @@ export class CustomTooltipData { *ngComponentOutlet="component(); injector: injector" /> } - @case ('html') { -
- } @default { - + } }
`, - imports: [PortalModule, SanitizePipe, NgComponentOutlet, NgTemplateOutlet], + imports: [PortalModule, NgComponentOutlet, NgTemplateOutlet], }) -export class CustomTooltipComponent +export class CustomTooltipComponent extends AsyncHandler implements OnChanges, OnDestroy { @@ -73,11 +61,9 @@ export class CustomTooltipComponent /** Vertical position of the rendered overlay */ public readonly yPosition = input<'top' | 'center' | 'bottom'>('top'); /** Content to render in the tooltip */ - public readonly content = input< - TemplateRef | Type | string - >(undefined); - /** Data associated with the tooltip content */ - public readonly data = input(undefined); + public readonly content = input | Type>( + undefined, + ); /** Whether tooltip has a backdrop */ public readonly backdrop = input(true); /** Whether tooltip has a backdrop */ @@ -85,13 +71,13 @@ export class CustomTooltipComponent /** Delay time in milliseconds to close after hover */ public readonly delay = input(0); /** Type of content to render */ - public readonly type: WritableSignal<'template' | 'component' | 'html'> = - signal('template'); + public readonly type = computed(() => + this.content() instanceof TemplateRef ? 'template' : 'component', + ); public readonly template = computed( () => this.content() as TemplateRef, ); public readonly component = computed(() => this.content() as Type); - public readonly html = computed(() => this.content() as string); public injector: Injector; @@ -131,7 +117,6 @@ export class CustomTooltipComponent if (hover && delay) { this.timeout('onclose', () => this.close(), delay); } - this._updateType(); if (this._overlay_ref) this.close(); const _portal = this._portal(); if (!_portal) return; @@ -197,23 +182,12 @@ export class CustomTooltipComponent } } - private _updateType() { - const content = this.content(); - this.type.set( - typeof content === 'string' - ? 'html' - : content instanceof TemplateRef - ? 'template' - : 'component', - ); - } - private _updateInjector() { this.injector = Injector.create({ providers: [ { provide: CustomTooltipData, - useValue: { data: this.data(), close: () => this.close() }, + useValue: { close: () => this.close() }, }, ], parent: this._injector, diff --git a/src/app/ui/debug-output.component.ts b/src/app/ui/debug-output.component.ts index bbf3099ab..b86001a8e 100644 --- a/src/app/ui/debug-output.component.ts +++ b/src/app/ui/debug-output.component.ts @@ -3,7 +3,6 @@ import { ElementRef, Renderer2, inject, - input, signal, viewChild, } from '@angular/core'; @@ -30,7 +29,7 @@ import { TranslatePipe } from './translate.pipe'; (window:resize)="onWindowResize()" >
- @if (can_edit() && canMutate(4)) { + @if (canMutate(4)) { } - @if (can_edit() && canMutate(8)) { + @if (canMutate(8)) {