From 1bccbd41738b655d99b318be3f58690907aa598b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 30 Sep 2021 01:34:52 +0200 Subject: [PATCH] Use browser default time and number formatting with polyfills if needed (#9481) Co-authored-by: Paulus Schoutsen --- .github/workflows/ci.yaml | 6 +- .github/workflows/demo.yaml | 2 +- .github/workflows/release.yaml | 2 +- .mocharc.cjs | 4 - build-scripts/bundle.js | 1 + build-scripts/webpack.js | 5 + hassio/src/backups/hassio-backups.ts | 4 +- netlify.toml | 2 +- package.json | 26 +- src/common/datetime/check_options_support.ts | 34 - src/common/datetime/format_date.ts | 58 +- src/common/datetime/format_date_time.ts | 35 +- src/common/datetime/format_time.ts | 37 +- src/common/datetime/relative_time.ts | 76 +- src/common/entity/compute_state_display.ts | 2 +- .../{string => number}/format_number.ts | 2 +- src/common/translations/localize.ts | 72 +- .../chart/state-history-chart-line.ts | 2 +- .../chart/state-history-chart-timeline.ts | 2 +- src/components/chart/statistics-chart.ts | 2 +- src/components/entity/ha-state-label-badge.ts | 2 +- src/components/ha-climate-state.ts | 2 +- src/components/ha-gauge.ts | 2 +- src/components/ha-relative-time.ts | 7 +- src/components/ha-water_heater-state.js | 2 +- src/components/trace/hat-trace-timeline.ts | 8 +- src/data/weather.ts | 2 +- .../more-info/controls/more-info-sun.ts | 2 +- .../more-info/controls/more-info-weather.ts | 2 +- .../energy/hui-energy-devices-graph-card.ts | 2 +- .../energy/hui-energy-distribution-card.ts | 2 +- .../cards/energy/hui-energy-gas-graph-card.ts | 2 +- .../hui-energy-grid-neutrality-gauge-card.ts | 2 +- .../energy/hui-energy-solar-graph-card.ts | 2 +- .../energy/hui-energy-sources-table-card.ts | 2 +- .../energy/hui-energy-usage-graph-card.ts | 2 +- src/panels/lovelace/cards/hui-entity-card.ts | 2 +- src/panels/lovelace/cards/hui-glance-card.ts | 4 +- .../lovelace/cards/hui-thermostat-card.ts | 2 +- .../cards/hui-weather-forecast-card.ts | 2 +- .../components/hui-timestamp-display.ts | 14 +- .../entity-rows/hui-weather-entity-row.ts | 2 +- .../special-rows/hui-attribute-row.ts | 2 +- .../ha-long-lived-access-tokens-card.ts | 7 +- .../profile/ha-pick-number-format-row.ts | 2 +- src/panels/profile/ha-refresh-tokens-card.ts | 6 +- src/resources/compatibility.ts | 13 +- src/translations/en.json | 24 +- test-mocha/common/datetime/relative_time.ts | 217 ---- {test-mocha => test}/.eslintrc | 0 {test-mocha => test}/common/config/version.ts | 0 .../common/datetime/check_valid_date.ts | 0 .../datetime/duration_to_seconds_test.ts | 0 .../common/datetime/format_date.ts | 0 .../common/datetime/format_date_time.ts | 8 +- .../common/datetime/format_time.ts | 0 test/common/datetime/relative_time.ts | 115 ++ .../datetime/seconds_to_duration_test.ts | 0 .../entity/attribute_class_names_test.ts | 0 .../common/entity/can_toggle_domain_test.ts | 0 .../common/entity/can_toggle_state_test.ts | 0 .../common/entity/compute_domain.ts | 0 .../common/entity/compute_state_display.ts | 8 +- .../common/entity/compute_state_domain.ts | 0 .../common/entity/entity_filter.ts | 0 .../common/entity/extract_views.spec.ts | 0 .../common/entity/feature_class_names_test.ts | 0 .../common/entity/get_group_entities.spec.ts | 0 .../common/entity/get_view_entities.spec.ts | 0 .../common/entity/has_location.test.ts | 0 .../common/entity/split_by_groups.spec.ts | 0 .../common/entity/state_card_type_test.ts | 0 .../entity/state_more_info_type_test.ts | 0 .../common/entity/test_util.ts | 0 .../entity/timer_time_remaining_test.ts | 0 .../common/string/format_number.ts | 2 +- {test-mocha => test}/common/string/is_date.ts | 0 .../common/string/sequence_matching.test.ts | 0 .../common/util/parse_aspect_ratio_test.ts | 0 {test-mocha => test}/data/history.spec.ts | 0 .../external_app/external_messaging.spec.ts | 0 .../hassio/create_session.spec.ts | 0 .../lovelace/editor/config-util.spec.ts | 0 test/setup.js | 12 + {test-mocha => test}/testconf.js | 0 {test-mocha => test}/tsconfig.test.json | 0 {test-mocha => test}/util/calculate.spec.ts | 0 .../util/generate-brands-url-spec.ts | 0 .../util/generate-documentation-url.spec.ts | 0 test/webpack.config.js | 7 + yarn.lock | 1060 +++++++++-------- 91 files changed, 952 insertions(+), 974 deletions(-) delete mode 100644 .mocharc.cjs delete mode 100644 src/common/datetime/check_options_support.ts rename src/common/{string => number}/format_number.ts (98%) delete mode 100644 test-mocha/common/datetime/relative_time.ts rename {test-mocha => test}/.eslintrc (100%) rename {test-mocha => test}/common/config/version.ts (100%) rename {test-mocha => test}/common/datetime/check_valid_date.ts (100%) rename {test-mocha => test}/common/datetime/duration_to_seconds_test.ts (100%) rename {test-mocha => test}/common/datetime/format_date.ts (100%) rename {test-mocha => test}/common/datetime/format_date_time.ts (89%) rename {test-mocha => test}/common/datetime/format_time.ts (100%) create mode 100644 test/common/datetime/relative_time.ts rename {test-mocha => test}/common/datetime/seconds_to_duration_test.ts (100%) rename {test-mocha => test}/common/entity/attribute_class_names_test.ts (100%) rename {test-mocha => test}/common/entity/can_toggle_domain_test.ts (100%) rename {test-mocha => test}/common/entity/can_toggle_state_test.ts (100%) rename {test-mocha => test}/common/entity/compute_domain.ts (100%) rename {test-mocha => test}/common/entity/compute_state_display.ts (98%) rename {test-mocha => test}/common/entity/compute_state_domain.ts (100%) rename {test-mocha => test}/common/entity/entity_filter.ts (100%) rename {test-mocha => test}/common/entity/extract_views.spec.ts (100%) rename {test-mocha => test}/common/entity/feature_class_names_test.ts (100%) rename {test-mocha => test}/common/entity/get_group_entities.spec.ts (100%) rename {test-mocha => test}/common/entity/get_view_entities.spec.ts (100%) rename {test-mocha => test}/common/entity/has_location.test.ts (100%) rename {test-mocha => test}/common/entity/split_by_groups.spec.ts (100%) rename {test-mocha => test}/common/entity/state_card_type_test.ts (100%) rename {test-mocha => test}/common/entity/state_more_info_type_test.ts (100%) rename {test-mocha => test}/common/entity/test_util.ts (100%) rename {test-mocha => test}/common/entity/timer_time_remaining_test.ts (100%) rename {test-mocha => test}/common/string/format_number.ts (96%) rename {test-mocha => test}/common/string/is_date.ts (100%) rename {test-mocha => test}/common/string/sequence_matching.test.ts (100%) rename {test-mocha => test}/common/util/parse_aspect_ratio_test.ts (100%) rename {test-mocha => test}/data/history.spec.ts (100%) rename {test-mocha => test}/external_app/external_messaging.spec.ts (100%) rename {test-mocha => test}/hassio/create_session.spec.ts (100%) rename {test-mocha => test}/panels/lovelace/editor/config-util.spec.ts (100%) create mode 100644 test/setup.js rename {test-mocha => test}/testconf.js (100%) rename {test-mocha => test}/tsconfig.test.json (100%) rename {test-mocha => test}/util/calculate.spec.ts (100%) rename {test-mocha => test}/util/generate-brands-url-spec.ts (100%) rename {test-mocha => test}/util/generate-documentation-url.spec.ts (100%) create mode 100644 test/webpack.config.js diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1d7de52612..a03966bb00 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,7 +12,7 @@ on: env: NODE_VERSION: 14 - NODE_OPTIONS: --max_old_space_size=4096 + NODE_OPTIONS: --max_old_space_size=6144 jobs: lint: @@ -53,8 +53,8 @@ jobs: run: yarn install env: CI: true - - name: Run Mocha - run: yarn run mocha + - name: Run Tests + run: yarn run test build: runs-on: ubuntu-latest needs: [lint, test] diff --git a/.github/workflows/demo.yaml b/.github/workflows/demo.yaml index f257d5e19d..3896f292c0 100644 --- a/.github/workflows/demo.yaml +++ b/.github/workflows/demo.yaml @@ -7,7 +7,7 @@ on: env: NODE_VERSION: 14 - NODE_OPTIONS: --max_old_space_size=4096 + NODE_OPTIONS: --max_old_space_size=6144 jobs: deploy: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 74d8e13eda..87b99837d5 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -8,7 +8,7 @@ on: env: PYTHON_VERSION: 3.8 NODE_VERSION: 14 - NODE_OPTIONS: --max_old_space_size=4096 + NODE_OPTIONS: --max_old_space_size=6144 jobs: release: diff --git a/.mocharc.cjs b/.mocharc.cjs deleted file mode 100644 index c34a155aba..0000000000 --- a/.mocharc.cjs +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - require: "test-mocha/testconf.js", - timeout: 10000, -}; diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js index f8e2650f7e..5402abc16f 100644 --- a/build-scripts/bundle.js +++ b/build-scripts/bundle.js @@ -82,6 +82,7 @@ module.exports.babelOptions = ({ latestBuild }) => ({ // Only support the syntax, Webpack will handle it. "@babel/plugin-syntax-import-meta", "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-syntax-top-level-await", "@babel/plugin-proposal-optional-chaining", "@babel/plugin-proposal-nullish-coalescing-operator", ["@babel/plugin-proposal-decorators", { decoratorsBeforeExport: true }], diff --git a/build-scripts/webpack.js b/build-scripts/webpack.js index 8eaa3b13d0..bc07a7ec9f 100644 --- a/build-scripts/webpack.js +++ b/build-scripts/webpack.js @@ -6,6 +6,7 @@ const { WebpackManifestPlugin } = require("webpack-manifest-plugin"); const paths = require("./paths.js"); const bundle = require("./bundle.js"); const log = require("fancy-log"); +const WebpackBar = require("webpackbar"); class LogStartCompilePlugin { ignoredFirst = false; @@ -74,6 +75,7 @@ const createWebpackConfig = ({ chunkIds: isProdBuild && !isStatsBuild ? "deterministic" : "named", }, plugins: [ + new WebpackBar({ fancy: !isProdBuild }), new WebpackManifestPlugin({ // Only include the JS of entrypoints filter: (file) => file.isInitial && !file.name.endsWith(".map"), @@ -149,6 +151,9 @@ const createWebpackConfig = ({ // To silence warning in worker plugin globalObject: "self", }, + experiments: { + topLevelAwait: true, + }, }; }; diff --git a/hassio/src/backups/hassio-backups.ts b/hassio/src/backups/hassio-backups.ts index e5e98c7c35..8e4c3f7ac9 100644 --- a/hassio/src/backups/hassio-backups.ts +++ b/hassio/src/backups/hassio-backups.ts @@ -14,7 +14,7 @@ import { customElement, property, query, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import memoizeOne from "memoize-one"; import { atLeastVersion } from "../../../src/common/config/version"; -import relativeTime from "../../../src/common/datetime/relative_time"; +import { relativeTime } from "../../../src/common/datetime/relative_time"; import { HASSDomEvent } from "../../../src/common/dom/fire_event"; import { DataTableColumnContainer, @@ -133,7 +133,7 @@ export class HassioBackups extends LitElement { filterable: true, sortable: true, template: (entry: string) => - relativeTime(new Date(entry), this.hass.localize), + relativeTime(new Date(entry), this.hass.locale), }, secondary: { title: "", diff --git a/netlify.toml b/netlify.toml index 548eb2f450..cf89ff4184 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,3 @@ [build.environment] YARN_VERSION = "1.22.11" - NODE_OPTIONS = "--max_old_space_size=4096" + NODE_OPTIONS = "--max_old_space_size=6144" diff --git a/package.json b/package.json index 4df3e45fa7..5c3d9447f0 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,7 @@ "lint:lit": "lit-analyzer \"**/src/**/*.ts\" --format markdown --outFile result.md", "lint": "yarn run lint:eslint && yarn run lint:prettier && yarn run lint:types", "format": "yarn run format:eslint && yarn run format:prettier", - "mocha": "ts-mocha -p test-mocha/tsconfig.test.json \"test-mocha/**/*.ts\"", - "test": "yarn run mocha" + "test": "instant-mocha --webpack-config ./test/webpack.config.js --require ./test/setup.js \"test/**/*.ts\"" }, "author": "Paulus Schoutsen (http://paulusschoutsen.nl)", "license": "Apache-2.0", @@ -34,9 +33,13 @@ "@codemirror/stream-parser": "^0.19.1", "@codemirror/text": "^0.19.2", "@codemirror/view": "^0.19.4", + "@formatjs/intl-datetimeformat": "^4.2.4", "@formatjs/intl-getcanonicallocales": "^1.7.3", - "@formatjs/intl-locale": "^2.4.37", - "@formatjs/intl-pluralrules": "^4.1.3", + "@formatjs/intl-locale": "^2.4.38", + "@formatjs/intl-numberformat": "^7.2.4", + "@formatjs/intl-pluralrules": "^4.1.4", + "@formatjs/intl-relativetimeformat": "^9.3.1", + "@formatjs/intl-utils": "^3.8.4", "@fullcalendar/common": "5.9.0", "@fullcalendar/core": "5.9.0", "@fullcalendar/daygrid": "5.9.0", @@ -103,7 +106,6 @@ "date-fns": "^2.23.0", "deep-clone-simple": "^1.1.1", "deep-freeze": "^0.0.1", - "fecha": "^4.2.0", "fuse.js": "^6.0.0", "google-timezones-json": "^1.0.2", "hls.js": "^1.0.10", @@ -152,6 +154,7 @@ "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/preset-env": "^7.14.7", "@babel/preset-typescript": "^7.14.5", "@koa/cors": "^3.1.0", @@ -197,6 +200,7 @@ "gulp-zopfli-green": "^3.0.1", "html-minifier": "^4.0.0", "husky": "^1.3.1", + "instant-mocha": "^1.3.1", "lint-staged": "^11.0.1", "lit-analyzer": "^1.2.1", "lodash.template": "^4.5.0", @@ -216,16 +220,16 @@ "sinon": "^11.0.0", "source-map-url": "^0.4.0", "systemjs": "^6.3.2", - "terser-webpack-plugin": "^5.1.4", + "terser-webpack-plugin": "^5.2.4", "ts-lit-plugin": "^1.2.1", - "ts-mocha": "^8.0.0", "typescript": "^4.3.5", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", - "webpack": "^5.43.0", - "webpack-cli": "^4.7.2", - "webpack-dev-server": "^3.11.2", - "webpack-manifest-plugin": "^3.1.1", + "webpack": "^5.55.1", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.3.0", + "webpack-manifest-plugin": "^4.0.2", + "webpackbar": "^5.0.0-3", "workbox-build": "^6.1.5" }, "_comment": "Polymer 3.2 contained a bug, fixed in https://github.com/Polymer/polymer/pull/5569, add as patch", diff --git a/src/common/datetime/check_options_support.ts b/src/common/datetime/check_options_support.ts deleted file mode 100644 index 3057a8cae3..0000000000 --- a/src/common/datetime/check_options_support.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Check for support of native locale string options -function checkToLocaleDateStringSupportsOptions() { - try { - new Date().toLocaleDateString("i"); - } catch (e) { - return e.name === "RangeError"; - } - return false; -} - -function checkToLocaleTimeStringSupportsOptions() { - try { - new Date().toLocaleTimeString("i"); - } catch (e) { - return e.name === "RangeError"; - } - return false; -} - -function checkToLocaleStringSupportsOptions() { - try { - new Date().toLocaleString("i"); - } catch (e) { - return e.name === "RangeError"; - } - return false; -} - -export const toLocaleDateStringSupportsOptions = - checkToLocaleDateStringSupportsOptions(); -export const toLocaleTimeStringSupportsOptions = - checkToLocaleTimeStringSupportsOptions(); -export const toLocaleStringSupportsOptions = - checkToLocaleStringSupportsOptions(); diff --git a/src/common/datetime/format_date.ts b/src/common/datetime/format_date.ts index f359973789..fb6e75feb0 100644 --- a/src/common/datetime/format_date.ts +++ b/src/common/datetime/format_date.ts @@ -1,13 +1,15 @@ -import { format } from "fecha"; import memoizeOne from "memoize-one"; import { FrontendLocaleData } from "../../data/translation"; -import { toLocaleDateStringSupportsOptions } from "./check_options_support"; +import { polyfillsLoaded } from "../translations/localize"; + +if (__BUILD__ === "latest" && polyfillsLoaded) { + await polyfillsLoaded; +} // Tuesday, August 10 -export const formatDateWeekday = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateWeekdayMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "dddd, MMMM D"); +export const formatDateWeekday = (dateObj: Date, locale: FrontendLocaleData) => + formatDateWeekdayMem(locale).format(dateObj); + const formatDateWeekdayMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -18,10 +20,9 @@ const formatDateWeekdayMem = memoizeOne( ); // August 10, 2021 -export const formatDate = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "MMMM D, YYYY"); +export const formatDate = (dateObj: Date, locale: FrontendLocaleData) => + formatDateMem(locale).format(dateObj); + const formatDateMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -32,10 +33,9 @@ const formatDateMem = memoizeOne( ); // 10/08/2021 -export const formatDateNumeric = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateNumericMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "M/D/YYYY"); +export const formatDateNumeric = (dateObj: Date, locale: FrontendLocaleData) => + formatDateNumericMem(locale).format(dateObj); + const formatDateNumericMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -46,10 +46,9 @@ const formatDateNumericMem = memoizeOne( ); // Aug 10 -export const formatDateShort = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateShortMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "MMM D"); +export const formatDateShort = (dateObj: Date, locale: FrontendLocaleData) => + formatDateShortMem(locale).format(dateObj); + const formatDateShortMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -59,10 +58,11 @@ const formatDateShortMem = memoizeOne( ); // August 2021 -export const formatDateMonthYear = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateMonthYearMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "MMMM YYYY"); +export const formatDateMonthYear = ( + dateObj: Date, + locale: FrontendLocaleData +) => formatDateMonthYearMem(locale).format(dateObj); + const formatDateMonthYearMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -72,10 +72,9 @@ const formatDateMonthYearMem = memoizeOne( ); // August -export const formatDateMonth = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateMonthMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "MMMM"); +export const formatDateMonth = (dateObj: Date, locale: FrontendLocaleData) => + formatDateMonthMem(locale).format(dateObj); + const formatDateMonthMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -84,10 +83,9 @@ const formatDateMonthMem = memoizeOne( ); // 2021 -export const formatDateYear = toLocaleDateStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateYearMem(locale).format(dateObj) - : (dateObj: Date) => format(dateObj, "YYYY"); +export const formatDateYear = (dateObj: Date, locale: FrontendLocaleData) => + formatDateYearMem(locale).format(dateObj); + const formatDateYearMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { diff --git a/src/common/datetime/format_date_time.ts b/src/common/datetime/format_date_time.ts index eddc74aec4..812e211cfb 100644 --- a/src/common/datetime/format_date_time.ts +++ b/src/common/datetime/format_date_time.ts @@ -1,15 +1,16 @@ -import { format } from "fecha"; import memoizeOne from "memoize-one"; import { FrontendLocaleData } from "../../data/translation"; -import { toLocaleStringSupportsOptions } from "./check_options_support"; import { useAmPm } from "./use_am_pm"; +import { polyfillsLoaded } from "../translations/localize"; + +if (__BUILD__ === "latest" && polyfillsLoaded) { + await polyfillsLoaded; +} // August 9, 2021, 8:23 AM -export const formatDateTime = toLocaleStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateTimeMem(locale).format(dateObj) - : (dateObj: Date, locale: FrontendLocaleData) => - format(dateObj, "MMMM D, YYYY, HH:mm" + useAmPm(locale) ? " A" : ""); +export const formatDateTime = (dateObj: Date, locale: FrontendLocaleData) => + formatDateTimeMem(locale).format(dateObj); + const formatDateTimeMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -23,11 +24,11 @@ const formatDateTimeMem = memoizeOne( ); // August 9, 2021, 8:23:15 AM -export const formatDateTimeWithSeconds = toLocaleStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateTimeWithSecondsMem(locale).format(dateObj) - : (dateObj: Date, locale: FrontendLocaleData) => - format(dateObj, "MMMM D, YYYY, HH:mm:ss" + useAmPm(locale) ? " A" : ""); +export const formatDateTimeWithSeconds = ( + dateObj: Date, + locale: FrontendLocaleData +) => formatDateTimeWithSecondsMem(locale).format(dateObj); + const formatDateTimeWithSecondsMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -42,11 +43,11 @@ const formatDateTimeWithSecondsMem = memoizeOne( ); // 9/8/2021, 8:23 AM -export const formatDateTimeNumeric = toLocaleStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatDateTimeNumericMem(locale).format(dateObj) - : (dateObj: Date, locale: FrontendLocaleData) => - format(dateObj, "M/D/YYYY, HH:mm" + useAmPm(locale) ? " A" : ""); +export const formatDateTimeNumeric = ( + dateObj: Date, + locale: FrontendLocaleData +) => formatDateTimeNumericMem(locale).format(dateObj); + const formatDateTimeNumericMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { diff --git a/src/common/datetime/format_time.ts b/src/common/datetime/format_time.ts index c1511fb8eb..bb60944b68 100644 --- a/src/common/datetime/format_time.ts +++ b/src/common/datetime/format_time.ts @@ -1,30 +1,31 @@ -import { format } from "fecha"; import memoizeOne from "memoize-one"; import { FrontendLocaleData } from "../../data/translation"; -import { toLocaleTimeStringSupportsOptions } from "./check_options_support"; import { useAmPm } from "./use_am_pm"; +import { polyfillsLoaded } from "../translations/localize"; + +if (__BUILD__ === "latest" && polyfillsLoaded) { + await polyfillsLoaded; +} // 9:15 PM || 21:15 -export const formatTime = toLocaleTimeStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatTimeMem(locale).format(dateObj) - : (dateObj: Date, locale: FrontendLocaleData) => - format(dateObj, "shortTime" + useAmPm(locale) ? " A" : ""); +export const formatTime = (dateObj: Date, locale: FrontendLocaleData) => + formatTimeMem(locale).format(dateObj); + const formatTimeMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { - hour: useAmPm(locale) ? "numeric" : "2-digit", + hour: "numeric", minute: "2-digit", hour12: useAmPm(locale), }) ); // 9:15:24 PM || 21:15:24 -export const formatTimeWithSeconds = toLocaleTimeStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatTimeWithSecondsMem(locale).format(dateObj) - : (dateObj: Date, locale: FrontendLocaleData) => - format(dateObj, "mediumTime" + useAmPm(locale) ? " A" : ""); +export const formatTimeWithSeconds = ( + dateObj: Date, + locale: FrontendLocaleData +) => formatTimeWithSecondsMem(locale).format(dateObj); + const formatTimeWithSecondsMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { @@ -36,17 +37,15 @@ const formatTimeWithSecondsMem = memoizeOne( ); // Tuesday 7:00 PM || Tuesday 19:00 -export const formatTimeWeekday = toLocaleTimeStringSupportsOptions - ? (dateObj: Date, locale: FrontendLocaleData) => - formatTimeWeekdayMem(locale).format(dateObj) - : (dateObj: Date, locale: FrontendLocaleData) => - format(dateObj, "dddd, HH:mm" + useAmPm(locale) ? " A" : ""); +export const formatTimeWeekday = (dateObj: Date, locale: FrontendLocaleData) => + formatTimeWeekdayMem(locale).format(dateObj); + const formatTimeWeekdayMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { - weekday: "long", hour: useAmPm(locale) ? "numeric" : "2-digit", minute: "2-digit", + second: "2-digit", hour12: useAmPm(locale), }) ); diff --git a/src/common/datetime/relative_time.ts b/src/common/datetime/relative_time.ts index ef3b8b50c7..4b517c608d 100644 --- a/src/common/datetime/relative_time.ts +++ b/src/common/datetime/relative_time.ts @@ -1,48 +1,32 @@ -import { LocalizeFunc } from "../translations/localize"; +import { selectUnit } from "@formatjs/intl-utils"; +import memoizeOne from "memoize-one"; +import { FrontendLocaleData } from "../../data/translation"; +import { polyfillsLoaded } from "../translations/localize"; -/** - * Calculate a string representing a date object as relative time from now. - * - * Example output: 5 minutes ago, in 3 days. - */ -const tests = [60, 60, 24, 7]; -const langKey = ["second", "minute", "hour", "day"]; - -export default function relativeTime( - dateObj: Date, - localize: LocalizeFunc, - options: { - compareTime?: Date; - includeTense?: boolean; - } = {} -): string { - const compareTime = options.compareTime || new Date(); - let delta = (compareTime.getTime() - dateObj.getTime()) / 1000; - const tense = delta >= 0 ? "past" : "future"; - delta = Math.abs(delta); - let roundedDelta = Math.round(delta); - - if (roundedDelta === 0) { - return localize("ui.components.relative_time.just_now"); - } - - let unit = "week"; - - for (let i = 0; i < tests.length; i++) { - if (roundedDelta < tests[i]) { - unit = langKey[i]; - break; - } - - delta /= tests[i]; - roundedDelta = Math.round(delta); - } - - return localize( - options.includeTense === false - ? `ui.components.relative_time.duration.${unit}` - : `ui.components.relative_time.${tense}_duration.${unit}`, - "count", - roundedDelta - ); +if (__BUILD__ === "latest" && polyfillsLoaded) { + await polyfillsLoaded; } + +const formatRelTimeMem = memoizeOne( + (locale: FrontendLocaleData) => + // @ts-expect-error + new Intl.RelativeTimeFormat(locale.language, { numeric: "auto" }) +); + +export const relativeTime = ( + from: Date, + locale: FrontendLocaleData, + to?: Date, + includeTense = true +): string => { + const diff = selectUnit(from, to); + if (includeTense) { + return formatRelTimeMem(locale).format(diff.value, diff.unit); + } + return Intl.NumberFormat(locale.language, { + style: "unit", + // @ts-expect-error + unit: diff.unit, + unitDisplay: "long", + }).format(Math.abs(diff.value)); +}; diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts index cb31f5ec10..fddce09d82 100644 --- a/src/common/entity/compute_state_display.ts +++ b/src/common/entity/compute_state_display.ts @@ -4,7 +4,7 @@ import { FrontendLocaleData } from "../../data/translation"; import { formatDate } from "../datetime/format_date"; import { formatDateTime } from "../datetime/format_date_time"; import { formatTime } from "../datetime/format_time"; -import { formatNumber } from "../string/format_number"; +import { formatNumber } from "../number/format_number"; import { LocalizeFunc } from "../translations/localize"; import { computeStateDomain } from "./compute_state_domain"; diff --git a/src/common/string/format_number.ts b/src/common/number/format_number.ts similarity index 98% rename from src/common/string/format_number.ts rename to src/common/number/format_number.ts index 56ab2ec8dc..c5ed9bbb44 100644 --- a/src/common/string/format_number.ts +++ b/src/common/number/format_number.ts @@ -1,5 +1,5 @@ import { FrontendLocaleData, NumberFormat } from "../../data/translation"; -import { round } from "../number/round"; +import { round } from "./round"; export const numberFormatToLocale = ( localeOptions: FrontendLocaleData diff --git a/src/common/translations/localize.ts b/src/common/translations/localize.ts index 1c13650812..fcf05051bd 100644 --- a/src/common/translations/localize.ts +++ b/src/common/translations/localize.ts @@ -1,4 +1,7 @@ -import { shouldPolyfill } from "@formatjs/intl-pluralrules/lib/should-polyfill"; +import { shouldPolyfill as shouldPolyfillLocale } from "@formatjs/intl-locale/lib/should-polyfill"; +import { shouldPolyfill as shouldPolyfillPluralRules } from "@formatjs/intl-pluralrules/lib/should-polyfill"; +import { shouldPolyfill as shouldPolyfillRelativeTime } from "@formatjs/intl-relativetimeformat/lib/should-polyfill"; +import { shouldPolyfill as shouldPolyfillDateTime } from "@formatjs/intl-datetimeformat/lib/should-polyfill"; import IntlMessageFormat from "intl-messageformat"; import { Resources } from "../../types"; @@ -14,15 +17,35 @@ export interface FormatsType { let loadedPolyfillLocale: Set | undefined; -let polyfillLoaded = !shouldPolyfill(); -const polyfillProm = polyfillLoaded +const polyfillPluralRules = shouldPolyfillPluralRules(); +const polyfillRelativeTime = shouldPolyfillRelativeTime(); +const polyfillDateTime = shouldPolyfillDateTime(); + +const polyfills: Promise[] = []; +if (__BUILD__ === "latest") { + if (shouldPolyfillLocale()) { + polyfills.push(import("@formatjs/intl-locale/polyfill")); + } + if (polyfillPluralRules) { + polyfills.push(import("@formatjs/intl-pluralrules/polyfill")); + } + if (polyfillRelativeTime) { + polyfills.push(import("@formatjs/intl-relativetimeformat/polyfill")); + } + if (polyfillDateTime) { + polyfills.push(import("@formatjs/intl-datetimeformat/polyfill")); + } +} + +let polyfillLoaded = polyfills.length === 0; +export const polyfillsLoaded = polyfillLoaded ? undefined - : import("@formatjs/intl-locale/polyfill") - .then(() => import("@formatjs/intl-pluralrules/polyfill")) - .then(() => { - loadedPolyfillLocale = new Set(); - polyfillLoaded = true; - }); + : Promise.all(polyfills).then(() => { + loadedPolyfillLocale = new Set(); + polyfillLoaded = true; + // Load English so it becomes the default + return loadPolyfillLocales("en"); + }); /** * Adapted from Polymer app-localize-behavior. @@ -52,17 +75,10 @@ export const computeLocalize = async ( formats?: FormatsType ): Promise => { if (!polyfillLoaded) { - await polyfillProm; + await polyfillsLoaded; } - if (loadedPolyfillLocale && !loadedPolyfillLocale.has(language)) { - try { - loadedPolyfillLocale.add(language); - await import("@formatjs/intl-pluralrules/locale-data/en"); - } catch (_e) { - // Ignore - } - } + loadPolyfillLocales(language); // Everytime any of the parameters change, invalidate the strings cache. cache._localizationCache = {}; @@ -114,3 +130,23 @@ export const computeLocalize = async ( } }; }; + +export const loadPolyfillLocales = async (language: string) => { + if (!loadedPolyfillLocale || loadedPolyfillLocale.has(language)) { + return; + } + loadedPolyfillLocale.add(language); + try { + if (polyfillPluralRules) { + await import(`@formatjs/intl-pluralrules/locale-data/${language}`); + } + if (polyfillRelativeTime) { + await import(`@formatjs/intl-relativetimeformat/locale-data/${language}`); + } + if (polyfillDateTime) { + await import(`@formatjs/intl-datetimeformat/locale-data/${language}`); + } + } catch (_e) { + // Ignore + } +}; diff --git a/src/components/chart/state-history-chart-line.ts b/src/components/chart/state-history-chart-line.ts index 574d86112a..e19b6586a5 100644 --- a/src/components/chart/state-history-chart-line.ts +++ b/src/components/chart/state-history-chart-line.ts @@ -5,7 +5,7 @@ import { getColorByIndex } from "../../common/color/colors"; import { formatNumber, numberFormatToLocale, -} from "../../common/string/format_number"; +} from "../../common/number/format_number"; import { LineChartEntity, LineChartState } from "../../data/history"; import { HomeAssistant } from "../../types"; import "./ha-chart-base"; diff --git a/src/components/chart/state-history-chart-timeline.ts b/src/components/chart/state-history-chart-timeline.ts index 500e90a342..fc0b5ec4b5 100644 --- a/src/components/chart/state-history-chart-timeline.ts +++ b/src/components/chart/state-history-chart-timeline.ts @@ -5,7 +5,7 @@ import { customElement, property, state } from "lit/decorators"; import { getColorByIndex } from "../../common/color/colors"; import { formatDateTimeWithSeconds } from "../../common/datetime/format_date_time"; import { computeDomain } from "../../common/entity/compute_domain"; -import { numberFormatToLocale } from "../../common/string/format_number"; +import { numberFormatToLocale } from "../../common/number/format_number"; import { computeRTL } from "../../common/util/compute_rtl"; import { TimelineEntity } from "../../data/history"; import { HomeAssistant } from "../../types"; diff --git a/src/components/chart/statistics-chart.ts b/src/components/chart/statistics-chart.ts index 00766f477e..1c2615ea07 100644 --- a/src/components/chart/statistics-chart.ts +++ b/src/components/chart/statistics-chart.ts @@ -19,7 +19,7 @@ import { computeStateName } from "../../common/entity/compute_state_name"; import { formatNumber, numberFormatToLocale, -} from "../../common/string/format_number"; +} from "../../common/number/format_number"; import { getStatisticIds, Statistics, diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index 5302d6f917..10df5e8893 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -15,7 +15,7 @@ import { computeStateDomain } from "../../common/entity/compute_state_domain"; import { computeStateName } from "../../common/entity/compute_state_name"; import { stateIcon } from "../../common/entity/state_icon"; import { timerTimeRemaining } from "../../data/timer"; -import { formatNumber } from "../../common/string/format_number"; +import { formatNumber } from "../../common/number/format_number"; import { UNAVAILABLE, UNKNOWN } from "../../data/entity"; import { HomeAssistant } from "../../types"; import "../ha-label-badge"; diff --git a/src/components/ha-climate-state.ts b/src/components/ha-climate-state.ts index e9a14f653c..f9aebc78e3 100644 --- a/src/components/ha-climate-state.ts +++ b/src/components/ha-climate-state.ts @@ -1,7 +1,7 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; -import { formatNumber } from "../common/string/format_number"; +import { formatNumber } from "../common/number/format_number"; import { CLIMATE_PRESET_NONE } from "../data/climate"; import type { HomeAssistant } from "../types"; diff --git a/src/components/ha-gauge.ts b/src/components/ha-gauge.ts index 2e96a0c4bc..fd3a378e42 100644 --- a/src/components/ha-gauge.ts +++ b/src/components/ha-gauge.ts @@ -2,7 +2,7 @@ import { css, LitElement, PropertyValues, svg, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { styleMap } from "lit/directives/style-map"; -import { formatNumber } from "../common/string/format_number"; +import { formatNumber } from "../common/number/format_number"; import { afterNextRender } from "../common/util/render-status"; import { FrontendLocaleData } from "../data/translation"; import { getValueInPercentage, normalize } from "../util/calculate"; diff --git a/src/components/ha-relative-time.ts b/src/components/ha-relative-time.ts index 36da1ab190..3c9f991f5e 100644 --- a/src/components/ha-relative-time.ts +++ b/src/components/ha-relative-time.ts @@ -1,6 +1,6 @@ import { PropertyValues, ReactiveElement } from "lit"; import { customElement, property } from "lit/decorators"; -import relativeTime from "../common/datetime/relative_time"; +import { relativeTime } from "../common/datetime/relative_time"; import type { HomeAssistant } from "../types"; @customElement("ha-relative-time") @@ -55,10 +55,7 @@ class HaRelativeTime extends ReactiveElement { if (!this.datetime) { this.innerHTML = this.hass.localize("ui.components.relative_time.never"); } else { - this.innerHTML = relativeTime( - new Date(this.datetime), - this.hass.localize - ); + this.innerHTML = relativeTime(new Date(this.datetime), this.hass.locale); } } } diff --git a/src/components/ha-water_heater-state.js b/src/components/ha-water_heater-state.js index f2047c8a6f..8e6759ea6d 100644 --- a/src/components/ha-water_heater-state.js +++ b/src/components/ha-water_heater-state.js @@ -2,7 +2,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; import { computeStateDisplay } from "../common/entity/compute_state_display"; -import { formatNumber } from "../common/string/format_number"; +import { formatNumber } from "../common/number/format_number"; import LocalizeMixin from "../mixins/localize-mixin"; /* diff --git a/src/components/trace/hat-trace-timeline.ts b/src/components/trace/hat-trace-timeline.ts index 162ac03eca..b74ea93bce 100644 --- a/src/components/trace/hat-trace-timeline.ts +++ b/src/components/trace/hat-trace-timeline.ts @@ -17,7 +17,7 @@ import { import { customElement, property } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { formatDateTimeWithSeconds } from "../../common/datetime/format_date_time"; -import relativeTime from "../../common/datetime/relative_time"; +import { relativeTime } from "../../common/datetime/relative_time"; import { fireEvent } from "../../common/dom/fire_event"; import { toggleAttribute } from "../../common/dom/toggle_attribute"; import { LogbookEntry } from "../../data/logbook"; @@ -66,11 +66,7 @@ class RenderedTimeTracker { renderTime(from: Date, to: Date): void { this.entries.push(html` - ${relativeTime(from, this.hass.localize, { - compareTime: to, - includeTense: false, - })} - later + ${relativeTime(from, this.hass.locale, to, false)} later `); this.lastReportedTime = to; diff --git a/src/data/weather.ts b/src/data/weather.ts index 3c27c13418..d37175d727 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -11,7 +11,7 @@ import { } from "home-assistant-js-websocket"; import { css, html, svg, SVGTemplateResult, TemplateResult } from "lit"; import { styleMap } from "lit/directives/style-map"; -import { formatNumber } from "../common/string/format_number"; +import { formatNumber } from "../common/number/format_number"; import "../components/ha-icon"; import "../components/ha-svg-icon"; import type { HomeAssistant } from "../types"; diff --git a/src/dialogs/more-info/controls/more-info-sun.ts b/src/dialogs/more-info/controls/more-info-sun.ts index 9de886b619..254693e681 100644 --- a/src/dialogs/more-info/controls/more-info-sun.ts +++ b/src/dialogs/more-info/controls/more-info-sun.ts @@ -2,7 +2,7 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { formatTime } from "../../../common/datetime/format_time"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import "../../../components/ha-relative-time"; import { HomeAssistant } from "../../../types"; diff --git a/src/dialogs/more-info/controls/more-info-weather.ts b/src/dialogs/more-info/controls/more-info-weather.ts index 4fe0407ea4..38dbb031b5 100644 --- a/src/dialogs/more-info/controls/more-info-weather.ts +++ b/src/dialogs/more-info/controls/more-info-weather.ts @@ -31,7 +31,7 @@ import { import { customElement, property } from "lit/decorators"; import { formatDateWeekday } from "../../../common/datetime/format_date"; import { formatTimeWeekday } from "../../../common/datetime/format_time"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import "../../../components/ha-svg-icon"; import { getWeatherUnit, getWind } from "../../../data/weather"; import { HomeAssistant } from "../../../types"; diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts index aa0b91faad..7d9471a96c 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts @@ -17,7 +17,7 @@ import { computeStateName } from "../../../../common/entity/compute_state_name"; import { formatNumber, numberFormatToLocale, -} from "../../../../common/string/format_number"; +} from "../../../../common/number/format_number"; import "../../../../components/chart/ha-chart-base"; import type HaChartBase from "../../../../components/chart/ha-chart-base"; import "../../../../components/ha-card"; diff --git a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts index 126a933ad2..18bfcf6dd1 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts @@ -15,7 +15,7 @@ import { css, html, LitElement, svg } from "lit"; import { customElement, property, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import "@material/mwc-button"; -import { formatNumber } from "../../../../common/string/format_number"; +import { formatNumber } from "../../../../common/number/format_number"; import "../../../../components/ha-card"; import "../../../../components/ha-svg-icon"; import { diff --git a/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts index 5428cece53..f46af3d81d 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts @@ -32,7 +32,7 @@ import "../../../../components/chart/ha-chart-base"; import { formatNumber, numberFormatToLocale, -} from "../../../../common/string/format_number"; +} from "../../../../common/number/format_number"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; import { FrontendLocaleData } from "../../../../data/translation"; import { diff --git a/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts b/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts index a2df7e1b83..1f7e9d3f94 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts @@ -3,7 +3,7 @@ import "@polymer/paper-tooltip"; import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; -import { formatNumber } from "../../../../common/string/format_number"; +import { formatNumber } from "../../../../common/number/format_number"; import "../../../../components/ha-card"; import "../../../../components/ha-svg-icon"; import "../../../../components/ha-gauge"; diff --git a/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts index 965b1db4c0..fb89e115a1 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts @@ -33,7 +33,7 @@ import "../../../../components/chart/ha-chart-base"; import { formatNumber, numberFormatToLocale, -} from "../../../../common/string/format_number"; +} from "../../../../common/number/format_number"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; import { FrontendLocaleData } from "../../../../data/translation"; import { diff --git a/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts b/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts index 14ac805ad9..e91ecd9fee 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts @@ -19,7 +19,7 @@ import { } from "../../../../common/color/convert-color"; import { labDarken } from "../../../../common/color/lab"; import { computeStateName } from "../../../../common/entity/compute_state_name"; -import { formatNumber } from "../../../../common/string/format_number"; +import { formatNumber } from "../../../../common/number/format_number"; import "../../../../components/chart/statistics-chart"; import "../../../../components/ha-card"; import { diff --git a/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts index bc807a2e04..5b08a6b08a 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts @@ -17,7 +17,7 @@ import { computeStateName } from "../../../../common/entity/compute_state_name"; import { formatNumber, numberFormatToLocale, -} from "../../../../common/string/format_number"; +} from "../../../../common/number/format_number"; import "../../../../components/chart/ha-chart-base"; import "../../../../components/ha-card"; import { EnergyData, getEnergyDataCollection } from "../../../../data/energy"; diff --git a/src/panels/lovelace/cards/hui-entity-card.ts b/src/panels/lovelace/cards/hui-entity-card.ts index c87a5fbeee..d5db077ec0 100644 --- a/src/panels/lovelace/cards/hui-entity-card.ts +++ b/src/panels/lovelace/cards/hui-entity-card.ts @@ -16,7 +16,7 @@ import { computeStateDomain } from "../../../common/entity/compute_state_domain" import { computeStateName } from "../../../common/entity/compute_state_name"; import { stateIcon } from "../../../common/entity/state_icon"; import { isValidEntityId } from "../../../common/entity/valid_entity_id"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import { iconColorCSS } from "../../../common/style/icon_color_css"; import "../../../components/ha-card"; import "../../../components/ha-icon"; diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index d0a4b7bc95..85347221aa 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -9,7 +9,7 @@ import { import { customElement, property, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { ifDefined } from "lit/directives/if-defined"; -import relativeTime from "../../../common/datetime/relative_time"; +import { relativeTime } from "../../../common/datetime/relative_time"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { computeDomain } from "../../../common/entity/compute_domain"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; @@ -330,7 +330,7 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { : entityConf.show_last_changed ? relativeTime( new Date(stateObj.last_changed), - this.hass!.localize + this.hass!.locale ) : computeStateDisplay( this.hass!.localize, diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index 66241944d4..1855751633 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -16,7 +16,7 @@ import { UNIT_F } from "../../../common/const"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import "../../../components/ha-card"; import type { HaCard } from "../../../components/ha-card"; import "../../../components/ha-icon-button"; diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 0a00fa51e8..adce427921 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -14,7 +14,7 @@ import { computeStateDisplay } from "../../../common/entity/compute_state_displa import { computeStateName } from "../../../common/entity/compute_state_name"; import { stateIcon } from "../../../common/entity/state_icon"; import { isValidEntityId } from "../../../common/entity/valid_entity_id"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-card"; import "../../../components/ha-icon"; diff --git a/src/panels/lovelace/components/hui-timestamp-display.ts b/src/panels/lovelace/components/hui-timestamp-display.ts index dbe9869669..0cd5d44de9 100644 --- a/src/panels/lovelace/components/hui-timestamp-display.ts +++ b/src/panels/lovelace/components/hui-timestamp-display.ts @@ -3,7 +3,7 @@ import { customElement, property, state } from "lit/decorators"; import { formatDate } from "../../../common/datetime/format_date"; import { formatDateTime } from "../../../common/datetime/format_date_time"; import { formatTime } from "../../../common/datetime/format_time"; -import relativeTime from "../../../common/datetime/relative_time"; +import { relativeTime } from "../../../common/datetime/relative_time"; import { FrontendLocaleData } from "../../../data/translation"; import { HomeAssistant } from "../../../types"; import { TimestampRenderingFormat } from "./types"; @@ -103,11 +103,13 @@ class HuiTimestampDisplay extends LitElement { if (this.ts && this.hass!.localize) { this._relative = this._format === "relative" - ? relativeTime(this.ts, this.hass!.localize) - : (this._relative = relativeTime(new Date(), this.hass!.localize, { - compareTime: this.ts, - includeTense: false, - })); + ? relativeTime(this.ts, this.hass!.locale) + : (this._relative = relativeTime( + new Date(), + this.hass!.locale, + this.ts, + false + )); } } } diff --git a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts index 5ed1cb80c4..2f5c1fd115 100644 --- a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts @@ -14,7 +14,7 @@ import { computeDomain } from "../../../common/entity/compute_domain"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { stateIcon } from "../../../common/entity/state_icon"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import "../../../components/entity/state-badge"; import { UNAVAILABLE_STATES } from "../../../data/entity"; import { ActionHandlerEvent } from "../../../data/lovelace"; diff --git a/src/panels/lovelace/special-rows/hui-attribute-row.ts b/src/panels/lovelace/special-rows/hui-attribute-row.ts index 77b05f0803..540c7bf1ef 100644 --- a/src/panels/lovelace/special-rows/hui-attribute-row.ts +++ b/src/panels/lovelace/special-rows/hui-attribute-row.ts @@ -8,7 +8,7 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import checkValidDate from "../../../common/datetime/check_valid_date"; -import { formatNumber } from "../../../common/string/format_number"; +import { formatNumber } from "../../../common/number/format_number"; import { HomeAssistant } from "../../../types"; import { formatAttributeValue } from "../../../util/hass-attributes-util"; import { hasConfigOrEntityChanged } from "../common/has-changed"; diff --git a/src/panels/profile/ha-long-lived-access-tokens-card.ts b/src/panels/profile/ha-long-lived-access-tokens-card.ts index b8554c35cf..a641da7f5e 100644 --- a/src/panels/profile/ha-long-lived-access-tokens-card.ts +++ b/src/panels/profile/ha-long-lived-access-tokens-card.ts @@ -4,7 +4,7 @@ import { mdiDelete } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import memoizeOne from "memoize-one"; -import relativeTime from "../../common/datetime/relative_time"; +import { relativeTime } from "../../common/datetime/relative_time"; import { fireEvent } from "../../common/dom/fire_event"; import "../../components/ha-card"; import "../../components/ha-settings-row"; @@ -69,10 +69,7 @@ class HaLongLivedTokens extends LitElement { ${this.hass.localize( "ui.panel.profile.long_lived_access_tokens.created", "date", - relativeTime( - new Date(token.created_at), - this.hass.localize - ) + relativeTime(new Date(token.created_at), this.hass.locale) )} { - // Mock localize function for testing - const localize = (message, ...args) => - message + (args.length ? ": " + args.join(",") : ""); - - it("now", () => { - const now = new Date(); - assert.strictEqual( - relativeTime(now, localize, { compareTime: now }), - "ui.components.relative_time.just_now" - ); - }); - - it("past_second", () => { - const inputdt = new Date("2021-02-03T11:22:00+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.past_duration.second: count,33" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.second: count,33" - ); - }); - - it("past_minute", () => { - const inputdt = new Date("2021-02-03T11:20:33+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.past_duration.minute: count,2" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.minute: count,2" - ); - }); - - it("past_hour", () => { - const inputdt = new Date("2021-02-03T09:22:33+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.past_duration.hour: count,2" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.hour: count,2" - ); - }); - - it("past_day", () => { - let inputdt = new Date("2021-02-01T11:22:33+00:00"); - let compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.past_duration.day: count,2" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.day: count,2" - ); - - // Test switch from days to weeks - inputdt = new Date("2021-01-28T11:22:33+00:00"); - compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.day: count,6" - ); - inputdt = new Date("2021-01-27T11:22:33+00:00"); - compare = new Date("2021-02-03T11:22:33+00:00"); - assert.notStrictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.day: count,7" - ); - }); - - it("past_week", () => { - const inputdt = new Date("2021-01-03T11:22:33+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.past_duration.week: count,4" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.week: count,4" - ); - }); - - it("future_second", () => { - const inputdt = new Date("2021-02-03T11:22:55+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.future_duration.second: count,22" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.second: count,22" - ); - }); - - it("future_minute", () => { - const inputdt = new Date("2021-02-03T11:24:33+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.future_duration.minute: count,2" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.minute: count,2" - ); - }); - - it("future_hour", () => { - const inputdt = new Date("2021-02-03T13:22:33+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.future_duration.hour: count,2" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.hour: count,2" - ); - }); - - it("future_day", () => { - let inputdt = new Date("2021-02-05T11:22:33+00:00"); - let compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.future_duration.day: count,2" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.day: count,2" - ); - - // Test switch from days to weeks - inputdt = new Date("2021-02-09T11:22:33+00:00"); - compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.day: count,6" - ); - inputdt = new Date("2021-02-10T11:22:33+00:00"); - compare = new Date("2021-02-03T11:22:33+00:00"); - assert.notStrictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.day: count,7" - ); - }); - - it("future_week", () => { - const inputdt = new Date("2021-03-03T11:22:33+00:00"); - const compare = new Date("2021-02-03T11:22:33+00:00"); - assert.strictEqual( - relativeTime(inputdt, localize, { compareTime: compare }), - "ui.components.relative_time.future_duration.week: count,4" - ); - assert.strictEqual( - relativeTime(inputdt, localize, { - compareTime: compare, - includeTense: false, - }), - "ui.components.relative_time.duration.week: count,4" - ); - }); -}); diff --git a/test-mocha/.eslintrc b/test/.eslintrc similarity index 100% rename from test-mocha/.eslintrc rename to test/.eslintrc diff --git a/test-mocha/common/config/version.ts b/test/common/config/version.ts similarity index 100% rename from test-mocha/common/config/version.ts rename to test/common/config/version.ts diff --git a/test-mocha/common/datetime/check_valid_date.ts b/test/common/datetime/check_valid_date.ts similarity index 100% rename from test-mocha/common/datetime/check_valid_date.ts rename to test/common/datetime/check_valid_date.ts diff --git a/test-mocha/common/datetime/duration_to_seconds_test.ts b/test/common/datetime/duration_to_seconds_test.ts similarity index 100% rename from test-mocha/common/datetime/duration_to_seconds_test.ts rename to test/common/datetime/duration_to_seconds_test.ts diff --git a/test-mocha/common/datetime/format_date.ts b/test/common/datetime/format_date.ts similarity index 100% rename from test-mocha/common/datetime/format_date.ts rename to test/common/datetime/format_date.ts diff --git a/test-mocha/common/datetime/format_date_time.ts b/test/common/datetime/format_date_time.ts similarity index 89% rename from test-mocha/common/datetime/format_date_time.ts rename to test/common/datetime/format_date_time.ts index cd3a116e3f..25e0a26a9c 100644 --- a/test-mocha/common/datetime/format_date_time.ts +++ b/test/common/datetime/format_date_time.ts @@ -16,7 +16,7 @@ describe("formatDateTime", () => { number_format: NumberFormat.language, time_format: TimeFormat.am_pm, }), - "November 18, 2017, 11:12 PM" + "November 18, 2017 at 11:12 PM" ); assert.strictEqual( formatDateTime(dateObj, { @@ -24,7 +24,7 @@ describe("formatDateTime", () => { number_format: NumberFormat.language, time_format: TimeFormat.twenty_four, }), - "November 18, 2017, 23:12" + "November 18, 2017 at 23:12" ); }); }); @@ -39,7 +39,7 @@ describe("formatDateTimeWithSeconds", () => { number_format: NumberFormat.language, time_format: TimeFormat.am_pm, }), - "November 18, 2017, 11:12:13 PM" + "November 18, 2017 at 11:12:13 PM" ); assert.strictEqual( formatDateTimeWithSeconds(dateObj, { @@ -47,7 +47,7 @@ describe("formatDateTimeWithSeconds", () => { number_format: NumberFormat.language, time_format: TimeFormat.twenty_four, }), - "November 18, 2017, 23:12:13" + "November 18, 2017 at 23:12:13" ); }); }); diff --git a/test-mocha/common/datetime/format_time.ts b/test/common/datetime/format_time.ts similarity index 100% rename from test-mocha/common/datetime/format_time.ts rename to test/common/datetime/format_time.ts diff --git a/test/common/datetime/relative_time.ts b/test/common/datetime/relative_time.ts new file mode 100644 index 0000000000..8bb0be7133 --- /dev/null +++ b/test/common/datetime/relative_time.ts @@ -0,0 +1,115 @@ +import { assert } from "chai"; + +import { relativeTime } from "../../../src/common/datetime/relative_time"; +import { NumberFormat, TimeFormat } from "../../../src/data/translation"; + +describe("relativeTime", () => { + const locale = { + language: "en", + number_format: NumberFormat.language, + time_format: TimeFormat.language, + }; + + it("now", () => { + const now = new Date(); + assert.strictEqual(relativeTime(now, locale, now), "now"); + assert.strictEqual(relativeTime(now, locale, now, false), "0 seconds"); + }); + + it("past_second", () => { + const inputdt = new Date("2021-02-03T11:22:00+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual( + relativeTime(inputdt, locale, compare), + "33 seconds ago" + ); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "33 seconds" + ); + }); + + it("past_minute", () => { + const inputdt = new Date("2021-02-03T11:20:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "2 minutes ago"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "2 minutes" + ); + }); + + it("past_hour", () => { + const inputdt = new Date("2021-02-03T09:22:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "2 hours ago"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "2 hours" + ); + }); + + it("past_day", () => { + const inputdt = new Date("2021-02-01T11:22:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "2 days ago"); + assert.strictEqual(relativeTime(inputdt, locale, compare, false), "2 days"); + }); + + it("future_second", () => { + const inputdt = new Date("2021-02-03T11:22:55+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "in 22 seconds"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "22 seconds" + ); + }); + + it("future_minute", () => { + const inputdt = new Date("2021-02-03T11:24:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "in 2 minutes"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "2 minutes" + ); + }); + + it("future_hour", () => { + const inputdt = new Date("2021-02-03T13:22:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "in 2 hours"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "2 hours" + ); + }); + + it("future_day", () => { + const inputdt = new Date("2021-02-05T11:22:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "in 2 days"); + assert.strictEqual(relativeTime(inputdt, locale, compare, false), "2 days"); + }); + + it("future_week", () => { + const inputdt = new Date("2021-03-24T11:22:33+00:00"); + const compare = new Date("2021-03-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "in 3 weeks"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "3 weeks" + ); + }); + + it("future_month", () => { + const inputdt = new Date("2021-03-03T11:22:33+00:00"); + const compare = new Date("2021-02-03T11:22:33+00:00"); + assert.strictEqual(relativeTime(inputdt, locale, compare), "next month"); + assert.strictEqual( + relativeTime(inputdt, locale, compare, false), + "1 month" + ); + }); +}); diff --git a/test-mocha/common/datetime/seconds_to_duration_test.ts b/test/common/datetime/seconds_to_duration_test.ts similarity index 100% rename from test-mocha/common/datetime/seconds_to_duration_test.ts rename to test/common/datetime/seconds_to_duration_test.ts diff --git a/test-mocha/common/entity/attribute_class_names_test.ts b/test/common/entity/attribute_class_names_test.ts similarity index 100% rename from test-mocha/common/entity/attribute_class_names_test.ts rename to test/common/entity/attribute_class_names_test.ts diff --git a/test-mocha/common/entity/can_toggle_domain_test.ts b/test/common/entity/can_toggle_domain_test.ts similarity index 100% rename from test-mocha/common/entity/can_toggle_domain_test.ts rename to test/common/entity/can_toggle_domain_test.ts diff --git a/test-mocha/common/entity/can_toggle_state_test.ts b/test/common/entity/can_toggle_state_test.ts similarity index 100% rename from test-mocha/common/entity/can_toggle_state_test.ts rename to test/common/entity/can_toggle_state_test.ts diff --git a/test-mocha/common/entity/compute_domain.ts b/test/common/entity/compute_domain.ts similarity index 100% rename from test-mocha/common/entity/compute_domain.ts rename to test/common/entity/compute_domain.ts diff --git a/test-mocha/common/entity/compute_state_display.ts b/test/common/entity/compute_state_display.ts similarity index 98% rename from test-mocha/common/entity/compute_state_display.ts rename to test/common/entity/compute_state_display.ts index f91ced5926..0ac83da339 100644 --- a/test-mocha/common/entity/compute_state_display.ts +++ b/test/common/entity/compute_state_display.ts @@ -172,14 +172,14 @@ describe("computeStateDisplay", () => { it("Uses am/pm time format", () => { assert.strictEqual( computeStateDisplay(localize, stateObj, localeData), - "November 18, 2017, 11:12 PM" + "November 18, 2017 at 11:12 PM" ); }); it("Uses 24h time format", () => { localeData.time_format = TimeFormat.twenty_four; assert.strictEqual( computeStateDisplay(localize, stateObj, localeData), - "November 18, 2017, 23:12" + "November 18, 2017 at 23:12" ); }); }); @@ -259,7 +259,7 @@ describe("computeStateDisplay", () => { localeData, "2021-07-04 15:40:03" ), - "July 4, 2021, 3:40 PM" + "July 4, 2021 at 3:40 PM" ); }); it("Uses 24h time format", () => { @@ -271,7 +271,7 @@ describe("computeStateDisplay", () => { localeData, "2021-07-04 15:40:03" ), - "July 4, 2021, 15:40" + "July 4, 2021 at 15:40" ); }); }); diff --git a/test-mocha/common/entity/compute_state_domain.ts b/test/common/entity/compute_state_domain.ts similarity index 100% rename from test-mocha/common/entity/compute_state_domain.ts rename to test/common/entity/compute_state_domain.ts diff --git a/test-mocha/common/entity/entity_filter.ts b/test/common/entity/entity_filter.ts similarity index 100% rename from test-mocha/common/entity/entity_filter.ts rename to test/common/entity/entity_filter.ts diff --git a/test-mocha/common/entity/extract_views.spec.ts b/test/common/entity/extract_views.spec.ts similarity index 100% rename from test-mocha/common/entity/extract_views.spec.ts rename to test/common/entity/extract_views.spec.ts diff --git a/test-mocha/common/entity/feature_class_names_test.ts b/test/common/entity/feature_class_names_test.ts similarity index 100% rename from test-mocha/common/entity/feature_class_names_test.ts rename to test/common/entity/feature_class_names_test.ts diff --git a/test-mocha/common/entity/get_group_entities.spec.ts b/test/common/entity/get_group_entities.spec.ts similarity index 100% rename from test-mocha/common/entity/get_group_entities.spec.ts rename to test/common/entity/get_group_entities.spec.ts diff --git a/test-mocha/common/entity/get_view_entities.spec.ts b/test/common/entity/get_view_entities.spec.ts similarity index 100% rename from test-mocha/common/entity/get_view_entities.spec.ts rename to test/common/entity/get_view_entities.spec.ts diff --git a/test-mocha/common/entity/has_location.test.ts b/test/common/entity/has_location.test.ts similarity index 100% rename from test-mocha/common/entity/has_location.test.ts rename to test/common/entity/has_location.test.ts diff --git a/test-mocha/common/entity/split_by_groups.spec.ts b/test/common/entity/split_by_groups.spec.ts similarity index 100% rename from test-mocha/common/entity/split_by_groups.spec.ts rename to test/common/entity/split_by_groups.spec.ts diff --git a/test-mocha/common/entity/state_card_type_test.ts b/test/common/entity/state_card_type_test.ts similarity index 100% rename from test-mocha/common/entity/state_card_type_test.ts rename to test/common/entity/state_card_type_test.ts diff --git a/test-mocha/common/entity/state_more_info_type_test.ts b/test/common/entity/state_more_info_type_test.ts similarity index 100% rename from test-mocha/common/entity/state_more_info_type_test.ts rename to test/common/entity/state_more_info_type_test.ts diff --git a/test-mocha/common/entity/test_util.ts b/test/common/entity/test_util.ts similarity index 100% rename from test-mocha/common/entity/test_util.ts rename to test/common/entity/test_util.ts diff --git a/test-mocha/common/entity/timer_time_remaining_test.ts b/test/common/entity/timer_time_remaining_test.ts similarity index 100% rename from test-mocha/common/entity/timer_time_remaining_test.ts rename to test/common/entity/timer_time_remaining_test.ts diff --git a/test-mocha/common/string/format_number.ts b/test/common/string/format_number.ts similarity index 96% rename from test-mocha/common/string/format_number.ts rename to test/common/string/format_number.ts index dafa75575c..d9e6109cb5 100644 --- a/test-mocha/common/string/format_number.ts +++ b/test/common/string/format_number.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { formatNumber } from "../../../src/common/string/format_number"; +import { formatNumber } from "../../../src/common/number/format_number"; import { FrontendLocaleData, NumberFormat, diff --git a/test-mocha/common/string/is_date.ts b/test/common/string/is_date.ts similarity index 100% rename from test-mocha/common/string/is_date.ts rename to test/common/string/is_date.ts diff --git a/test-mocha/common/string/sequence_matching.test.ts b/test/common/string/sequence_matching.test.ts similarity index 100% rename from test-mocha/common/string/sequence_matching.test.ts rename to test/common/string/sequence_matching.test.ts diff --git a/test-mocha/common/util/parse_aspect_ratio_test.ts b/test/common/util/parse_aspect_ratio_test.ts similarity index 100% rename from test-mocha/common/util/parse_aspect_ratio_test.ts rename to test/common/util/parse_aspect_ratio_test.ts diff --git a/test-mocha/data/history.spec.ts b/test/data/history.spec.ts similarity index 100% rename from test-mocha/data/history.spec.ts rename to test/data/history.spec.ts diff --git a/test-mocha/external_app/external_messaging.spec.ts b/test/external_app/external_messaging.spec.ts similarity index 100% rename from test-mocha/external_app/external_messaging.spec.ts rename to test/external_app/external_messaging.spec.ts diff --git a/test-mocha/hassio/create_session.spec.ts b/test/hassio/create_session.spec.ts similarity index 100% rename from test-mocha/hassio/create_session.spec.ts rename to test/hassio/create_session.spec.ts diff --git a/test-mocha/panels/lovelace/editor/config-util.spec.ts b/test/panels/lovelace/editor/config-util.spec.ts similarity index 100% rename from test-mocha/panels/lovelace/editor/config-util.spec.ts rename to test/panels/lovelace/editor/config-util.spec.ts diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 0000000000..bb1f8655a6 --- /dev/null +++ b/test/setup.js @@ -0,0 +1,12 @@ +const fs = require("fs"); +const path = require("path"); + +process.env.TZ = "Etc/UTC"; +process.env.IS_TEST = "true"; + +const MDI_OUTPUT_DIR = path.resolve(__dirname, "../build/mdi"); + +if (!fs.existsSync(MDI_OUTPUT_DIR)) { + fs.mkdirSync(MDI_OUTPUT_DIR, { recursive: true }); + fs.writeFileSync(path.resolve(MDI_OUTPUT_DIR, "iconMetadata.json"), "{}"); +} diff --git a/test-mocha/testconf.js b/test/testconf.js similarity index 100% rename from test-mocha/testconf.js rename to test/testconf.js diff --git a/test-mocha/tsconfig.test.json b/test/tsconfig.test.json similarity index 100% rename from test-mocha/tsconfig.test.json rename to test/tsconfig.test.json diff --git a/test-mocha/util/calculate.spec.ts b/test/util/calculate.spec.ts similarity index 100% rename from test-mocha/util/calculate.spec.ts rename to test/util/calculate.spec.ts diff --git a/test-mocha/util/generate-brands-url-spec.ts b/test/util/generate-brands-url-spec.ts similarity index 100% rename from test-mocha/util/generate-brands-url-spec.ts rename to test/util/generate-brands-url-spec.ts diff --git a/test-mocha/util/generate-documentation-url.spec.ts b/test/util/generate-documentation-url.spec.ts similarity index 100% rename from test-mocha/util/generate-documentation-url.spec.ts rename to test/util/generate-documentation-url.spec.ts diff --git a/test/webpack.config.js b/test/webpack.config.js new file mode 100644 index 0000000000..8c2df94e27 --- /dev/null +++ b/test/webpack.config.js @@ -0,0 +1,7 @@ +const { createAppConfig } = require("../build-scripts/webpack.js"); + +module.exports = createAppConfig({ + isProdBuild: false, + latestBuild: true, + isStatsBuild: false, +}); diff --git a/yarn.lock b/yarn.lock index 5e5d31b001..44d1f5ea29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1519,6 +1519,16 @@ __metadata: languageName: node linkType: hard +"@formatjs/ecma402-abstract@npm:1.9.9": + version: 1.9.9 + resolution: "@formatjs/ecma402-abstract@npm:1.9.9" + dependencies: + "@formatjs/intl-localematcher": 0.2.21 + tslib: ^2.1.0 + checksum: f0834658319ed9add4a64ee13704f1616c0af771038debe38ec7ba96a79a65e684b8e363c1573841798856d87c832c29a8be249b50c41cf46980a1a0a38c5cf7 + languageName: node + linkType: hard + "@formatjs/fast-memoize@npm:1.2.0": version: 1.2.0 resolution: "@formatjs/fast-memoize@npm:1.2.0" @@ -1549,6 +1559,17 @@ __metadata: languageName: node linkType: hard +"@formatjs/intl-datetimeformat@npm:^4.2.4": + version: 4.2.4 + resolution: "@formatjs/intl-datetimeformat@npm:4.2.4" + dependencies: + "@formatjs/ecma402-abstract": 1.9.9 + "@formatjs/intl-localematcher": 0.2.21 + tslib: ^2.1.0 + checksum: 081ea0a3065b8a40867a188f81d67ff40a98a81825c2cea79ae6a61ce28bd5aaecb756633b1c0f688a61e774925176f84c0f0f06b87b50c1d2977c9e1c59027f + languageName: node + linkType: hard + "@formatjs/intl-getcanonicallocales@npm:1.7.3, @formatjs/intl-getcanonicallocales@npm:^1.7.3": version: 1.7.3 resolution: "@formatjs/intl-getcanonicallocales@npm:1.7.3" @@ -1560,14 +1581,14 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-locale@npm:^2.4.37": - version: 2.4.37 - resolution: "@formatjs/intl-locale@npm:2.4.37" +"@formatjs/intl-locale@npm:^2.4.38": + version: 2.4.38 + resolution: "@formatjs/intl-locale@npm:2.4.38" dependencies: - "@formatjs/ecma402-abstract": 1.9.8 + "@formatjs/ecma402-abstract": 1.9.9 "@formatjs/intl-getcanonicallocales": 1.7.3 tslib: ^2.1.0 - checksum: b6c912f763992b9b03e0c47f86199576d9956a7f11b26bc51b78394d8c5db4d46ffef512134fe57d042cc26017b4c79cd03d57c5702209e16a3ffdb7455cd016 + checksum: 86e28c576a65679fe626e1e275bb3bed1209e5ced0066d7d9631a125800a4420bc748d800ee98c9a6c862755c05ec330dd3d71c3f10062cb762ec7a3b3f787d7 languageName: node linkType: hard @@ -1580,14 +1601,53 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-pluralrules@npm:^4.1.3": - version: 4.1.3 - resolution: "@formatjs/intl-pluralrules@npm:4.1.3" +"@formatjs/intl-localematcher@npm:0.2.21": + version: 0.2.21 + resolution: "@formatjs/intl-localematcher@npm:0.2.21" dependencies: - "@formatjs/ecma402-abstract": 1.9.8 - "@formatjs/intl-localematcher": 0.2.20 tslib: ^2.1.0 - checksum: 96c737c85faf306b7748c1a633ce8d2dbb90e4e9877f68782060b079ff47841a633d9ee911d4fb5d2b8a9c49977f3c6eac0658f5716a357b2b99e088ccf9ea4b + checksum: d766eb8ce8b2628d781fdb34fd0833a0a1b28f20e70a72dfabbca27cf02bd1b994a72c357b2b3d4888bc20c33b6b7cc7e10e92847ec228a40745a2e84d8d2e24 + languageName: node + linkType: hard + +"@formatjs/intl-numberformat@npm:^7.2.4": + version: 7.2.4 + resolution: "@formatjs/intl-numberformat@npm:7.2.4" + dependencies: + "@formatjs/ecma402-abstract": 1.9.9 + tslib: ^2.1.0 + checksum: 3cb315707d40f2d14c3f3922a58252c02eb38b6654d4e453ff152fcd2ad8819c827fd15741767e69290282b841dbadd035f4544dd0bebd326413ece7cc7af400 + languageName: node + linkType: hard + +"@formatjs/intl-pluralrules@npm:^4.1.4": + version: 4.1.4 + resolution: "@formatjs/intl-pluralrules@npm:4.1.4" + dependencies: + "@formatjs/ecma402-abstract": 1.9.9 + "@formatjs/intl-localematcher": 0.2.21 + tslib: ^2.1.0 + checksum: c11d408148fa0be7d94c79596ac2730dee123a6ac1b50aa4f9c94eb4e9f7a7035a8fd58524664dd6a009b992ec8d6383ff58a2b8118888d47248313ac9f324f1 + languageName: node + linkType: hard + +"@formatjs/intl-relativetimeformat@npm:^9.3.1": + version: 9.3.1 + resolution: "@formatjs/intl-relativetimeformat@npm:9.3.1" + dependencies: + "@formatjs/ecma402-abstract": 1.9.9 + "@formatjs/intl-localematcher": 0.2.21 + tslib: ^2.1.0 + checksum: d0146fbf85db9925b7243e83d030824c1a5ec489b5bc29aab27198732753f9360f89408c63c38fbeb0c5ef7c9f81676f760b68e8013a9d37544b51717234cc58 + languageName: node + linkType: hard + +"@formatjs/intl-utils@npm:^3.8.4": + version: 3.8.4 + resolution: "@formatjs/intl-utils@npm:3.8.4" + dependencies: + emojis-list: ^3.0.0 + checksum: e38a98d391ec68d8abc4bb1824426bd804dfb022ce61be004459faec69f7843ddb3733bae8d0dce4aafbfafad59cb10e67fc21d22d62f68d98251ce0bce8e704 languageName: node linkType: hard @@ -3619,10 +3679,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^0.0.49": - version: 0.0.49 - resolution: "@types/estree@npm:0.0.49" - checksum: a01577ca7bdb30a668ac92d07122afcca8b1eb44d95ae1efe6dfefbc0b54953a137d7c2ebcab034568f1c04f2a42e85bf6bb97af47cdfaf9d5f01e58ac27ecf5 +"@types/estree@npm:*, @types/estree@npm:^0.0.50": + version: 0.0.50 + resolution: "@types/estree@npm:0.0.50" + checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922 languageName: node linkType: hard @@ -3718,6 +3778,15 @@ __metadata: languageName: node linkType: hard +"@types/http-proxy@npm:^1.17.5": + version: 1.17.7 + resolution: "@types/http-proxy@npm:1.17.7" + dependencies: + "@types/node": "*" + checksum: 88f9c75ca65378d0287d8d0b1dbeed372c8267f4841fe2f6f2d759522494382d3943bc6cc774bef7dd125464a266bafeda813d3658b17a2d1e74acc4efb6e21c + languageName: node + linkType: hard + "@types/js-yaml@npm:^4": version: 4.0.3 resolution: "@types/js-yaml@npm:4.0.3" @@ -3725,10 +3794,10 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7": - version: 7.0.8 - resolution: "@types/json-schema@npm:7.0.8" - checksum: f1d0fe76ab1db93846f36a9179faa44b9b66f2f5f44597e46e65456a1c998f632c63b94ed347058ed1a230cbf95a9a164b4daf4d70aa3d651d5033f7856df83c +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8": + version: 7.0.9 + resolution: "@types/json-schema@npm:7.0.9" + checksum: 259d0e25f11a21ba5c708f7ea47196bd396e379fddb79c76f9f4f62c945879dc21657904914313ec2754e443c5018ea8372362f323f30e0792897fdb2098a705 languageName: node linkType: hard @@ -3877,6 +3946,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:^0.12.0": + version: 0.12.1 + resolution: "@types/retry@npm:0.12.1" + checksum: 5f46b2556053655f78262bb33040dc58417c900457cc63ff37d6c35349814471453ef511af0cec76a540c601296cd2b22f64bab1ab649c0dacc0223765ba876c + languageName: node + linkType: hard + "@types/serve-static@npm:*": version: 1.13.7 resolution: "@types/serve-static@npm:1.13.7" @@ -4595,15 +4671,15 @@ __metadata: languageName: node linkType: hard -"@webpack-cli/serve@npm:^1.5.1": - version: 1.5.1 - resolution: "@webpack-cli/serve@npm:1.5.1" +"@webpack-cli/serve@npm:^1.5.2": + version: 1.5.2 + resolution: "@webpack-cli/serve@npm:1.5.2" peerDependencies: webpack-cli: 4.x.x peerDependenciesMeta: webpack-dev-server: optional: true - checksum: 62485c3ddfe337c9fbe755423a63990f3544793ca2d380baf03017f49d53e6ff88d37399119865a204dfbb5941d1de2dba6f41cf8737b25145f20762368c1dee + checksum: 1666c69606581193574fb5f2cd58fececf933f34725261752d44c8097640474903de8bec4076c717d48838cfc8937fccee699ce74e4c880e1c327157757250fa languageName: node linkType: hard @@ -4645,6 +4721,15 @@ __metadata: languageName: node linkType: hard +"acorn-import-assertions@npm:^1.7.6": + version: 1.7.6 + resolution: "acorn-import-assertions@npm:1.7.6" + peerDependencies: + acorn: ^8 + checksum: bc8a1585abd70ebfb3a6b3112f5e3974fee3ac598230f916a3857f0ad4fa7e72197be532c49d1feeb83678ef264f34bee9bf1934dfb2f276d88468134a51fa9f + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.1": version: 5.3.1 resolution: "acorn-jsx@npm:5.3.1" @@ -4692,7 +4777,7 @@ __metadata: languageName: node linkType: hard -"aggregate-error@npm:^3.0.0": +"aggregate-error@npm:^3.0.0, aggregate-error@npm:^3.1.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" dependencies: @@ -4702,16 +4787,7 @@ __metadata: languageName: node linkType: hard -"ajv-errors@npm:^1.0.0": - version: 1.0.1 - resolution: "ajv-errors@npm:1.0.1" - peerDependencies: - ajv: ">=5.0.0" - checksum: 2c9fc02cf58f9aae5bace61ebd1b162e1ea372ae9db5999243ba5e32a9a78c0d635d29ae085f652c61c941a43af0b2b1acdb255e29d44dc43a6e021085716d8c - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.1.0, ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": +"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" peerDependencies: @@ -4732,7 +4808,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.12.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.10.0, ajv@npm:^6.12.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -4781,14 +4857,7 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^3.0.0": - version: 3.2.4 - resolution: "ansi-colors@npm:3.2.4" - checksum: 026c51880e9f8eb59b112669a87dbea4469939ff94b131606303bbd697438a6691b16b9db3027aa9bf132a244214e83ab1508b998496a34d2aea5b437ac9e62d - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.3.0": +"ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -4806,12 +4875,12 @@ __metadata: languageName: node linkType: hard -"ansi-html@npm:0.0.7": - version: 0.0.7 - resolution: "ansi-html@npm:0.0.7" +"ansi-html-community@npm:^0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" bin: - ansi-html: ./bin/ansi-html - checksum: 9b839ce99650b4c2d83621d67d68622d27e7948b54f7a4386f2218a3997ee4e684e5a6e8d290880c3f3260e8d90c2613c59c7028f04992ad5c8d99d3a0fcc02c + ansi-html: bin/ansi-html + checksum: 04c568e8348a636963f915e48eaa3e01218322e1169acafdd79c384f22e5558c003f79bbc480c1563865497482817c7eed025f0653ebc17642fededa5cb42089 languageName: node linkType: hard @@ -4850,6 +4919,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + "ansi-styles@npm:^1.1.0": version: 1.1.0 resolution: "ansi-styles@npm:1.1.0" @@ -4913,13 +4989,13 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:~3.1.1": - version: 3.1.1 - resolution: "anymatch@npm:3.1.1" +"anymatch@npm:~3.1.1, anymatch@npm:~3.1.2": + version: 3.1.2 + resolution: "anymatch@npm:3.1.2" dependencies: normalize-path: ^3.0.0 picomatch: ^2.0.4 - checksum: c951385862bf114807d594bdffccb769bd7219ddc14f24fc135cde075ad2477a97991567b8bb5032d4f279f96897f0c2af6468a350a6c674ac0a5ee3b62a26d6 + checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9 languageName: node linkType: hard @@ -5165,13 +5241,6 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.0": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - "asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" @@ -5219,13 +5288,6 @@ __metadata: languageName: node linkType: hard -"async-limiter@npm:~1.0.0": - version: 1.0.1 - resolution: "async-limiter@npm:1.0.1" - checksum: 2b849695b465d93ad44c116220dee29a5aeb63adac16c1088983c339b0de57d76e82533e8e364a93a9f997f28bbfc6a92948cefc120652bd07f3b59f8d75cf2b - languageName: node - linkType: hard - "async-settle@npm:^1.0.0": version: 1.0.0 resolution: "async-settle@npm:1.0.0" @@ -5562,7 +5624,7 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.0, buffer-from@npm:^1.1.1": +"buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.1": version: 1.1.1 resolution: "buffer-from@npm:1.1.1" checksum: ccc53b69736008bff764497367c4d24879ba7122bc619ee499ff47eef3a5b885ca496e87272e7ebffa0bec3804c83f84041c616f6e3318f40624e27c1d80f045 @@ -5856,7 +5918,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.1, chokidar@npm:^3.4.3": +"chokidar@npm:3.5.1": version: 3.5.1 resolution: "chokidar@npm:3.5.1" dependencies: @@ -5875,7 +5937,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^2.0.0, chokidar@npm:^2.1.8": +"chokidar@npm:^2.0.0": version: 2.1.8 resolution: "chokidar@npm:2.1.8" dependencies: @@ -5898,6 +5960,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.4.3, chokidar@npm:^3.5.1": + version: 3.5.2 + resolution: "chokidar@npm:3.5.2" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: d1fda32fcd67d9f6170a8468ad2630a3c6194949c9db3f6a91b16478c328b2800f433fb5d2592511b6cb145a47c013ea1cce60b432b1a001ae3ee978a8bffc2d + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.1 resolution: "chownr@npm:1.1.1" @@ -5928,6 +6009,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.1.1": + version: 3.2.0 + resolution: "ci-info@npm:3.2.0" + checksum: c68995a94e95ce3f233ff845e62dfc56f2e8ff1e3f5c1361bcdd520cbbc9726d8a54cbc1a685cb9ee19c3c5e71a1dade6dda23eb364b59b8e6c32508a9b761bc + languageName: node + linkType: hard + "class-utils@npm:^0.3.5": version: 0.3.6 resolution: "class-utils@npm:0.3.6" @@ -6176,6 +6264,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.10": + version: 2.0.12 + resolution: "colorette@npm:2.0.12" + checksum: 1df990c6749826694756ecd05a771fb70fd426cf2b264cf496fb93a621fb4554fabfa8adde0923421f3e38b7265d546f6a46caf833f2d7facf45a40042b510b3 + languageName: node + linkType: hard + "comlink@npm:^4.3.1": version: 4.3.1 resolution: "comlink@npm:4.3.1" @@ -6314,6 +6409,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^2.15.0": + version: 2.15.3 + resolution: "consola@npm:2.15.3" + checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28 + languageName: node + linkType: hard + "console-control-strings@npm:^1.0.0, console-control-strings@npm:~1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -6583,7 +6685,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.6, debug@npm:^3.2.7": +"debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -6689,13 +6791,12 @@ __metadata: languageName: node linkType: hard -"default-gateway@npm:^4.2.0": - version: 4.2.0 - resolution: "default-gateway@npm:4.2.0" +"default-gateway@npm:^6.0.0": + version: 6.0.3 + resolution: "default-gateway@npm:6.0.3" dependencies: - execa: ^1.0.0 - ip-regex: ^2.1.0 - checksum: 1f5be765471689c6bab33e0c8b87363c3e2485cc1ab78904d383a8a8293a79f684da2a3303744b112503f986af4ea87d917c63a468ed913e9b0c31588c02d6a4 + execa: ^5.0.0 + checksum: 126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 languageName: node linkType: hard @@ -6715,6 +6816,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3": version: 1.1.3 resolution: "define-properties@npm:1.1.3" @@ -6752,7 +6860,7 @@ __metadata: languageName: node linkType: hard -"del@npm:^4.0.0, del@npm:^4.1.1": +"del@npm:^4.0.0": version: 4.1.1 resolution: "del@npm:4.1.1" dependencies: @@ -6767,6 +6875,22 @@ __metadata: languageName: node linkType: hard +"del@npm:^6.0.0": + version: 6.0.0 + resolution: "del@npm:6.0.0" + dependencies: + globby: ^11.0.1 + graceful-fs: ^4.2.4 + is-glob: ^4.0.1 + is-path-cwd: ^2.2.0 + is-path-inside: ^3.0.2 + p-map: ^4.0.0 + rimraf: ^3.0.2 + slash: ^3.0.0 + checksum: 5742891627e91aaf62385714025233f4664da28bc55b6ab825649dcdea4691fed3cf329a2b1913fd2d2612e693e99e08a03c84cac7f36ef54bacac9390520192 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -6843,13 +6967,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:^3.1.0": - version: 3.5.0 - resolution: "diff@npm:3.5.0" - checksum: 00842950a6551e26ce495bdbce11047e31667deea546527902661f25cc2e73358967ebc78cf86b1a9736ec3e14286433225f9970678155753a6291c3bca5227b - languageName: node - linkType: hard - "dijkstrajs@npm:^1.0.1": version: 1.0.1 resolution: "dijkstrajs@npm:1.0.1" @@ -7026,13 +7143,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.8.0": - version: 5.8.2 - resolution: "enhanced-resolve@npm:5.8.2" +"enhanced-resolve@npm:^5.8.3": + version: 5.8.3 + resolution: "enhanced-resolve@npm:5.8.3" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 6e871ec5b183220dbcdaff8580cbdacee5425e321790e5846abd1b573d20d2bcb37f73ee983fd10c6d6878d31a2d08e234e72fc91a81236d64623ee6ba7d6611 + checksum: d79fbe531106448b768bb0673fb623ec0202d7ee70373ab7d4f4745d5dfe0806f38c9db7e7da8c941288fe475ab3d538db3791fce522056eeea40ca398c9e287 languageName: node linkType: hard @@ -7068,17 +7185,6 @@ __metadata: languageName: node linkType: hard -"errno@npm:^0.1.3": - version: 0.1.7 - resolution: "errno@npm:0.1.7" - dependencies: - prr: ~1.0.1 - bin: - errno: ./cli.js - checksum: a9e414c24aa9d16c74cee74e46e1b4ff5e5b005552b5b50ca242b14fea448720a21fe515b4e4587172744b1dab9ecf919ba5a950f528d7c8ddb4b660f290db79 - languageName: node - linkType: hard - "error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" @@ -7119,10 +7225,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^0.7.1": - version: 0.7.1 - resolution: "es-module-lexer@npm:0.7.1" - checksum: c66fb633cc521529862818caf603897d58d30442c885a1a1ed16823ddbbb8a437e3952454a4b2650242df1c1b4d0efa42fedbe49594e3ef2ceb3c891cf1211dd +"es-module-lexer@npm:^0.9.0": + version: 0.9.1 + resolution: "es-module-lexer@npm:0.9.1" + checksum: 2a8ba5b85c1e6f64a31482e7999e2898d2b2d3fb41d10b5237f58e98ad50a5a9600857fce4ca95077eae8fcb7d058a9282986f0df2643870c3d33d270844e625 languageName: node linkType: hard @@ -7600,15 +7706,6 @@ __metadata: languageName: node linkType: hard -"eventsource@npm:^1.0.7": - version: 1.0.7 - resolution: "eventsource@npm:1.0.7" - dependencies: - original: ^1.0.0 - checksum: 26d6d9103ed11c4ed9cd2b69fb204176649c9686ee2440dcd08d82f741b9d38cc6e0e13e0974591ee1b7c0fc3b78f5d99f399630e46c776e797c8696469f53ac - languageName: node - linkType: hard - "execa@npm:^0.7.0": version: 0.7.0 resolution: "execa@npm:0.7.0" @@ -7898,10 +7995,12 @@ __metadata: languageName: node linkType: hard -"fecha@npm:^4.2.0": - version: 4.2.0 - resolution: "fecha@npm:4.2.0" - checksum: 4eb4235959161446f6ec1a24e34eba7362187d2c96d9dd86ea4290e345d1efd2175ccb01bbef9ee852c6790aa7af2539d08361b0499ebc9bf23b4791f5666cd0 +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b languageName: node linkType: hard @@ -8219,6 +8318,20 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:1.0.3": + version: 1.0.3 + resolution: "fs-monkey@npm:1.0.3" + checksum: cf50804833f9b88a476911ae911fe50f61a98d986df52f890bd97e7262796d023698cb2309fa9b74fdd8974f04315b648748a0a8ee059e7d5257b293bfc409c0 + languageName: node + linkType: hard + +"fs-require@npm:^1.1.0": + version: 1.1.0 + resolution: "fs-require@npm:1.1.0" + checksum: c0fc2468a21f6264b29a5287920d63b4db8a21fd32b26774d6da95798c3a54a7542fbb2889173b5d8ac07c25468a04e45a8d76c816c9c37e568a77c3695f4822 + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -8246,7 +8359,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.1#~builtin": +"fsevents@patch:fsevents@~2.3.1#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=1cc4b2" dependencies: @@ -8255,7 +8368,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -fsevents@~2.3.1: +"fsevents@~2.3.1, fsevents@~2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -8411,7 +8524,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"glob-parent@npm:^5.1.0, glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0": +"glob-parent@npm:^5.1.0, glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -8545,7 +8658,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"globby@npm:^11.0.3": +"globby@npm:^11.0.1, globby@npm:^11.0.3": version: 11.0.4 resolution: "globby@npm:11.0.4" dependencies: @@ -8869,6 +8982,7 @@ fsevents@~2.3.1: "@babel/plugin-proposal-optional-chaining": ^7.14.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-import-meta": ^7.10.4 + "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/preset-env": ^7.14.7 "@babel/preset-typescript": ^7.14.5 "@braintree/sanitize-url": ^5.0.2 @@ -8883,9 +8997,13 @@ fsevents@~2.3.1: "@codemirror/stream-parser": ^0.19.1 "@codemirror/text": ^0.19.2 "@codemirror/view": ^0.19.4 + "@formatjs/intl-datetimeformat": ^4.2.4 "@formatjs/intl-getcanonicallocales": ^1.7.3 - "@formatjs/intl-locale": ^2.4.37 - "@formatjs/intl-pluralrules": ^4.1.3 + "@formatjs/intl-locale": ^2.4.38 + "@formatjs/intl-numberformat": ^7.2.4 + "@formatjs/intl-pluralrules": ^4.1.4 + "@formatjs/intl-relativetimeformat": ^9.3.1 + "@formatjs/intl-utils": ^3.8.4 "@fullcalendar/common": 5.9.0 "@fullcalendar/core": 5.9.0 "@fullcalendar/daygrid": 5.9.0 @@ -8986,7 +9104,6 @@ fsevents@~2.3.1: eslint-plugin-unused-imports: ^1.1.2 eslint-plugin-wc: ^1.3.0 fancy-log: ^1.3.3 - fecha: ^4.2.0 fs-extra: ^7.0.1 fuse.js: ^6.0.0 google-timezones-json: ^1.0.2 @@ -9001,6 +9118,7 @@ fsevents@~2.3.1: html-minifier: ^4.0.0 husky: ^1.3.1 idb-keyval: ^5.1.3 + instant-mocha: ^1.3.1 intl-messageformat: ^9.9.1 js-yaml: ^4.1.0 leaflet: ^1.7.1 @@ -9037,10 +9155,9 @@ fsevents@~2.3.1: source-map-url: ^0.4.0 superstruct: ^0.15.2 systemjs: ^6.3.2 - terser-webpack-plugin: ^5.1.4 + terser-webpack-plugin: ^5.2.4 tinykeys: ^1.1.3 ts-lit-plugin: ^1.2.1 - ts-mocha: ^8.0.0 tsparticles: ^1.34.0 typescript: ^4.3.5 unfetch: ^4.1.0 @@ -9051,10 +9168,11 @@ fsevents@~2.3.1: vue: ^2.6.12 vue2-daterange-picker: ^0.5.1 web-animations-js: ^2.3.2 - webpack: ^5.43.0 - webpack-cli: ^4.7.2 - webpack-dev-server: ^3.11.2 - webpack-manifest-plugin: ^3.1.1 + webpack: ^5.55.1 + webpack-cli: ^4.8.0 + webpack-dev-server: ^4.3.0 + webpack-manifest-plugin: ^4.0.2 + webpackbar: ^5.0.0-3 workbox-build: ^6.1.5 workbox-cacheable-response: ^6.1.5 workbox-core: ^6.1.5 @@ -9101,10 +9219,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"html-entities@npm:^1.3.1": - version: 1.3.1 - resolution: "html-entities@npm:1.3.1" - checksum: 423e3138822a298df37aa40503c6010a4d0cfa452f01b5730cf144c41c31fb0026ee76dd5ff0d78b987a16d145f0c50f4c112a5095740718af169786b8cbdd0a +"html-entities@npm:^2.3.2": + version: 2.3.2 + resolution: "html-entities@npm:2.3.2" + checksum: 522d8d202df301ff51b517a379e642023ed5c81ea9fb5674ffad88cff386165733d00b6089d5c2fcc644e44777d6072017b6216d8fa40f271d3610420d00a886 languageName: node linkType: hard @@ -9218,19 +9336,20 @@ fsevents@~2.3.1: languageName: node linkType: hard -"http-proxy-middleware@npm:0.19.1": - version: 0.19.1 - resolution: "http-proxy-middleware@npm:0.19.1" +"http-proxy-middleware@npm:^2.0.0": + version: 2.0.1 + resolution: "http-proxy-middleware@npm:2.0.1" dependencies: - http-proxy: ^1.17.0 - is-glob: ^4.0.0 - lodash: ^4.17.11 - micromatch: ^3.1.10 - checksum: 64df0438417a613bb22b3689d9652a1b7a56f10b145a463f95f4e8a9b9a351f2c63bc5fd3a9cd710baec224897733b6f299cb7f974ea82769b2a4f1e074764ac + "@types/http-proxy": ^1.17.5 + http-proxy: ^1.18.1 + is-glob: ^4.0.1 + is-plain-obj: ^3.0.0 + micromatch: ^4.0.2 + checksum: 0de65bc6644b6efae5d26cd3bec071ceaeb92f26856ffee5ecdde9c702ea1435936e7dfb09da2ac0883eada80fdc993e9925902fc10bf6625565d6365f8cb30f languageName: node linkType: hard -"http-proxy@npm:^1.17.0": +"http-proxy@npm:^1.18.1": version: 1.18.1 resolution: "http-proxy@npm:1.18.1" dependencies: @@ -9371,18 +9490,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"import-local@npm:^2.0.0": - version: 2.0.0 - resolution: "import-local@npm:2.0.0" - dependencies: - pkg-dir: ^3.0.0 - resolve-cwd: ^2.0.0 - bin: - import-local-fixture: fixtures/cli.js - checksum: b8469252483624379fd65d53c82f3658b32a1136f7168bfeea961a4ea7ca10a45786ea2b02e0006408f9cd22d2f33305a6f17a64e4d5a03274a50942c5e7c949 - languageName: node - linkType: hard - "import-local@npm:^3.0.2": version: 3.0.2 resolution: "import-local@npm:3.0.2" @@ -9435,7 +9542,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.1, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -9456,13 +9563,35 @@ fsevents@~2.3.1: languageName: node linkType: hard -"internal-ip@npm:^4.3.0": - version: 4.3.0 - resolution: "internal-ip@npm:4.3.0" +"instant-mocha@npm:^1.3.1": + version: 1.3.1 + resolution: "instant-mocha@npm:1.3.1" dependencies: - default-gateway: ^4.2.0 - ipaddr.js: ^1.9.0 - checksum: c970433c84d9a6b46e2c9f5ab7785d3105b856d0a566891bf919241b5a884c5c1c9bf8e915aebb822a86c14b1b6867e58c1eaf5cd49eb023368083069d1a4a9a + aggregate-error: ^3.1.0 + ansi-escapes: ^4.3.2 + fs-require: ^1.1.0 + memfs: ^3.2.2 + minimist: ^1.2.5 + source-map-support: ^0.5.19 + yargs: ^16.2.0 + peerDependencies: + mocha: ^6.1.4 || ^8.3.2 + webpack: ^4.40.0 || ^5.0.0 + bin: + instant-mocha: bin/instant-mocha.js + checksum: f4313d75249b63ef58cf62bb92a44bc284c556d6ce8430483e564718fea75797a0f587640af7efe69252690df1c3f10fd9ebda4d445f4da3fac35f41249c2e8d + languageName: node + linkType: hard + +"internal-ip@npm:^6.2.0": + version: 6.2.0 + resolution: "internal-ip@npm:6.2.0" + dependencies: + default-gateway: ^6.0.0 + ipaddr.js: ^1.9.1 + is-ip: ^3.1.0 + p-event: ^4.2.0 + checksum: 6d08299c052c4ec926fa4e3643049d81daacbc33d3ab90fc30cd59cd7f12902152107bc75778e1202a269eb82cab0c412ff04a78f0361e056de0c5c2628881fa languageName: node linkType: hard @@ -9508,10 +9637,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"ip-regex@npm:^2.1.0": - version: 2.1.0 - resolution: "ip-regex@npm:2.1.0" - checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba +"ip-regex@npm:^4.0.0": + version: 4.3.0 + resolution: "ip-regex@npm:4.3.0" + checksum: 7ff904b891221b1847f3fdf3dbb3e6a8660dc39bc283f79eb7ed88f5338e1a3d1104b779bc83759159be266249c59c2160e779ee39446d79d4ed0890dfd06f08 languageName: node linkType: hard @@ -9522,17 +9651,24 @@ fsevents@~2.3.1: languageName: node linkType: hard -"ipaddr.js@npm:1.9.0, ipaddr.js@npm:^1.9.0": +"ipaddr.js@npm:1.9.0": version: 1.9.0 resolution: "ipaddr.js@npm:1.9.0" checksum: 56254f753959132884d74355fc45fda74f120283695c831a07bfac3368965bc9452cbdb80d5e38a6211de4e98a32ddbcd2e640137eb3f79a251c5c725a9efbd6 languageName: node linkType: hard -"is-absolute-url@npm:^3.0.3": - version: 3.0.3 - resolution: "is-absolute-url@npm:3.0.3" - checksum: 5159b51d065d9ad29e16a2f78d6c0e41c43227caf90a45e659c54ea6fd50ef0595b1871ce392e84b1df7cfdcad9a8e66eec0813a029112188435abf115accb16 +"ipaddr.js@npm:^1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + languageName: node + linkType: hard + +"ipaddr.js@npm:^2.0.1": + version: 2.0.1 + resolution: "ipaddr.js@npm:2.0.1" + checksum: dd194a394a843d470f88d17191b0948f383ed1c8e320813f850c336a0fcb5e9215d97ec26ca35ab4fbbd31392c8b3467f3e8344628029ed3710b2ff6b5d1034e languageName: node linkType: hard @@ -9693,10 +9829,12 @@ fsevents@~2.3.1: languageName: node linkType: hard -"is-docker@npm:^2.0.0": - version: 2.0.0 - resolution: "is-docker@npm:2.0.0" - checksum: 9b0733c2b3933b0ff77204759d40d2b8226bf8aa2ceaf61be27dc1412bb48dc45b33e2ec613f2072d4c3f766fd521f64b3f1a5c1da1d688fde71e16610712f91 +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 languageName: node linkType: hard @@ -9787,6 +9925,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"is-ip@npm:^3.1.0": + version: 3.1.0 + resolution: "is-ip@npm:3.1.0" + dependencies: + ip-regex: ^4.0.0 + checksum: da2c2b282407194adf2320bade0bad94be9c9d0bdab85ff45b1b62d8185f31c65dff3884519d57bf270277e5ea2046c7916a6e5a6db22fe4b7ddcdd3760f23eb + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -9852,10 +9999,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"is-path-cwd@npm:^2.0.0": - version: 2.0.0 - resolution: "is-path-cwd@npm:2.0.0" - checksum: f86a7453931158acf8b4f3c6234e1e535fa88deb865457584dd01112ded3c6296fcae460e277ffffb549db5ebf78b2c75f57870c813576db12ea3d8fb79aff4e +"is-path-cwd@npm:^2.0.0, is-path-cwd@npm:^2.2.0": + version: 2.2.0 + resolution: "is-path-cwd@npm:2.2.0" + checksum: 46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048 languageName: node linkType: hard @@ -9877,6 +10024,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"is-path-inside@npm:^3.0.2": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + "is-plain-obj@npm:^2.1.0": version: 2.1.0 resolution: "is-plain-obj@npm:2.1.0" @@ -9884,6 +10038,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c + languageName: node + linkType: hard + "is-plain-object@npm:^2.0.1, is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -10002,14 +10163,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"is-wsl@npm:^1.1.0": - version: 1.1.0 - resolution: "is-wsl@npm:1.1.0" - checksum: ea157d232351e68c92bd62fc541771096942fe72f69dff452dd26dcc31466258c570a3b04b8cda2e01cd2968255b02951b8670d08ea4ed76d6b1a646061ac4fe - languageName: node - linkType: hard - -"is-wsl@npm:^2.1.1": +"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" dependencies: @@ -10090,14 +10244,14 @@ fsevents@~2.3.1: languageName: node linkType: hard -"jest-worker@npm:^27.0.2": - version: 27.0.6 - resolution: "jest-worker@npm:27.0.6" +"jest-worker@npm:^27.0.6": + version: 27.2.4 + resolution: "jest-worker@npm:27.2.4" dependencies: "@types/node": "*" merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: cef42e551033839940ed26c121b7d19ff85316fb5e4b815e1fca28744c884173bb3a6be64729bc95c281902db5142685700fc0922628b646151b0f5dcabbeb37 + checksum: 0caae100e97e247a1c0140928fff075aade1a41317f18316e63db32b626858dff3552bf4e09c9c3bd9af5e8dbe92123fdaed3c9cc8f5439ec64cd970c612bd5d languageName: node linkType: hard @@ -10209,13 +10363,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"json3@npm:^3.3.3": - version: 3.3.3 - resolution: "json3@npm:3.3.3" - checksum: 55eda204a4c70d11b7d5caa5cb64c76a3aa54d5df72d07bdf446b922fd7cb8657b0732f68e0c36790f55e195e0a429c299144ff05430bbe93bc2a7c81ad3472b - languageName: node - linkType: hard - "json5@npm:^1.0.1": version: 1.0.1 resolution: "json5@npm:1.0.1" @@ -10286,13 +10433,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"killable@npm:^1.0.1": - version: 1.0.1 - resolution: "killable@npm:1.0.1" - checksum: 911a85c6e390c19d72c4e3149347cf44042cbd7d18c3c6c5e4f706fdde6e0ed532473392e282c7ef27f518407e6cb7d2a0e71a2ae8d8d8f8ffdb68891a29a68a - languageName: node - linkType: hard - "kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -10974,13 +11114,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"loglevel@npm:^1.6.8": - version: 1.7.0 - resolution: "loglevel@npm:1.7.0" - checksum: f6bb16fa525e22c053f054f6c9d957b9cdf98acb26a075138c2a5982a9f86a7b20c0e97fa9811fd2f3c2bb13481deadb2e56e245f5f20b194caa381553a8f898 - languageName: node - linkType: hard - "loud-rejection@npm:^1.0.0": version: 1.6.0 resolution: "loud-rejection@npm:1.6.0" @@ -11044,13 +11177,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"make-error@npm:^1.1.1": - version: 1.3.5 - resolution: "make-error@npm:1.3.5" - checksum: bb9578cb5f36df27509b2a269fc5fda483130096e2989fff8788c2608ed01be780d1e85ba3653e27c0863a114c560410b410be89e19271cb5ff987c37a17c1fd - languageName: node - linkType: hard - "make-fetch-happen@npm:^8.0.14": version: 8.0.14 resolution: "make-fetch-happen@npm:8.0.14" @@ -11141,6 +11267,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"memfs@npm:^3.2.2": + version: 3.3.0 + resolution: "memfs@npm:3.3.0" + dependencies: + fs-monkey: 1.0.3 + checksum: 9e9eb71cfc077fd5e14ad2f497f5a8791689b64f307cf379ed6737c5781652a7af0509395c0dfba43c4e413dbc7cd7010e9ca002168ec329e6df178414b96268 + languageName: node + linkType: hard + "memoize-one@npm:^5.2.1": version: 5.2.1 resolution: "memoize-one@npm:5.2.1" @@ -11155,16 +11290,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"memory-fs@npm:^0.4.1": - version: 0.4.1 - resolution: "memory-fs@npm:0.4.1" - dependencies: - errno: ^0.1.3 - readable-stream: ^2.0.1 - checksum: 6db6c8682eff836664ca9b5b6052ae38d21713dda9d0ef4700fa5c0599a8bc16b2093bee75ac3dedbe59fb2222d368f25bafaa62ba143c41051359cbcb005044 - languageName: node - linkType: hard - "meow@npm:^3.3.0, meow@npm:^3.7.0": version: 3.7.0 resolution: "meow@npm:3.7.0" @@ -11251,10 +11376,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"mime-db@npm:1.44.0, mime-db@npm:>= 1.43.0 < 2": - version: 1.44.0 - resolution: "mime-db@npm:1.44.0" - checksum: b2613996804d690adc4ca6744479b8ef08b04db7e99f84ab7e1274e0c2503a446d22296016ae0ea1a1d159858866445601c1f43d46c8d71d52f72842b1780c15 +"mime-db@npm:1.49.0, mime-db@npm:>= 1.43.0 < 2": + version: 1.49.0 + resolution: "mime-db@npm:1.49.0" + checksum: 3744efc45b17896ff8a5934a761c434d5ffe3c7816662002d799ca9934347e00f99ae4d9b4ddf1c48d391cc9e522cc4523a6e77e7701f8e27c426e3e1d6e215a languageName: node linkType: hard @@ -11274,12 +11399,12 @@ fsevents@~2.3.1: languageName: node linkType: hard -"mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24": - version: 2.1.27 - resolution: "mime-types@npm:2.1.27" +"mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24": + version: 2.1.32 + resolution: "mime-types@npm:2.1.32" dependencies: - mime-db: 1.44.0 - checksum: 4c1f596c6ddfc1a9c37356e91f471ae6e72401288197de31ef3604cf02ef14c6ac661adce55cece1f1c626a96d780ffd47435619606c103cb967fb007729eefb + mime-db: 1.49.0 + checksum: 4487dfd2f872126d2c219ec731ad47a6169a438d5a4cce6ecef7594ce08eaefaf0d85429485a76ec005f095016c7ec488a24cf8bfcc0ea06de0355e23395746f languageName: node linkType: hard @@ -11292,15 +11417,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"mime@npm:^2.4.4": - version: 2.4.4 - resolution: "mime@npm:2.4.4" - bin: - mime: cli.js - checksum: a8dad06df1a55f56241789ed0bd0b8b42042bf9575b35ba4bbe3051352569511d191a882168f990b2d845ce41a77b0f48347f085344494874e86ed7969f3973b - languageName: node - linkType: hard - "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -12055,12 +12171,14 @@ fsevents@~2.3.1: languageName: node linkType: hard -"opn@npm:^5.5.0": - version: 5.5.0 - resolution: "opn@npm:5.5.0" +"open@npm:^8.0.9": + version: 8.2.1 + resolution: "open@npm:8.2.1" dependencies: - is-wsl: ^1.1.0 - checksum: 35b677b5a1fd6c8cb1996b0607671ba79f7ce9fa029217d54eafaf6bee13eb7e700691c6a415009140fd02a435fffdfd143875f3b233b60f3f9d631c6f6b81a0 + define-lazy-prop: ^2.0.0 + is-docker: ^2.1.1 + is-wsl: ^2.2.0 + checksum: fcde0059188dd497e080436f81c5240dad0bebd331d1c856a532d4b870808bdc5770ef7c5c4b83143fd0c0577fe2b580e54c03357d695771259aa59f64cf0f40 languageName: node linkType: hard @@ -12087,15 +12205,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"original@npm:^1.0.0": - version: 1.0.2 - resolution: "original@npm:1.0.2" - dependencies: - url-parse: ^1.4.3 - checksum: 8dca9311dab50c8953366127cb86b7c07bf547d6aa6dc6873a75964b7563825351440557e5724d9c652c5e99043b8295624f106af077f84bccf19592e421beb9 - languageName: node - linkType: hard - "os-homedir@npm:^1.0.0": version: 1.0.2 resolution: "os-homedir@npm:1.0.2" @@ -12129,6 +12238,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"p-event@npm:^4.2.0": + version: 4.2.0 + resolution: "p-event@npm:4.2.0" + dependencies: + p-timeout: ^3.1.0 + checksum: 8a3588f7a816a20726a3262dfeee70a631e3997e4773d23219176333eda55cce9a76219e3d2b441b331eb746e14fdb381eb2694ab9ff2fcf87c846462696fe89 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -12222,12 +12340,22 @@ fsevents@~2.3.1: languageName: node linkType: hard -"p-retry@npm:^3.0.1": - version: 3.0.1 - resolution: "p-retry@npm:3.0.1" +"p-retry@npm:^4.5.0": + version: 4.6.1 + resolution: "p-retry@npm:4.6.1" dependencies: - retry: ^0.12.0 - checksum: 702efc63fc13ef7fc0bab9a1b08432ab38a0236efcbce64af0cf692030ba6ed8009f29ba66e3301cb98dc69ef33e7ccab29ba1ac2bea897f802f81f4f7e468dd + "@types/retry": ^0.12.0 + retry: ^0.13.1 + checksum: e6d540413bb3d0b96e0db44f74a7af1dce41f5005e6e84d617960110b148348c86a3987be07797749e3ddd55817dd3a8ffd6eae3428758bc2994d987e48c3a70 + languageName: node + linkType: hard + +"p-timeout@npm:^3.1.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: ^1.0.0 + checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c languageName: node linkType: hard @@ -12665,7 +12793,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"portfinder@npm:^1.0.26, portfinder@npm:^1.0.28": +"portfinder@npm:^1.0.28": version: 1.0.28 resolution: "portfinder@npm:1.0.28" dependencies: @@ -12729,6 +12857,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"pretty-time@npm:^1.1.0": + version: 1.1.0 + resolution: "pretty-time@npm:1.1.0" + checksum: a319e7009aadbc6cfedbd8b66861327d3a0c68bd3e8794bf5b86f62b40b01b9479c5a70c76bb368ad454acce52a1216daee460cc825766e2442c04f3a84a02c9 + languageName: node + linkType: hard + "process-nextick-args@npm:^1.0.7": version: 1.0.7 resolution: "process-nextick-args@npm:1.0.7" @@ -12800,13 +12935,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"prr@npm:~1.0.1": - version: 1.0.1 - resolution: "prr@npm:1.0.1" - checksum: 3bca2db0479fd38f8c4c9439139b0c42dcaadcc2fbb7bb8e0e6afaa1383457f1d19aea9e5f961d5b080f1cfc05bfa1fe9e45c97a1d3fd6d421950a73d3108381 - languageName: node - linkType: hard - "pseudomap@npm:^1.0.2": version: 1.0.2 resolution: "pseudomap@npm:1.0.2" @@ -12906,13 +13034,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 - languageName: node - linkType: hard - "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -13085,6 +13206,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -13352,15 +13482,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"resolve-cwd@npm:^2.0.0": - version: 2.0.0 - resolution: "resolve-cwd@npm:2.0.0" - dependencies: - resolve-from: ^3.0.0 - checksum: e7c16880c460656e77f102d537a6dc82b3657d9173697cd6ea82ffce37df96f6c1fc79d0bb35fd73fff8871ac13f21b4396958b5f0a13e5b99c97d69f5e319fa - languageName: node - linkType: hard - "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -13471,6 +13592,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -13654,17 +13782,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"schema-utils@npm:^1.0.0": - version: 1.0.0 - resolution: "schema-utils@npm:1.0.0" - dependencies: - ajv: ^6.1.0 - ajv-errors: ^1.0.0 - ajv-keywords: ^3.1.0 - checksum: e8273b4f6eff9ddf4a4f4c11daf7b96b900237bf8859c86fa1e9b4fab416b72d7ea92468f8db89c18a3499a1070206e1c8a750c83b42d5325fc659cbb55eee88 - languageName: node - linkType: hard - "schema-utils@npm:^2.6.5": version: 2.6.5 resolution: "schema-utils@npm:2.6.5" @@ -13675,14 +13792,14 @@ fsevents@~2.3.1: languageName: node linkType: hard -"schema-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "schema-utils@npm:3.0.0" +"schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": + version: 3.1.1 + resolution: "schema-utils@npm:3.1.1" dependencies: - "@types/json-schema": ^7.0.6 + "@types/json-schema": ^7.0.8 ajv: ^6.12.5 ajv-keywords: ^3.5.2 - checksum: 56dc93b4f6abe91aa2b76b2c656610cc6d491297f4e6866340bc7b6b226b521a2969ab2498cd9e6c59eda670b730a9c8695404ca56c08643c3b95c5e174588c8 + checksum: fb73f3d759d43ba033c877628fe9751620a26879f6301d3dbeeb48cf2a65baec5cdf99da65d1bf3b4ff5444b2e59cbe4f81c2456b5e0d2ba7d7fd4aed5da29ce languageName: node linkType: hard @@ -13693,12 +13810,12 @@ fsevents@~2.3.1: languageName: node linkType: hard -"selfsigned@npm:^1.10.8": - version: 1.10.8 - resolution: "selfsigned@npm:1.10.8" +"selfsigned@npm:^1.10.11": + version: 1.10.11 + resolution: "selfsigned@npm:1.10.11" dependencies: node-forge: ^0.10.0 - checksum: c7028385cb3c011c6d7a4fe56d0f94ac1511ad175a87b49e7192f8ea43d1363d5f24283b2831071c0ad2d26ad19b9a6e81dba7f052490c245001ee61a2541e7d + checksum: 1fd8fd317dc0b7d713d12d828131ac03c53abf41c4538b263fecd37bbc15688526c631654049ff00806b757ccb85492de6a13d6fefcad5cb54926631e48a76e1 languageName: node linkType: hard @@ -14054,20 +14171,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"sockjs-client@npm:^1.5.0": - version: 1.5.0 - resolution: "sockjs-client@npm:1.5.0" - dependencies: - debug: ^3.2.6 - eventsource: ^1.0.7 - faye-websocket: ^0.11.3 - inherits: ^2.0.4 - json3: ^3.3.3 - url-parse: ^1.4.7 - checksum: b09203361c3fee6fafac1a78fedf3a73879c278fbf56a96b4deac3a2eea8973804b04a8ea1ff4fe00856ff01a9ca73a574a31718ed477e61774830eb24844541 - languageName: node - linkType: hard - "sockjs@npm:^0.3.21": version: 0.3.21 resolution: "sockjs@npm:0.3.21" @@ -14127,13 +14230,13 @@ fsevents@~2.3.1: languageName: node linkType: hard -"source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.19": - version: 0.5.19 - resolution: "source-map-support@npm:0.5.19" +"source-map-support@npm:^0.5.19, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.20": + version: 0.5.20 + resolution: "source-map-support@npm:0.5.20" dependencies: buffer-from: ^1.0.0 source-map: ^0.6.0 - checksum: c72802fdba9cb62b92baef18cc14cc4047608b77f0353e6c36dd993444149a466a2845332c5540d4a6630957254f0f68f4ef5a0120c33d2e83974c51a05afbac + checksum: 43946aff452011960d16154304b11011e0185549493e65dd90da045959409fb2d266ba1c854fff3d5949f8e59382e3fcc7f7c5fa66136007a6750ad06c6c0baa languageName: node linkType: hard @@ -14298,6 +14401,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"std-env@npm:^2.2.1": + version: 2.3.1 + resolution: "std-env@npm:2.3.1" + dependencies: + ci-info: ^3.1.1 + checksum: 049be0d6fb7ff544b3061a53ccaddd3ab2f6930f50b432f54dc82b22cb813c6e408ed69807c7c6bc592fccfc92d5c431dcc1aacd7c9ca99d304948f3149a08da + languageName: node + linkType: hard + "stream-exhaust@npm:^1.0.1": version: 1.0.2 resolution: "stream-exhaust@npm:1.0.2" @@ -14474,6 +14586,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"strip-ansi@npm:^7.0.0": + version: 7.0.1 + resolution: "strip-ansi@npm:7.0.1" + dependencies: + ansi-regex: ^6.0.1 + checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + languageName: node + linkType: hard + "strip-bom@npm:^2.0.0": version: 2.0.0 resolution: "strip-bom@npm:2.0.0" @@ -14716,19 +14837,26 @@ fsevents@~2.3.1: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.1.4": - version: 5.1.4 - resolution: "terser-webpack-plugin@npm:5.1.4" +"terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.2.4": + version: 5.2.4 + resolution: "terser-webpack-plugin@npm:5.2.4" dependencies: - jest-worker: ^27.0.2 + jest-worker: ^27.0.6 p-limit: ^3.1.0 - schema-utils: ^3.0.0 + schema-utils: ^3.1.1 serialize-javascript: ^6.0.0 source-map: ^0.6.1 - terser: ^5.7.0 + terser: ^5.7.2 peerDependencies: webpack: ^5.1.0 - checksum: 7e5f97ac1944aaff12460201496314ab75d842f4f088e0344ca5143caf85a340d7b0294ed6b4e32b52bbd1bea71648d6417034e889872c582c1be4840e9bd0e7 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: ddbcdd28f9620ecacc9b50ff31776485ad012c7f1cbef53825e4fc334a78d82e2344346e5595751916494951bc64717004c07b03ad88deeb3df4a5f76c559cc9 languageName: node linkType: hard @@ -14745,16 +14873,16 @@ fsevents@~2.3.1: languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.7.0": - version: 5.7.0 - resolution: "terser@npm:5.7.0" +"terser@npm:^5.0.0, terser@npm:^5.7.2": + version: 5.9.0 + resolution: "terser@npm:5.9.0" dependencies: commander: ^2.20.0 source-map: ~0.7.2 - source-map-support: ~0.5.19 + source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 3abeb551865079b27e2890dbec866054967d1963fc80a81e5e14e414c43db88ff53a5e88844c145df11bed01b28040aa96afd82113c6d1a6ad28409b6cae4fde + checksum: 11c1246b1991015a8881742878af779e3863fad42f626ffda957dbf28c94bf51e7994cffb9ffbec86ff3c23ab45ffa6d79d453c15e664306e35fc7b2c4eee5f4 languageName: node linkType: hard @@ -14981,41 +15109,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"ts-mocha@npm:^8.0.0": - version: 8.0.0 - resolution: "ts-mocha@npm:8.0.0" - dependencies: - ts-node: 7.0.1 - tsconfig-paths: ^3.5.0 - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X - dependenciesMeta: - tsconfig-paths: - optional: true - bin: - ts-mocha: bin/ts-mocha - checksum: 66062e82f9be469cdcf51b120ff83e4a69c664fafb3ee020708cb5d65e87ee6bd8c98703a1012f2fb583d540dcbe14e0be77a36ea69a6c08ba3c89345859d8d9 - languageName: node - linkType: hard - -"ts-node@npm:7.0.1": - version: 7.0.1 - resolution: "ts-node@npm:7.0.1" - dependencies: - arrify: ^1.0.0 - buffer-from: ^1.1.0 - diff: ^3.1.0 - make-error: ^1.1.1 - minimist: ^1.2.0 - mkdirp: ^0.5.1 - source-map-support: ^0.5.6 - yn: ^2.0.0 - bin: - ts-node: dist/bin.js - checksum: 07ed6ea1805361828737a767cfd6c57ea6e267ee8679282afb933610af02405e1a87c1f2aea1d38ed8e66b34fcbf6272b6021ab95d78849105d2e57fc283870b - languageName: node - linkType: hard - "ts-simple-type@npm:~1.0.5": version: 1.0.7 resolution: "ts-simple-type@npm:1.0.7" @@ -15023,7 +15116,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"tsconfig-paths@npm:^3.5.0, tsconfig-paths@npm:^3.9.0": +"tsconfig-paths@npm:^3.9.0": version: 3.9.0 resolution: "tsconfig-paths@npm:3.9.0" dependencies: @@ -15400,16 +15493,6 @@ typescript@^4.3.5: languageName: node linkType: hard -"url-parse@npm:^1.4.3, url-parse@npm:^1.4.7": - version: 1.5.1 - resolution: "url-parse@npm:1.5.1" - dependencies: - querystringify: ^2.1.1 - requires-port: ^1.0.0 - checksum: ce5c400db52d83b941944502000081e2338e46834cf16f2888961dc034ea5d49dbeb85ac8fdbe28c3fe738c09320a71a2f6d9286b748895cd464b1e208b6b991 - languageName: node - linkType: hard - "url@npm:^0.11.0": version: 0.11.0 resolution: "url@npm:0.11.0" @@ -15450,7 +15533,7 @@ typescript@^4.3.5: languageName: node linkType: hard -"uuid@npm:^3.3.2, uuid@npm:^3.4.0": +"uuid@npm:^3.4.0": version: 3.4.0 resolution: "uuid@npm:3.4.0" bin: @@ -15750,14 +15833,14 @@ typescript@^4.3.5: languageName: node linkType: hard -"webpack-cli@npm:^4.7.2": - version: 4.7.2 - resolution: "webpack-cli@npm:4.7.2" +"webpack-cli@npm:^4.8.0": + version: 4.8.0 + resolution: "webpack-cli@npm:4.8.0" dependencies: "@discoveryjs/json-ext": ^0.5.0 "@webpack-cli/configtest": ^1.0.4 "@webpack-cli/info": ^1.3.0 - "@webpack-cli/serve": ^1.5.1 + "@webpack-cli/serve": ^1.5.2 colorette: ^1.2.1 commander: ^7.0.0 execa: ^5.0.0 @@ -15780,92 +15863,74 @@ typescript@^4.3.5: optional: true bin: webpack-cli: bin/cli.js - checksum: 4a7ed6099d2da6d0c6e2d4914d45b53a5200cfc811c38eb622b792a364a2bec8104517bf5c33a616a4f21d17d7041e5ed1075c9a81e1593f09a7971bb3107f1a + checksum: 3ab4b5af09b56bb14d2ef2dd5613a14d01d9b4319bffb854edc379ef0f44e49ec31f96fb8cdd9dc8df54f6c94e9240d647a82d3cd0871fc5c313ab89fc2cd935 languageName: node linkType: hard -"webpack-dev-middleware@npm:^3.7.2": - version: 3.7.2 - resolution: "webpack-dev-middleware@npm:3.7.2" +"webpack-dev-middleware@npm:^5.2.1": + version: 5.2.1 + resolution: "webpack-dev-middleware@npm:5.2.1" dependencies: - memory-fs: ^0.4.1 - mime: ^2.4.4 - mkdirp: ^0.5.1 + colorette: ^2.0.10 + memfs: ^3.2.2 + mime-types: ^2.1.31 range-parser: ^1.2.1 - webpack-log: ^2.0.0 - peerDependencies: - webpack: ^4.0.0 - checksum: d7320d7a8c65fa1af702c5b723ffb4e55219f340025ced17871e3d2e8f3a7cde3ad505cfd1572d31955d7d972bf3d29e7007577e28bad8d469dc3d5c64d30b74 - languageName: node - linkType: hard - -"webpack-dev-server@npm:^3.11.2": - version: 3.11.2 - resolution: "webpack-dev-server@npm:3.11.2" - dependencies: - ansi-html: 0.0.7 - bonjour: ^3.5.0 - chokidar: ^2.1.8 - compression: ^1.7.4 - connect-history-api-fallback: ^1.6.0 - debug: ^4.1.1 - del: ^4.1.1 - express: ^4.17.1 - html-entities: ^1.3.1 - http-proxy-middleware: 0.19.1 - import-local: ^2.0.0 - internal-ip: ^4.3.0 - ip: ^1.1.5 - is-absolute-url: ^3.0.3 - killable: ^1.0.1 - loglevel: ^1.6.8 - opn: ^5.5.0 - p-retry: ^3.0.1 - portfinder: ^1.0.26 - schema-utils: ^1.0.0 - selfsigned: ^1.10.8 - semver: ^6.3.0 - serve-index: ^1.9.1 - sockjs: ^0.3.21 - sockjs-client: ^1.5.0 - spdy: ^4.0.2 - strip-ansi: ^3.0.1 - supports-color: ^6.1.0 - url: ^0.11.0 - webpack-dev-middleware: ^3.7.2 - webpack-log: ^2.0.0 - ws: ^6.2.1 - yargs: ^13.3.2 + schema-utils: ^3.1.0 peerDependencies: webpack: ^4.0.0 || ^5.0.0 + checksum: 06f3ef14ec983d115d7109f37312fc691c867c95fe7579784c7b80db0a2be77392fa27de444d0a937546da68c7e99640c13df73dc1351bbed7ebab4cc5569f14 + languageName: node + linkType: hard + +"webpack-dev-server@npm:^4.3.0": + version: 4.3.0 + resolution: "webpack-dev-server@npm:4.3.0" + dependencies: + ansi-html-community: ^0.0.8 + bonjour: ^3.5.0 + chokidar: ^3.5.1 + colorette: ^2.0.10 + compression: ^1.7.4 + connect-history-api-fallback: ^1.6.0 + del: ^6.0.0 + express: ^4.17.1 + graceful-fs: ^4.2.6 + html-entities: ^2.3.2 + http-proxy-middleware: ^2.0.0 + internal-ip: ^6.2.0 + ipaddr.js: ^2.0.1 + open: ^8.0.9 + p-retry: ^4.5.0 + portfinder: ^1.0.28 + schema-utils: ^3.1.0 + selfsigned: ^1.10.11 + serve-index: ^1.9.1 + sockjs: ^0.3.21 + spdy: ^4.0.2 + strip-ansi: ^7.0.0 + url: ^0.11.0 + webpack-dev-middleware: ^5.2.1 + ws: ^8.1.0 + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 peerDependenciesMeta: webpack-cli: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: d2bfa2e9a33f96dc5af8f771e9978956e59c3efcad3deaca246ea7ff219c5587ebcf20ea0f0b6af251dec5e8111c0e473aa43a57bc9a88fb3ad8573f4a321805 + checksum: 7ee8ae969a1eff65caedc7dd935a3bf62f0ca21fdd5d169884cba525d9c970e551fa250f230bda0c57a76cd61411fae5bfcbc104bafff14c9cad7f4a6f9b0022 languageName: node linkType: hard -"webpack-log@npm:^2.0.0": - version: 2.0.0 - resolution: "webpack-log@npm:2.0.0" - dependencies: - ansi-colors: ^3.0.0 - uuid: ^3.3.2 - checksum: 4757179310995e20633ec2d77a8c1ac11e4135c84745f57148692f8195f1c0f8ec122c77d0dc16fc484b7d301df6674f36c9fc6b1ff06b5cf142abaaf5d24f4f - languageName: node - linkType: hard - -"webpack-manifest-plugin@npm:^3.1.1": - version: 3.1.1 - resolution: "webpack-manifest-plugin@npm:3.1.1" +"webpack-manifest-plugin@npm:^4.0.2": + version: 4.0.2 + resolution: "webpack-manifest-plugin@npm:4.0.2" dependencies: tapable: ^2.0.0 webpack-sources: ^2.2.0 peerDependencies: - webpack: ">=4.44.2" - checksum: 739b58d077dd82f78c3c79b4e4be6affb61abe59876533f739362c0ef6608c2983c9477ed2c7692a77599a0068b63f41785ce5dfb0f5819ad537ff66fafed4fb + webpack: ^4.44.2 || ^5.47.0 + checksum: 7f8a338b977bb9a8be10196d17e033f965b97735d36258513e5104b148c8ad1da8441bb8f9c8580b9455f40201ac2ac2a2edcce6ef60e46f072519c0cc0d1f70 languageName: node linkType: hard @@ -15879,7 +15944,7 @@ typescript@^4.3.5: languageName: node linkType: hard -"webpack-sources@npm:^2.2.0, webpack-sources@npm:^2.3.0": +"webpack-sources@npm:^2.2.0": version: 2.3.0 resolution: "webpack-sources@npm:2.3.0" dependencies: @@ -15889,20 +15954,28 @@ typescript@^4.3.5: languageName: node linkType: hard -"webpack@npm:^5.43.0": - version: 5.43.0 - resolution: "webpack@npm:5.43.0" +"webpack-sources@npm:^3.2.0": + version: 3.2.1 + resolution: "webpack-sources@npm:3.2.1" + checksum: 438ee4759f70ee2d5ae17a2fc5e66a1f71f0ba8ad9de77edfaf4180c82925f6504790c5a1ddfa2a6d409212cd9e7332a6822d6acabb0f39303bc3b14354872e6 + languageName: node + linkType: hard + +"webpack@npm:^5.55.1": + version: 5.55.1 + resolution: "webpack@npm:5.55.1" dependencies: "@types/eslint-scope": ^3.7.0 - "@types/estree": ^0.0.49 + "@types/estree": ^0.0.50 "@webassemblyjs/ast": 1.11.1 "@webassemblyjs/wasm-edit": 1.11.1 "@webassemblyjs/wasm-parser": 1.11.1 acorn: ^8.4.1 + acorn-import-assertions: ^1.7.6 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.8.0 - es-module-lexer: ^0.7.1 + enhanced-resolve: ^5.8.3 + es-module-lexer: ^0.9.0 eslint-scope: 5.1.1 events: ^3.2.0 glob-to-regexp: ^0.4.1 @@ -15911,17 +15984,35 @@ typescript@^4.3.5: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.0.0 + schema-utils: ^3.1.0 tapable: ^2.1.1 terser-webpack-plugin: ^5.1.3 watchpack: ^2.2.0 - webpack-sources: ^2.3.0 + webpack-sources: ^3.2.0 peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 24f3a34758c8836db22d8f107a11ca63ad76a23c6a60759ee27386e77df5674ba71f15af9dc5077e2d049c4e6cf278f9e047725ad65ffbe6cb1f797aa51ebcca + checksum: 70b447f76d4320bd82229cf7b787c6067c40d35142295408dd662eaa3bdf0d97f587d7913b981e4cc25cff08bb14307b85c18ed4a7b270b22e6586c5770d3f1e + languageName: node + linkType: hard + +"webpackbar@npm:^5.0.0-3": + version: 5.0.0-3 + resolution: "webpackbar@npm:5.0.0-3" + dependencies: + ansi-escapes: ^4.3.1 + chalk: ^4.1.0 + consola: ^2.15.0 + figures: ^3.2.0 + pretty-time: ^1.1.0 + std-env: ^2.2.1 + text-table: ^0.2.0 + wrap-ansi: ^7.0.0 + peerDependencies: + webpack: 3 || 4 || 5 + checksum: 21cd1a084107538b1803396e004a48f981f9a727be58a670a1154d61f5650ec8cdae6f987f0630519ff566259b56c7dbc81d1eb0d3e1c43d3d287ae7ec973b48 languageName: node linkType: hard @@ -16307,15 +16398,6 @@ typescript@^4.3.5: languageName: node linkType: hard -"ws@npm:^6.2.1": - version: 6.2.2 - resolution: "ws@npm:6.2.2" - dependencies: - async-limiter: ~1.0.0 - checksum: aec3154ec51477c094ac2cb5946a156e17561a581fa27005cbf22c53ac57f8d4e5f791dd4bbba6a488602cb28778c8ab7df06251d590507c3c550fd8ebeee949 - languageName: node - linkType: hard - "ws@npm:^7.3.1": version: 7.4.0 resolution: "ws@npm:7.4.0" @@ -16331,6 +16413,21 @@ typescript@^4.3.5: languageName: node linkType: hard +"ws@npm:^8.1.0": + version: 8.2.2 + resolution: "ws@npm:8.2.2" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 25e764c631141bdca45badc86e69437b8791e57e461f9a16c0f7cd779baf70c3fbba07ecdd9e0d34fea1155ddcf62ef165cd7f81b68ed545bc7d455c15a85fb0 + languageName: node + linkType: hard + "xhr@npm:^2.0.1": version: 2.5.0 resolution: "xhr@npm:2.5.0" @@ -16497,7 +16594,7 @@ typescript@^4.3.5: languageName: node linkType: hard -"yargs@npm:16.2.0": +"yargs@npm:16.2.0, yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -16512,7 +16609,7 @@ typescript@^4.3.5: languageName: node linkType: hard -"yargs@npm:^13.2.4, yargs@npm:^13.3.2": +"yargs@npm:^13.2.4": version: 13.3.2 resolution: "yargs@npm:13.3.2" dependencies: @@ -16577,13 +16674,6 @@ typescript@^4.3.5: languageName: node linkType: hard -"yn@npm:^2.0.0": - version: 2.0.0 - resolution: "yn@npm:2.0.0" - checksum: 9d49527cb3e9a0948cc057223810bf30607bf04b9ff7666cc1681a6501d660b60d90000c16f9e29311b0f28d8a06222ada565ccdca5f1049cdfefb1908217572 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"