From 68918a97c1104de4de76e4767143938defed2193 Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Mon, 27 Jul 2026 18:45:05 +0200 Subject: [PATCH 01/13] Apply eslint for js/ts files --- .eslintignore | 22 - .eslintrc.js | 52 - .prettierrc.js | 1 - .../custom-assertions/tooltip.ts | 23 +- addon-test-support/register-assertions.ts | 2 +- addon/components/o-s-s/anchor.ts | 2 +- addon/components/o-s-s/array-input.ts | 6 +- addon/components/o-s-s/button-dropdown.ts | 2 +- addon/components/o-s-s/button.ts | 6 +- addon/components/o-s-s/carousel.ts | 2 +- addon/components/o-s-s/content-panel.ts | 5 - addon/components/o-s-s/context-menu.ts | 11 +- addon/components/o-s-s/context-menu/panel.ts | 4 +- addon/components/o-s-s/country-selector.ts | 30 +- addon/components/o-s-s/currency-input.ts | 4 +- addon/components/o-s-s/email-input.ts | 2 + addon/components/o-s-s/iconName.enum.ts | 1 - addon/components/o-s-s/illustration.ts | 2 +- .../components/o-s-s/layout/sidebar/group.ts | 8 +- addon/components/o-s-s/mode-switch.ts | 4 +- addon/components/o-s-s/phone-number-input.ts | 28 +- addon/components/o-s-s/scrollable-panel.ts | 2 +- addon/components/o-s-s/skeleton.ts | 8 +- addon/components/o-s-s/smart/button.ts | 2 +- .../o-s-s/smart/immersive/select.ts | 3 +- addon/components/o-s-s/smart/skeleton.ts | 2 +- .../components/o-s-s/smart/toggle-buttons.ts | 2 +- addon/components/o-s-s/split-modal.ts | 2 +- addon/components/o-s-s/tag.ts | 2 +- addon/components/o-s-s/upload-area.ts | 3 +- addon/components/wizard/container.ts | 4 +- addon/components/wizard/step-wrapper.ts | 2 +- addon/helpers/format-money.ts | 11 +- addon/helpers/format-numeric.ts | 4 +- addon/modifiers/attach-element.ts | 14 +- addon/modifiers/enable-input-autofocus.ts | 2 +- addon/modifiers/enable-tooltip.ts | 2 +- addon/modifiers/on-bottom-reached.ts | 2 +- addon/modifiers/on-top-reached.ts | 2 +- addon/modifiers/scroll-shadow.ts | 2 +- addon/services/base-uploader.ts | 6 +- addon/services/form-manager.ts | 2 +- addon/services/toast.ts | 6 +- addon/utils/attach-dropdown.ts | 2 +- addon/utils/filesize-parser.ts | 2 +- addon/utils/icon-details.ts | 2 +- addon/utils/sanitize-config.ts | 2 +- eslint.config.mjs | 4 + linters/handlebars/index.js | 1 + linters/handlebars/rules/index.js | 1 + package.json | 9 +- pnpm-lock.yaml | 1397 +++++++++++++---- tests/dummy/app/app.d.ts | 3 + .../dummy/app/components/panel/example-row.ts | 7 - tests/dummy/app/components/storybook.ts | 6 +- .../app/components/wizard/example-controls.ts | 4 +- .../app/components/wizard/example-menu.ts | 4 +- .../wizard/example-step-with-scroll.ts | 4 +- .../app/components/wizard/example-step.ts | 4 +- tests/dummy/app/controllers/extra.ts | 2 +- tests/dummy/app/controllers/smart.ts | 4 +- .../modifiers/enable-input-autofocus-test.ts | 6 +- .../modifiers/scroll-shadow-test.ts | 2 +- .../components/o-s-s/array-input-test.js | 8 +- .../o-s-s/attribute/tag-array-test.ts | 2 +- .../components/o-s-s/attributes-panel-test.ts | 4 +- .../components/o-s-s/avatar-test.ts | 29 +- .../components/o-s-s/badge-test.ts | 8 +- .../components/o-s-s/button-dropdown-test.ts | 4 +- .../components/o-s-s/button-test.ts | 8 +- .../components/o-s-s/carousel-test.ts | 2 +- .../components/o-s-s/checkbox-test.ts | 16 +- .../integration/components/o-s-s/chip-test.ts | 4 +- .../components/o-s-s/code-block-test.ts | 2 +- .../components/o-s-s/completion-badge-test.ts | 8 +- .../o-s-s/context-menu/panel-test.ts | 40 +- .../components/o-s-s/country-selector-test.ts | 10 +- .../components/o-s-s/currency-input-test.ts | 24 +- .../components/o-s-s/dialog-test.ts | 9 +- .../components/o-s-s/email-input-test.ts | 9 +- .../components/o-s-s/empty-state-test.ts | 14 +- .../components/o-s-s/expandable-badge-test.ts | 10 +- .../components/o-s-s/feature-card-test.ts | 10 +- .../o-s-s/feature-cards-container-test.ts | 7 +- .../integration/components/o-s-s/icon-test.ts | 2 +- .../components/o-s-s/infinite-select-test.js | 10 +- .../o-s-s/infinite-select/option-test.ts | 7 +- .../components/o-s-s/input-group-test.ts | 4 +- .../components/o-s-s/layout/sidebar-test.ts | 4 +- .../o-s-s/layout/sidebar/item-test.ts | 8 +- .../integration/components/o-s-s/link-test.ts | 6 +- .../components/o-s-s/marketing/banner-test.ts | 22 +- .../components/o-s-s/modal-dialog-test.ts | 10 +- .../components/o-s-s/mode-switch-test.ts | 2 +- .../components/o-s-s/nav-tab-test.ts | 14 +- .../components/o-s-s/number-input-test.ts | 8 +- .../components/o-s-s/onboarding-state-test.ts | 12 +- .../components/o-s-s/password-input-test.ts | 9 +- .../o-s-s/phone-number-input-test.ts | 14 +- .../integration/components/o-s-s/pill-test.ts | 2 +- .../components/o-s-s/power-select-test.ts | 6 +- .../components/o-s-s/progress-bar-test.ts | 10 +- .../components/o-s-s/scrollable-panel-test.ts | 2 +- .../components/o-s-s/select-test.ts | 8 +- .../components/o-s-s/skeleton-test.ts | 23 +- .../components/o-s-s/slider-test.ts | 4 +- .../components/o-s-s/smart/button-test.ts | 10 +- .../smart/immersive/currency-input-test.ts | 12 +- .../o-s-s/smart/immersive/input-test.ts | 6 +- .../o-s-s/smart/immersive/logo-test.ts | 6 +- .../o-s-s/smart/immersive/select-test.ts | 4 +- .../components/o-s-s/smart/input-test.ts | 4 +- .../o-s-s/smart/number-input-test.ts | 4 +- .../components/o-s-s/smart/skeleton-test.ts | 23 +- .../components/o-s-s/smart/text-area-test.ts | 8 +- .../o-s-s/smart/toggle-buttons-test.ts | 8 +- .../o-s-s/social-post-badge-test.ts | 4 +- .../components/o-s-s/split-modal-test.ts | 5 +- .../components/o-s-s/stack-container-test.ts | 29 +- .../components/o-s-s/star-rating-test.ts | 4 +- .../integration/components/o-s-s/tag-test.ts | 2 +- .../components/o-s-s/text-area-test.ts | 8 +- .../o-s-s/togglable-section-test.ts | 6 +- .../components/o-s-s/toggle-buttons-test.ts | 8 +- .../components/o-s-s/toggle-switch-test.js | 18 +- .../components/wizard/base-step-test.ts | 2 +- tests/integration/helpers/redirect-to-test.ts | 4 +- .../helpers/stop-propagation-test.ts | 19 +- .../integration/helpers/transition-to-test.ts | 6 +- .../modifiers/attach-element-test.ts | 2 +- .../modifiers/text-carousel-test.ts | 2 +- tests/test-helper.ts | 5 +- .../override-intl-test.ts | 2 +- tests/unit/services/base-uploader-test.ts | 16 +- tests/unit/services/form-manager-test.ts | 26 +- tests/unit/services/toast-test.ts | 23 +- tests/unit/services/wizard-manager-test.ts | 42 +- tests/unit/utils/upf-local-storage-test.js | 12 +- tests/utils-test.ts | 10 +- types/global.d.ts | 5 + 140 files changed, 1618 insertions(+), 910 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 addon/components/o-s-s/content-panel.ts create mode 100644 eslint.config.mjs create mode 100644 tests/dummy/app/app.d.ts delete mode 100644 tests/dummy/app/components/panel/example-row.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 701947ed3..000000000 --- a/.eslintignore +++ /dev/null @@ -1,22 +0,0 @@ -# unconventional js -/blueprints/*/files/ -/vendor/ - -# compiled output -/dist/ -/tmp/ - -# dependencies -/bower_components/ -/node_modules/ - -# misc -/coverage/ -!.* -.*/ -.eslintcache - -# ember-try -/.node_modules.ember-try/ -/bower.json.ember-try -/package.json.ember-try diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index d671e11ca..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module', - ecmaFeatures: { - legacyDecorators: true - } - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'plugin:prettier/recommended'], - env: { - browser: true - }, - rules: { - 'no-multiple-empty-lines': [2, { max: 1 }], - - 'ember/no-jquery': 'off', - 'ember/no-classic-classes': 'off', - 'ember/no-classic-components': 'off', - 'ember/require-tagless-components': 'off', - 'ember/no-component-lifecycle-hooks': 'off' - }, - overrides: [ - // node files - { - files: [ - '.eslintrc.js', - '.template-lintrc.js', - 'ember-cli-build.js', - 'index.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'tests/dummy/config/**/*.js' - ], - excludedFiles: ['addon/**', 'addon-test-support/**', 'app/**', 'tests/dummy/app/**'], - parserOptions: { - sourceType: 'script' - }, - env: { - browser: false, - node: true - }, - plugins: ['node'], - rules: {} - } - ] -}; diff --git a/.prettierrc.js b/.prettierrc.js index 484a5b77d..a1add1313 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,6 +1,5 @@ 'use strict'; -// eslint-disable-next-line no-undef module.exports = { arrowParens: 'always', bracketSpacing: true, diff --git a/addon-test-support/custom-assertions/tooltip.ts b/addon-test-support/custom-assertions/tooltip.ts index 019282125..d0b7b8692 100644 --- a/addon-test-support/custom-assertions/tooltip.ts +++ b/addon-test-support/custom-assertions/tooltip.ts @@ -43,8 +43,8 @@ export interface TooltipAssertions { const assertion = (selector: string): TooltipAssertions => { return { exists: async (trigger?: string, message?: string): Promise => { - let result: boolean = true; - let actual: Element | null = null; + const result: boolean = true; + const actual: Element | null = null; await triggerEventOnElement(selector, trigger); @@ -131,12 +131,9 @@ const assertion = (selector: string): TooltipAssertions => { doesNotHaveSubtitle: async (message?: string): Promise => { await triggerEventOnElement(selector); - let result = false; - let actual = undefined; const subtitleContainer = document.querySelector('.upf-tooltip .subtitle'); - - actual = (subtitleContainer)?.innerText; - result = isEmpty(actual); + const actual = (subtitleContainer)?.innerText; + const result = isEmpty(actual); QUnit.assert.pushResult({ result, @@ -170,8 +167,8 @@ const assertion = (selector: string): TooltipAssertions => { await triggerEventOnElement(selector); const iconI = document.querySelector('.upf-tooltip .title-container i'); - let actual = iconI?.className; - let result = isEmpty(actual); + const actual = iconI?.className; + const result = isEmpty(actual); QUnit.assert.pushResult({ result, @@ -205,8 +202,8 @@ const assertion = (selector: string): TooltipAssertions => { await triggerEventOnElement(selector); const titleContainer = document.querySelector('.upf-tooltip .title-container .title'); - let actual = (titleContainer)?.dataset.htmlSafe; - let result = actual === 'true'; + const actual = (titleContainer)?.dataset.htmlSafe; + const result = actual === 'true'; QUnit.assert.pushResult({ result, @@ -220,8 +217,8 @@ const assertion = (selector: string): TooltipAssertions => { await triggerEventOnElement(selector); const titleContainer = document.querySelector('.upf-tooltip .title-container .title'); - let actual = (titleContainer)?.dataset.htmlSafe; - let result = actual === undefined; + const actual = (titleContainer)?.dataset.htmlSafe; + const result = actual === undefined; QUnit.assert.pushResult({ result, diff --git a/addon-test-support/register-assertions.ts b/addon-test-support/register-assertions.ts index 36fa94cd7..e2a6008a8 100644 --- a/addon-test-support/register-assertions.ts +++ b/addon-test-support/register-assertions.ts @@ -6,7 +6,7 @@ const ASSERTIONS = [tooltipAssertions, infiniteSelectOptionAssertions, dcnAssert export default function registerAssertions(assert: Assert) { ASSERTIONS.forEach((assertion) => { - // @ts-ignore + // @ts-expect-error custom assertions are dynamically registered on Assert assert[assertion.__name__] = assertion; }); } diff --git a/addon/components/o-s-s/anchor.ts b/addon/components/o-s-s/anchor.ts index c58b21df8..eef70770c 100644 --- a/addon/components/o-s-s/anchor.ts +++ b/addon/components/o-s-s/anchor.ts @@ -43,7 +43,7 @@ export default class OSSAnchor extends Component { const route = this.args.routePrefix ? this.args.routePrefix + '.' + this.args.link : this.args.link; try { return Boolean(this.router.urlFor(route)); - } catch (error) { + } catch { return false; } } diff --git a/addon/components/o-s-s/array-input.ts b/addon/components/o-s-s/array-input.ts index 0e3c0ebad..08fe25df9 100644 --- a/addon/components/o-s-s/array-input.ts +++ b/addon/components/o-s-s/array-input.ts @@ -26,7 +26,7 @@ export default class OSSArrayInput extends Component { } get computedClasses(): string { - let arr: string[] = ['array-input-container']; + const arr: string[] = ['array-input-container']; if (this.args.disabled) { arr.push('array-input-container--disabled'); @@ -44,9 +44,7 @@ export default class OSSArrayInput extends Component { } private _triggerComponentRedraw(): void { - // Since this.items is not properly tracked upon updating the values, - // re-assigning this way triggers the component redraw. - this.items = this.items; + this.items = [...this.items]; } private _addEntry() { diff --git a/addon/components/o-s-s/button-dropdown.ts b/addon/components/o-s-s/button-dropdown.ts index d0f185a5f..e557f1285 100644 --- a/addon/components/o-s-s/button-dropdown.ts +++ b/addon/components/o-s-s/button-dropdown.ts @@ -81,7 +81,7 @@ export default class extends Component { } @action - closeDropdown(e?: Event): void { + closeDropdown(event?: Event): void { event?.stopPropagation(); this.displayDropdown = false; } diff --git a/addon/components/o-s-s/button.ts b/addon/components/o-s-s/button.ts index 6cd3fc2d9..2fc7d59ec 100644 --- a/addon/components/o-s-s/button.ts +++ b/addon/components/o-s-s/button.ts @@ -82,7 +82,7 @@ export interface OSSButtonArgs { theme?: string; square?: boolean; countDown?: { - callback: () => {}; + callback: () => void; time?: number; step?: number; }; @@ -132,7 +132,7 @@ export default class OSSButton extends Component { } get computedClass() { - let classes = [this.args.square ? SQUARE_CLASS : BASE_CLASS, `upf-btn--${this.skin}`]; + const classes = [this.args.square ? SQUARE_CLASS : BASE_CLASS, `upf-btn--${this.skin}`]; if (this.size) { classes.push(this.args.square ? `upf-square-btn--${this.size}` : `upf-btn--${this.size}`); @@ -151,6 +151,8 @@ export default class OSSButton extends Component { } if (this.args.loading && !this.args.loadingOptions?.showLabel) { + // The width must be frozen before the spinner replaces the label, hence the side-effect. + // eslint-disable-next-line ember/no-side-effects this.DOMElement.style.width = `${this.DOMElement?.offsetWidth}px`; } else { this.DOMElement.style.removeProperty('width'); diff --git a/addon/components/o-s-s/carousel.ts b/addon/components/o-s-s/carousel.ts index 1cebdefb3..1eb4c5269 100644 --- a/addon/components/o-s-s/carousel.ts +++ b/addon/components/o-s-s/carousel.ts @@ -39,7 +39,7 @@ export default class OSSCarousel extends Component { } get showControls(): boolean { - return !!this.args.showControls ?? false; + return !!this.args.showControls; } get loop(): boolean { diff --git a/addon/components/o-s-s/content-panel.ts b/addon/components/o-s-s/content-panel.ts deleted file mode 100644 index 8cb653013..000000000 --- a/addon/components/o-s-s/content-panel.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Component from '@glimmer/component'; - -interface OSSContentPanelArgs {} - -export default class OSSContentPanel extends Component {} diff --git a/addon/components/o-s-s/context-menu.ts b/addon/components/o-s-s/context-menu.ts index 21798516d..b00b952cf 100644 --- a/addon/components/o-s-s/context-menu.ts +++ b/addon/components/o-s-s/context-menu.ts @@ -15,8 +15,8 @@ export type ContextMenuItem = { interface OSSContextMenuArgs extends OSSButtonArgs { items: ContextMenuItem[]; closeOnMouseLeave?: boolean; - onMenuOpened?: () => {}; - onMenuClosed?: () => {}; + onMenuOpened?: () => void; + onMenuClosed?: () => void; } export default class OSSContextMenuComponent extends Component { @@ -34,7 +34,12 @@ export default class OSSContextMenuComponent extends Component { - this.initializeDropdown(); - }); + scheduleOnce('afterRender', this, this.initializeDropdown); this.currentPanel.querySelector('.oss-scrollable-panel-content')?.addEventListener('scroll', this.onScrollbound); } diff --git a/addon/components/o-s-s/country-selector.ts b/addon/components/o-s-s/country-selector.ts index 1203bd614..dbb2fc883 100644 --- a/addon/components/o-s-s/country-selector.ts +++ b/addon/components/o-s-s/country-selector.ts @@ -28,7 +28,7 @@ interface OSSCountrySelectorArgs extends BaseDropdownArgs { export default class OSSCountrySelector extends BaseDropdown { @service declare intl: IntlService; - @tracked filteredItems: Item[] = this.args.sourceList; + @tracked filteredItems: Item[]; cleanupDrodpownAutoplacement?: () => void; handleSelectorClose = this.closeDropdown; @@ -36,6 +36,8 @@ export default class OSSCountrySelector extends BaseDropdown { - const referenceTarget = this.container.querySelector('.upf-input') as HTMLElement; - const floatingTarget = document.querySelector(`#${this.portalId}`); - - if (referenceTarget && floatingTarget) { - this.cleanupDrodpownAutoplacement = attachDropdown( - referenceTarget as HTMLElement, - floatingTarget as HTMLElement, - { placementStrategy: 'auto' } - ); - } - }); + scheduleOnce('afterRender', this, this.attachDropdownToInput); } } @@ -134,6 +125,19 @@ export default class OSSCountrySelector extends BaseDropdown extends Co @tracked currencySelectorShown: boolean = false; @tracked filteredCurrencies: Currency[] = this.currencies; - @tracked localValue: number = this.args.value; + @tracked localValue: number; constructor(owner: unknown, args: OSSCurrencyInputArgs, preventDefaultAssertions?: boolean) { super(owner, args); + this.localValue = this.args.value; + if (preventDefaultAssertions) return; if (!this.args.value && !this.args.placeholder) { diff --git a/addon/components/o-s-s/email-input.ts b/addon/components/o-s-s/email-input.ts index e15e01cdf..f790fa632 100644 --- a/addon/components/o-s-s/email-input.ts +++ b/addon/components/o-s-s/email-input.ts @@ -19,6 +19,8 @@ interface OSSEmailInputArgs { const DEFAULT_PLACEHOLDER = 'e.g., john.doe@example.com'; export const EMAIL_REGEXP = new RegExp( + // Control characters are part of the RFC 5322 quoted-string syntax. + // eslint-disable-next-line no-control-regex /^(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/ ); diff --git a/addon/components/o-s-s/iconName.enum.ts b/addon/components/o-s-s/iconName.enum.ts index 471d952af..670da9f52 100644 --- a/addon/components/o-s-s/iconName.enum.ts +++ b/addon/components/o-s-s/iconName.enum.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-unused-vars */ export enum IconNames { Analytics = 'fa-analytics', AngleLeft = 'fa-angle-left', diff --git a/addon/components/o-s-s/illustration.ts b/addon/components/o-s-s/illustration.ts index f30295b43..ca2262e2e 100644 --- a/addon/components/o-s-s/illustration.ts +++ b/addon/components/o-s-s/illustration.ts @@ -7,7 +7,7 @@ export const extractCSSVars = (): string[] => { .filter((styleSheet) => { try { return styleSheet.cssRules; - } catch (e) { + } catch { return false; } }) diff --git a/addon/components/o-s-s/layout/sidebar/group.ts b/addon/components/o-s-s/layout/sidebar/group.ts index dc9b2001e..c3872567f 100644 --- a/addon/components/o-s-s/layout/sidebar/group.ts +++ b/addon/components/o-s-s/layout/sidebar/group.ts @@ -84,9 +84,7 @@ export default class OSSLayoutSidebarGroupComponent extends Component { - this.triggerHovered = this.displayGroupList = true; - }); + scheduleOnce('afterRender', this, this.showGroupList); document.querySelectorAll('.oss-sidebar-group__items-container--visible').forEach((el) => { if (!this.triggerElement.contains(el)) { @@ -126,6 +124,10 @@ export default class OSSLayoutSidebarGroupComponent extends Component { if (this.groupListHovered || this.triggerHovered) return; diff --git a/addon/components/o-s-s/mode-switch.ts b/addon/components/o-s-s/mode-switch.ts index 979067396..c920af163 100644 --- a/addon/components/o-s-s/mode-switch.ts +++ b/addon/components/o-s-s/mode-switch.ts @@ -35,9 +35,7 @@ export default class ModeSwitchComponent extends Component { - this.initComponent(); - }); + scheduleOnce('afterRender', this, this.initComponent); } get selectedOptionKey(): string { diff --git a/addon/components/o-s-s/phone-number-input.ts b/addon/components/o-s-s/phone-number-input.ts index 5ef04fbdf..de24a7a76 100644 --- a/addon/components/o-s-s/phone-number-input.ts +++ b/addon/components/o-s-s/phone-number-input.ts @@ -61,7 +61,7 @@ export default class OSSPhoneNumberInput extends BaseDropdown { - const referenceTarget = this.container; - const floatingTarget = document.querySelector(`#${this.portalId}`); - - if (referenceTarget && floatingTarget) { - this.cleanupDrodpownAutoplacement = attachDropdown( - referenceTarget as HTMLElement, - floatingTarget as HTMLElement, - { placementStrategy: 'auto' } - ); - } - }); + scheduleOnce('afterRender', this, this.attachDropdownToContainer); } } @@ -157,6 +146,19 @@ export default class OSSPhoneNumberInput extends BaseDropdown extends Component } get computedClass(): string { - let style: string[] = [`fx-gap-px-${this.gap}`]; + const style: string[] = [`fx-gap-px-${this.gap}`]; - this.direction === 'row' ? style.push('fx-row') : style.push('fx-col'); + style.push(this.direction === 'row' ? 'fx-row' : 'fx-col'); return style.join(' '); } get rows(): ReturnType[] { const randomizeInRange: number = this.width * (RANGE_PERCENTAGE / 100); - let rows: ReturnType[] = []; - let multiple = this.args.multiple || 1; + const rows: ReturnType[] = []; + const multiple = this.args.multiple || 1; for (let i = 0; i < multiple; ++i) { let width = this.width; diff --git a/addon/components/o-s-s/smart/button.ts b/addon/components/o-s-s/smart/button.ts index d7e18e9b0..f8ab602ed 100644 --- a/addon/components/o-s-s/smart/button.ts +++ b/addon/components/o-s-s/smart/button.ts @@ -42,7 +42,7 @@ export default class OSSSmartButton extends OSSButton { } get computedSmartClasses(): string { - let classes = [this.isCircle ? SMART_SQUARE_CLASS : SMART_BASE_CLASS, `upf-smart-btn--${this.smartSkin}`]; + const classes = [this.isCircle ? SMART_SQUARE_CLASS : SMART_BASE_CLASS, `upf-smart-btn--${this.smartSkin}`]; if (this.size) { classes.push(this.isCircle ? `upf-smart-square-btn--${this.size}` : `upf-smart-btn--${this.size}`); diff --git a/addon/components/o-s-s/smart/immersive/select.ts b/addon/components/o-s-s/smart/immersive/select.ts index 6460e9b4e..db8d4555d 100644 --- a/addon/components/o-s-s/smart/immersive/select.ts +++ b/addon/components/o-s-s/smart/immersive/select.ts @@ -71,8 +71,7 @@ export default class OSSSmartImmersiveSelectComponent extends BaseDropdown { return !isBlank(el) && el !== undefined; }) ?? []) diff --git a/addon/components/o-s-s/smart/skeleton.ts b/addon/components/o-s-s/smart/skeleton.ts index 816e83392..cf8a357b2 100644 --- a/addon/components/o-s-s/smart/skeleton.ts +++ b/addon/components/o-s-s/smart/skeleton.ts @@ -4,7 +4,7 @@ import OSSSkeleton from '../skeleton'; import { assert } from '@ember/debug'; import { htmlSafe } from '@ember/template'; -interface OSSSmartSkeletonArgs extends OSSSkeletonArgs {} +type OSSSmartSkeletonArgs = OSSSkeletonArgs; const MIN_HEIGHT = 10; diff --git a/addon/components/o-s-s/smart/toggle-buttons.ts b/addon/components/o-s-s/smart/toggle-buttons.ts index 2dc5abf76..afde2cd63 100644 --- a/addon/components/o-s-s/smart/toggle-buttons.ts +++ b/addon/components/o-s-s/smart/toggle-buttons.ts @@ -1,7 +1,7 @@ import { assert } from '@ember/debug'; import OSSToggleButtons, { type OSSToggleButtonsArgs } from '../toggle-buttons'; -interface OSSSmartToggleButtonsArgs extends OSSToggleButtonsArgs {} +type OSSSmartToggleButtonsArgs = OSSToggleButtonsArgs; export default class OSSSmartToggleButtons extends OSSToggleButtons { constructor(owner: unknown, args: OSSSmartToggleButtonsArgs) { diff --git a/addon/components/o-s-s/split-modal.ts b/addon/components/o-s-s/split-modal.ts index 4fd894e6b..07d0a8fd2 100644 --- a/addon/components/o-s-s/split-modal.ts +++ b/addon/components/o-s-s/split-modal.ts @@ -2,7 +2,7 @@ import { assert } from '@ember/debug'; import BaseModal, { type BaseModalArgs } from './private/base-modal'; -interface OSSSplitModalArgs extends BaseModalArgs {} +type OSSSplitModalArgs = BaseModalArgs; export default class OSSSplitModal extends BaseModal { constructor(owner: unknown, args: OSSSplitModalArgs) { diff --git a/addon/components/o-s-s/tag.ts b/addon/components/o-s-s/tag.ts index e368f2f19..8ea778387 100644 --- a/addon/components/o-s-s/tag.ts +++ b/addon/components/o-s-s/tag.ts @@ -66,7 +66,7 @@ export default class OSSTag extends Component { } get computedClass(): string { - let classes = [BASE_CLASS]; + const classes = [BASE_CLASS]; if (this.skin) { classes.push(`upf-tag--${this.skin}`); diff --git a/addon/components/o-s-s/upload-area.ts b/addon/components/o-s-s/upload-area.ts index f90d212da..7eaaca30a 100644 --- a/addon/components/o-s-s/upload-area.ts +++ b/addon/components/o-s-s/upload-area.ts @@ -93,7 +93,6 @@ export default class OSSUploadArea extends Component { if (this.dragging || this.hover) { classes.push(`oss-upload-area__illustration--dragging-start`); - this.alreadyTriggerAnimation = true; } else if (this.alreadyTriggerAnimation) { classes.push(`oss-upload-area__illustration--dragging-end`); } @@ -172,6 +171,7 @@ export default class OSSUploadArea extends Component { _onDragEnter(): void { if (this.args.disabled) return; this.dragging = true; + this.alreadyTriggerAnimation = true; } @action @@ -201,6 +201,7 @@ export default class OSSUploadArea extends Component { _mouseEnter(): void { if (this.args.disabled) return; this.hover = true; + this.alreadyTriggerAnimation = true; } @action diff --git a/addon/components/wizard/container.ts b/addon/components/wizard/container.ts index 27ae7657f..53b4d213a 100644 --- a/addon/components/wizard/container.ts +++ b/addon/components/wizard/container.ts @@ -3,9 +3,7 @@ import { inject as service } from '@ember/service'; import type WizardManager from '@upfluence/oss-components/services/wizard-manager'; import type { Step } from '@upfluence/oss-components/services/wizard-manager'; -interface WizardContainerComponentSignature {} - -export default class WizardContainerComponent extends Component { +export default class WizardContainerComponent extends Component { @service declare wizardManager: WizardManager; get allSteps(): Step[] { diff --git a/addon/components/wizard/step-wrapper.ts b/addon/components/wizard/step-wrapper.ts index 336fde8dc..017765510 100644 --- a/addon/components/wizard/step-wrapper.ts +++ b/addon/components/wizard/step-wrapper.ts @@ -31,7 +31,7 @@ export default class WizardStepWrapperComponent extends Component { state.referenceTarget = args.named.to instanceof HTMLElement ? args.named.to : document.querySelector(args.named.to); state.attachedElement = element; @@ -32,13 +36,7 @@ const setupModifier = (state: AttachElementState, element: HTMLElement, args: At return acc; }, {}); - scheduleOnce('afterRender', this, () => { - state.cleanupDrodpownAutoplacement = attachDropdown( - state.referenceTarget!, - state.attachedElement!, - attachmentOptions - ); - }); + scheduleOnce('afterRender', state, attachElementToTarget, attachmentOptions); }; export default setModifierManager( diff --git a/addon/modifiers/enable-input-autofocus.ts b/addon/modifiers/enable-input-autofocus.ts index 369bf9b2c..5189b1ba0 100644 --- a/addon/modifiers/enable-input-autofocus.ts +++ b/addon/modifiers/enable-input-autofocus.ts @@ -1,4 +1,4 @@ -// @ts-ignore +// @ts-expect-error setModifierManager is not exposed by the Ember typings import { setModifierManager, capabilities } from '@ember/modifier'; export default setModifierManager( diff --git a/addon/modifiers/enable-tooltip.ts b/addon/modifiers/enable-tooltip.ts index 03b721954..4f19b02bd 100644 --- a/addon/modifiers/enable-tooltip.ts +++ b/addon/modifiers/enable-tooltip.ts @@ -1,4 +1,4 @@ -// @ts-ignore +// @ts-expect-error setModifierManager is not exposed by the Ember typings import { setModifierManager, capabilities } from '@ember/modifier'; import Dope, { type Placement } from '@upfluence/oss-components/utils/dope'; import { run } from '@ember/runloop'; diff --git a/addon/modifiers/on-bottom-reached.ts b/addon/modifiers/on-bottom-reached.ts index 996695fdd..7f4cd4f50 100644 --- a/addon/modifiers/on-bottom-reached.ts +++ b/addon/modifiers/on-bottom-reached.ts @@ -1,4 +1,4 @@ -// @ts-ignore +// @ts-expect-error setModifierManager is not exposed by the Ember typings import { setModifierManager, capabilities } from '@ember/modifier'; import { run } from '@ember/runloop'; import { installScrollReachedModifier, type State } from './install-scroll-reached-modifier'; diff --git a/addon/modifiers/on-top-reached.ts b/addon/modifiers/on-top-reached.ts index 95551684e..bac79721a 100644 --- a/addon/modifiers/on-top-reached.ts +++ b/addon/modifiers/on-top-reached.ts @@ -1,4 +1,4 @@ -// @ts-ignore +// @ts-expect-error setModifierManager is not exposed by the Ember typings import { setModifierManager, capabilities } from '@ember/modifier'; import { run } from '@ember/runloop'; import { installScrollReachedModifier, type State } from './install-scroll-reached-modifier'; diff --git a/addon/modifiers/scroll-shadow.ts b/addon/modifiers/scroll-shadow.ts index aebbe54d1..4648c9ffb 100644 --- a/addon/modifiers/scroll-shadow.ts +++ b/addon/modifiers/scroll-shadow.ts @@ -1,4 +1,4 @@ -// @ts-ignore +// @ts-expect-error setModifierManager is not exposed by the Ember typings import { setModifierManager, capabilities } from '@ember/modifier'; const SCROLL_SHADOW_CLASS = 'scroll-shadow'; diff --git a/addon/services/base-uploader.ts b/addon/services/base-uploader.ts index 19962205f..e615ae9e2 100644 --- a/addon/services/base-uploader.ts +++ b/addon/services/base-uploader.ts @@ -25,6 +25,8 @@ export default class BaseUploader extends Service implements UploaderInterface { }; } + // The parameters are part of the signature subclasses must inherit. + // eslint-disable-next-line @typescript-eslint/no-unused-vars upload(_request: UploadRequest, _validationRules?: FileValidator[]): void { throw new Error( '[@upfluence/oss-components::uploader] NotImpemented: Please extend this service and inherit this method.' @@ -37,6 +39,8 @@ export default class BaseUploader extends Service implements UploaderInterface { ); } + // The parameter is part of the signature subclasses must inherit. + // eslint-disable-next-line @typescript-eslint/no-unused-vars buildHeaders(_: UploadRequest): { name: string; value: string }[] { return []; } @@ -49,7 +53,7 @@ export default class BaseUploader extends Service implements UploaderInterface { .map((rule: FileValidator) => { const validator = AVAILABLE_VALIDATORS.find((validator) => validator.key === rule.type)!; - // @ts-ignore + // @ts-expect-error the validator union type is not constructible as is return new validator(rule); }); } diff --git a/addon/services/form-manager.ts b/addon/services/form-manager.ts index a6491c716..c49903f15 100644 --- a/addon/services/form-manager.ts +++ b/addon/services/form-manager.ts @@ -111,7 +111,7 @@ export default class FormManager extends Service { } private refreshFormFeedbacks(): void { - this.formFeedbacks = this.formFeedbacks; + this.formFeedbacks = { ...this.formFeedbacks }; } } diff --git a/addon/services/toast.ts b/addon/services/toast.ts index 5c71350f1..268b3fe93 100644 --- a/addon/services/toast.ts +++ b/addon/services/toast.ts @@ -26,7 +26,7 @@ const ICON_CLASSES = { * @param {Function} onclick - A function to be called when the toast is clicked. */ export type ToastOptions = { - onclick?: Function; + onclick?: (event: Event) => void; timeout?: number | 'none'; badge?: { icon?: string; @@ -111,7 +111,7 @@ export default class Toast extends Service { fill: 'forwards' }); - let counterAnimation = new Animation(counterDownKeyframes, document.timeline); + const counterAnimation = new Animation(counterDownKeyframes, document.timeline); counterAnimation.id = 'counter'; return counterAnimation; } @@ -129,7 +129,7 @@ export default class Toast extends Service { } ); - let destroyAnimation = new Animation(destroyDownKeyframes, document.timeline); + const destroyAnimation = new Animation(destroyDownKeyframes, document.timeline); destroyAnimation.id = 'destroy'; return destroyAnimation; } diff --git a/addon/utils/attach-dropdown.ts b/addon/utils/attach-dropdown.ts index 8310474a5..5630efcd2 100644 --- a/addon/utils/attach-dropdown.ts +++ b/addon/utils/attach-dropdown.ts @@ -86,7 +86,7 @@ export default function attachDropdown( ); } - let arrowEl = floatingTarget.querySelector('[data-floating-arrow]'); + const arrowEl = floatingTarget.querySelector('[data-floating-arrow]'); if (mergedOptions.enableArrow) { if (!arrowEl) { diff --git a/addon/utils/filesize-parser.ts b/addon/utils/filesize-parser.ts index f829f897a..959a03f78 100644 --- a/addon/utils/filesize-parser.ts +++ b/addon/utils/filesize-parser.ts @@ -14,7 +14,7 @@ const INCREMENT_BASE: any = [ ]; export default function parseFilesize(filesize: string) { - const parsed = filesize.toString().match(/^([0-9\.,]*)(?:\s*)?(.*)$/); + const parsed = filesize.toString().match(/^([0-9.,]*)(?:\s*)?(.*)$/); if (!parsed || !parsed[1] || !parsed[2]) { throw new Error('[filesize-parser] Could not parse the filesize provided'); diff --git a/addon/utils/icon-details.ts b/addon/utils/icon-details.ts index f6346bf36..4caebaa59 100644 --- a/addon/utils/icon-details.ts +++ b/addon/utils/icon-details.ts @@ -22,7 +22,7 @@ export function getIconStyle(fontAwesomeIcon: string): IconStyle { } export function getIconValue(fontAwesomeIcon: string): string { - let iconValues: string[] = []; + const iconValues: string[] = []; fontAwesomeIcon.split(' ').forEach((part: string) => { if (part.includes(FA_ICON_PREFIX)) iconValues.push(part); }); diff --git a/addon/utils/sanitize-config.ts b/addon/utils/sanitize-config.ts index 97ecc16d6..4e1463887 100644 --- a/addon/utils/sanitize-config.ts +++ b/addon/utils/sanitize-config.ts @@ -22,7 +22,7 @@ DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => { * Strict configuration allowing Rich Text and Inline SVGs (No tags). */ export const RICH_TEXT_SVG_CONFIG: DOMPurify.Config = { - ALLOWED_URI_REGEXP: /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms):|[^a-z]|[a-z+.\-]+(?:[^a-z+.-:]|$))/i, + ALLOWED_URI_REGEXP: /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i, USE_PROFILES: { html: true, svg: false, mathMl: false }, ADD_ATTR: ['target'] }; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..504aa08d9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,4 @@ +import { defineConfig } from 'eslint/config'; +import { buildConfiguration } from '@upfluence/w-conf/eslint'; + +export default defineConfig(...buildConfiguration()); diff --git a/linters/handlebars/index.js b/linters/handlebars/index.js index 958cada89..54a0f7181 100644 --- a/linters/handlebars/index.js +++ b/linters/handlebars/index.js @@ -1,3 +1,4 @@ +/* global require module */ const { NoBareHTMLButton, RequireDataControlName } = require('./rules'); module.exports = { diff --git a/linters/handlebars/rules/index.js b/linters/handlebars/rules/index.js index 565637311..bbaf598c9 100644 --- a/linters/handlebars/rules/index.js +++ b/linters/handlebars/rules/index.js @@ -1,3 +1,4 @@ +/* global require module */ const NoBareHTMLButton = require('./no-bare-button'); const RequireDataControlName = require('./require-data-control-name'); diff --git a/package.json b/package.json index 8e24fe4b8..1af257f40 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "@types/rsvp": "^4.0.8", "@types/sinon": "^10.0.2", "@typescript-eslint/parser": "^5.0.0", - "@upfluence/w-conf": "^0.2.0", + "@upfluence/w-conf": "^0.3.0", "babel-loader": "^8.1.0", "css-loader": "^5.2.7", "ember-cli": "~3.28.6", @@ -119,12 +119,7 @@ "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^3.15.0", "ember-try": "^4.0.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.5.1", - "eslint-plugin-qunit": "^6.2.0", - "eslint-plugin-ember": "^10.5.8", - "eslint-plugin-node": "^11.1.0", + "eslint": "^10.5.0", "prettier": "^3.8.1", "less-loader": "^7.1.0", "loader.js": "^4.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 011e651cc..4d32e2a32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,13 +110,13 @@ importers: version: 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/addon-essentials': specifier: 6.4.9 - version: 6.4.9(@babel/core@7.23.9)(babel-loader@8.3.0(@babel/core@7.23.9)(webpack@5.90.1))(eslint@7.32.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) + version: 6.4.9(@babel/core@7.23.9)(babel-loader@8.3.0(@babel/core@7.23.9)(webpack@5.90.1))(eslint@10.8.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) '@storybook/addon-links': specifier: 6.4.9 version: 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/ember': specifier: 6.4.9 - version: 6.4.9(@babel/core@7.23.9)(@glint/environment-ember-loose@1.5.2(@glimmer/component@1.1.2(@babel/core@7.23.9))(@glint/template@1.5.2)(@types/ember__array@4.0.10(@babel/core@7.23.9))(@types/ember__component@4.0.22(@babel/core@7.23.9))(@types/ember__controller@4.0.12(@babel/core@7.23.9))(@types/ember__object@4.0.12(@babel/core@7.23.9))(@types/ember__routing@4.0.21(@babel/core@7.23.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@3.2.7(@babel/core@7.23.9)))(@glint/template@1.5.2)(babel-plugin-ember-modules-api-polyfill@3.5.0)(babel-plugin-htmlbars-inline-precompile@5.3.1)(ember-source@3.28.12(@babel/core@7.23.9))(eslint@7.32.0)(typescript@5.3.3)(webpack@5.90.1) + version: 6.4.9(@babel/core@7.23.9)(@glint/environment-ember-loose@1.5.2(@glimmer/component@1.1.2(@babel/core@7.23.9))(@glint/template@1.5.2)(@types/ember__array@4.0.10(@babel/core@7.23.9))(@types/ember__component@4.0.22(@babel/core@7.23.9))(@types/ember__controller@4.0.12(@babel/core@7.23.9))(@types/ember__object@4.0.12(@babel/core@7.23.9))(@types/ember__routing@4.0.21(@babel/core@7.23.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@3.2.7(@babel/core@7.23.9)))(@glint/template@1.5.2)(babel-plugin-ember-modules-api-polyfill@3.5.0)(babel-plugin-htmlbars-inline-precompile@5.3.1)(ember-source@3.28.12(@babel/core@7.23.9))(eslint@10.8.0)(typescript@5.3.3)(webpack@5.90.1) '@storybook/ember-cli-storybook': specifier: ^0.4.0 version: 0.4.0 @@ -194,10 +194,10 @@ importers: version: 10.0.20 '@typescript-eslint/parser': specifier: ^5.0.0 - version: 5.62.0(eslint@7.32.0)(typescript@5.3.3) + version: 5.62.0(eslint@10.8.0)(typescript@5.3.3) '@upfluence/w-conf': - specifier: ^0.2.0 - version: 0.2.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(prettier@3.8.3) + specifier: ^0.3.0 + version: 0.3.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(prettier@3.8.3)(typescript@5.3.3) babel-loader: specifier: ^8.1.0 version: 8.3.0(@babel/core@7.23.9)(webpack@5.90.1) @@ -244,23 +244,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 eslint: - specifier: ^7.32.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.2(eslint@7.32.0) - eslint-plugin-ember: - specifier: ^10.5.8 - version: 10.6.1(eslint@7.32.0) - eslint-plugin-node: - specifier: ^11.1.0 - version: 11.1.0(eslint@7.32.0) - eslint-plugin-prettier: - specifier: ^5.5.1 - version: 5.5.5(@types/eslint@8.56.2)(eslint-config-prettier@9.1.2(eslint@7.32.0))(eslint@7.32.0)(prettier@3.8.3) - eslint-plugin-qunit: - specifier: ^6.2.0 - version: 6.2.0(eslint@7.32.0) + specifier: ^10.5.0 + version: 10.8.0 less-loader: specifier: ^7.1.0 version: 7.3.0(less@4.2.0)(webpack@5.90.1) @@ -305,9 +290,6 @@ packages: '@babel/code-frame@7.10.4': resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} - '@babel/code-frame@7.12.11': - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -1191,6 +1173,15 @@ packages: '@glint/template': optional: true + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emotion/cache@10.0.29': resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} @@ -1241,9 +1232,44 @@ packages: '@emotion/weak-memoize@0.2.5': resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} - '@eslint/eslintrc@0.4.3': - resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} - engines: {node: ^10.12.0 || >=12.0.0} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@figspec/components@1.0.3': resolution: {integrity: sha512-fBwHzJ4ouuOUJEi+yBZIrOy+0/fAjB3AeTcIHTT1PRxLz8P63xwC7R0EsIJXhScIcc+PljGmqbbVJCjLsnaGYA==} @@ -1318,6 +1344,9 @@ packages: '@glimmer/interfaces@0.84.3': resolution: {integrity: sha512-dk32ykoNojt0mvEaIW6Vli5MGTbQo58uy3Epj7ahCgTHmWOKuw/0G83f2UmFprRwFx689YTXG38I/vbpltEjzg==} + '@glimmer/interfaces@0.94.6': + resolution: {integrity: sha512-sp/1WePvB/8O+jrcUHwjboNPTKrdGicuHKA9T/lh0vkYK2qM5Xz4i25lQMQ38tEMiw7KixrjHiTUiaXRld+IwA==} + '@glimmer/reference@0.65.4': resolution: {integrity: sha512-yuRVE4qyqrlCndDMrHKDWUbDmGDCjPzsFtlTmxxnhDMJAdQsnr2cRLITHvQRDm1tXfigVvyKnomeuYhRRbBqYQ==} @@ -1327,6 +1356,9 @@ packages: '@glimmer/syntax@0.84.3': resolution: {integrity: sha512-ioVbTic6ZisLxqTgRBL2PCjYZTFIwobifCustrozRU2xGDiYvVIL0vt25h2c1ioDsX59UgVlDkIK4YTAQQSd2A==} + '@glimmer/syntax@0.95.0': + resolution: {integrity: sha512-W/PHdODnpONsXjbbdY9nedgIHpglMfOzncf/moLVrKIcCfeQhw2vG07Rs/YW8KeJCgJRCLkQsi+Ix7XvrurGAg==} + '@glimmer/tracking@1.1.2': resolution: {integrity: sha512-cyV32zsHh+CnftuRX84ALZpd2rpbDrhLhJnTXn9W//QpqdRZ5rdMsxSY9fOsj0CKEc706tmEU299oNnDc0d7tA==} @@ -1339,6 +1371,9 @@ packages: '@glimmer/util@0.84.3': resolution: {integrity: sha512-qFkh6s16ZSRuu2rfz3T4Wp0fylFj3HBsONGXQcrAdZjdUaIS6v3pNj6mecJ71qRgcym9Hbaq/7/fefIwECUiKw==} + '@glimmer/util@0.94.8': + resolution: {integrity: sha512-HfCKeZ74clF9BsPDBOqK/yRNa/ke6niXFPM6zRn9OVYw+ZAidLs7V8He/xljUHlLRL322kaZZY8XxRW7ALEwyg==} + '@glimmer/validator@0.44.0': resolution: {integrity: sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw==} @@ -1348,6 +1383,9 @@ packages: '@glimmer/vm-babel-plugins@0.80.3': resolution: {integrity: sha512-9ej6xlm5MzHBJ5am2l0dbbn8Z0wJoYoMpM8FcrGMlUP6SPMLWxvxpMsApgQo8u6dvZRCjR3/bw3fdf7GOy0AFw==} + '@glimmer/wire-format@0.94.8': + resolution: {integrity: sha512-A+Cp5m6vZMAEu0Kg/YwU2dJZXyYxVJs2zI57d3CP6NctmX7FsT8WjViiRUmt5abVmMmRH5b8BUovqY6GSMAdrw==} + '@glint/environment-ember-loose@1.5.2': resolution: {integrity: sha512-AuYRwZbQZW13WMW9tmyYqSGHLBXbdXn+HqdRDAG1qHItnjON4uv6sJVQUrnadlMT3G2AVRjL6jtfnwHs3t2Kuw==} peerDependencies: @@ -1385,17 +1423,34 @@ packages: '@handlebars/parser@2.0.0': resolution: {integrity: sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==} + '@handlebars/parser@2.2.2': + resolution: {integrity: sha512-n/SZW+12rwikx/f8YcSv9JCi5p9vn1Bnts9ZtVvfErG4h0gbjHI1H1ZMhVUnaOC7yzFc6PtsCKIK8XeTnL90Gw==} + engines: {node: ^18 || ^20 || ^22 || >=24} + '@hapi/address@1.0.1': resolution: {integrity: sha512-Z7nz/NjPN7nqVe9plLg7yjmKTfde3jf/6ytcNIXPVrWzzm3H/QnIHYbVQEoMtqWcxmfblOkAxF9TPpTRaCim8g==} engines: {node: '>=6.0.0'} deprecated: Please update your dependencies as this version is no longer maintained and may contain bugs and security issues. - '@humanwhocodes/config-array@0.5.0': - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - engines: {node: '>=10.10.0'} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -1470,6 +1525,12 @@ packages: resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} engines: {node: '>=4'} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1494,9 +1555,138 @@ packages: engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@one-ini/wasm@0.2.1': + resolution: {integrity: sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg==} + + '@oxc-parser/binding-android-arm-eabi@0.130.0': + resolution: {integrity: sha512-h/xYU8/7ADWzVSf5I+YalLpj33LOy9CI/zgbJNIZ5eunRBG+Czqa3lZsvuPHHf3rOt6z1c5+UzoxjbAzAvhwVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.130.0': + resolution: {integrity: sha512-oFWFJrsGv9siFM4HjMqKNB7IuIZD/SMmZdCXl8xyx7lDplGvPKyewpOo272rSWgMXe2Wx7bWI0Yj+gkHv4qbeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.130.0': + resolution: {integrity: sha512-sGUzupdTplK9jQg7eJZ878HfEgQjJNBc6dAYVWJ9W5aU+J8rLfRJhTVsKThiu1pNwm6Y1qKCcbC6WhNWSXR3Ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.130.0': + resolution: {integrity: sha512-PsB4cdCISbC00Uy8eiD8bc2AkGWjZqrSrJnkBFuG2ptrrf6mZ2F5gLFSjOAVMMgZPg8B1D7OydJwLWSfyI2Plg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.130.0': + resolution: {integrity: sha512-DgABp3l38hS77JbXCV4qk1+n6DPym5u8zzwuweokezm2tX194nDSJDENbDRECxVsiNbprKATLbk+Z5wlHT0OHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.130.0': + resolution: {integrity: sha512-4Kn3CTEmwFrzhTSC/JuUW16qovmaMdX7jeSKbL8w0pLtLww7To1a2XJi9Z5uD8QWUkfUHhqfV+VD6dVzBnWzoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.130.0': + resolution: {integrity: sha512-D35KZM3F4rRu1uAFKyBlg3Gaf/ybCjyaPR1hfgvk5ex8NtcTmRgc0JgSighEyNg96TPrFhemFba68SZuxaha8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.130.0': + resolution: {integrity: sha512-Q9o7oVlo955KHwS8l1u0bCzIx+JsZUA3XToLXC+MsMhye/9LeBQbt84nh120cl2XLy+TEzvugYDiHShg5yaX6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.130.0': + resolution: {integrity: sha512-EiJ/gC0ljbcwVpycC8YWw6ggMbtsPX8XMOt0mPx0aqWeMsNR+L9m05Flbvd5T+GlivG+GkSWQL7tM9SRFpM/dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.130.0': + resolution: {integrity: sha512-b+h/lsLLurp756dMGizNs5uPaJfyEdWrTcV5t8M609jWm1DEHB1StpRXCkyvwtkJx3m+qL5BNQ0dEKan/4yGFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.130.0': + resolution: {integrity: sha512-O19Cil83XAyjEFfo8WhkMwY58ALqZ7ckjGL+25mjMIuF84urWBeANH0FC8B8BsSSygWU3/1aY3ADdDbp+wlBnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.130.0': + resolution: {integrity: sha512-BgXRVC0+83n3YzCscLQjj6nbyeBIVeZYPTI4fFMAE4WNm2+4RXhWp03IVizL7esIz36kgmT48aebk1iM+cs8sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.130.0': + resolution: {integrity: sha512-6tJz0xvnGhsokE7N1WlUSBXibpYmT9xSJFS1Ce41Km/+8gQvdlW8MLhRv8PD0L7ix8vRG0FDDepp3jdOFzdVdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.130.0': + resolution: {integrity: sha512-9aCWj83dp3heTQGmGnZGdIWgxjZrr/7VQ0TGFHH5PKByxJKF2Hcr4qvaSUHhhGEa3MSsDjTL1YDP8RAgdL5/Cg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.130.0': + resolution: {integrity: sha512-afXt87aZBqrUVli8TB/I8H1G50RDWcwirjWtXGXYqJ2ZqWEiErH7V72j3LUSDZaivmtu2OLX0KQ/mbhP81mr7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.130.0': + resolution: {integrity: sha512-I0NCrZV/YZuCGWgqwNN/GO/iXlLF2z+Wgc7u+Aa9N4P51oYeIa0XT+zVBUne4csO9GqxskXgI4g8JzzWGRpfOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.130.0': + resolution: {integrity: sha512-sJgQkGaBX0WJvPUDfwciex6IcTk5O5NLQ1bhEb6f3nBruh1GshKMRSMt2bxZlYrgBzjyBbJzsnO+InPG0bg+fA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.130.0': + resolution: {integrity: sha512-bjcma99sQrNh6RY4mPO9yTkfxql6TDFoN3HWdK31RCKXwNhcDgJXW/l8PUtzKNiQ+9vpKJfJtQq+LklBuxSOBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.130.0': + resolution: {integrity: sha512-hRYbv6HhpSTzT4xTiIkadLI7upLQxuOdLPR/9nL1fTjwhgutBTPXrwaAPb/jTFVx6/8C7Jb5HcUKhmNwloTbFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.130.0': + resolution: {integrity: sha512-RBpA9TsRucJq6HNVNCFF1iKg+QeTkLdZf7hi4xaOGCPvMZWvDHjQgSOEZMUpuW4JNciHbxNhLEYmz5CVygjVGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.130.0': + resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -1890,6 +2080,9 @@ packages: '@tsconfig/ember@3.0.3': resolution: {integrity: sha512-StVVkcg/VxA+eDzBcTQAcnmmcmg1OxaV41OqFYluqVHpUX28TOD91DGg58n2AMU9ia27zeBBeVQiLsfmzuIV7w==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -1980,9 +2173,15 @@ packages: '@types/eslint@8.56.2': resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/express-serve-static-core@4.17.43': resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} @@ -2154,6 +2353,14 @@ packages: '@types/yargs@15.0.19': resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.65.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/parser@5.62.0': resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2164,14 +2371,48 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2181,14 +2422,33 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@upfluence/w-conf@0.2.0': - resolution: {integrity: sha512-mPOnRNxCu0PQYabb/kAzYF77mt6WBxiYHSi8LbrpaY4to2vzCmaqgKh7Qk0UX/wVCd5LF57zDhuaB5AVRRy7/Q==, tarball: https://npm.pkg.github.com/download/@upfluence/w-conf/0.2.0/715f8a1840f318574a084575ba1ef2ad5c99f2a7} + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@upfluence/w-conf@0.3.0': + resolution: {integrity: sha512-xzncilLlSq/4EHWdaDDggucXw1DGxU+RmddOb3E0628xBvyt328mE1ehYhxFB/c+rvIi0tgTCF5ZYwyAa8qR9g==, tarball: https://npm.pkg.github.com/download/@upfluence/w-conf/0.3.0/bc778f0d2b50ecf3e137f9841f966bae909c795d} + engines: {node: '>=20.0.0'} peerDependencies: '@trivago/prettier-plugin-sort-imports': ^5.2.2 + eslint: '>=10.5.0' prettier: ^3.6.2 '@webassemblyjs/ast@1.11.6': @@ -2336,6 +2596,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + address@1.1.2: resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} engines: {node: '>= 0.12.0'} @@ -2377,6 +2642,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -2395,10 +2663,6 @@ packages: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@3.2.0: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} @@ -2486,6 +2750,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -2583,10 +2851,6 @@ packages: resolution: {integrity: sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==} engines: {node: '>=4'} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - async-disk-cache@1.3.5: resolution: {integrity: sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==} @@ -2632,6 +2896,10 @@ packages: aws-sign2@0.5.0: resolution: {integrity: sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-import-util@2.0.1: resolution: {integrity: sha512-N1ZfNprtf/37x0R05J0QCW/9pCAcuI+bjZIK9tlu0JEkwEST7ssdD++gxHRbD58AiG5QE5OuNYhRoEFsc1wESw==} engines: {node: '>= 12.*'} @@ -2744,6 +3012,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2843,6 +3115,10 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} + braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -3307,6 +3583,10 @@ packages: comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3545,6 +3825,9 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-tag@4.2.0: + resolution: {integrity: sha512-f/o+F3qSa4gg23I7RWy6cMDxP2nPo99YWusxw2bjne7ZC6Acqqf4uB/+87AekOq1ehTocHH7b7nMd2X4S3NHVw==} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -3639,6 +3922,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + cryptiles@0.2.2: resolution: {integrity: sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==} engines: {node: '>=0.8.0'} @@ -3669,8 +3956,8 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.1.0: @@ -3932,6 +4219,11 @@ packages: resolution: {integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==} engines: {node: '>=0.8'} + editorconfig@3.0.2: + resolution: {integrity: sha512-T0ix8GhtxyKVfUFEcvdNDt3YGqlwkFHbD4/5bgFUDgFmxhI/cSRAeJ87/Sz//Cq8Eam6JX/e23RkoFO71P7aAA==} + engines: {node: '>=20'} + hasBin: true + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -4034,7 +4326,7 @@ packages: engines: {node: 10.* || >= 12} ember-cli-typescript-blueprints@https://codeload.github.com/upfluence/ember-cli-typescript-blueprints/tar.gz/7f349e228ceb8d2ef72b369466e445b40a820931: - resolution: {tarball: https://codeload.github.com/upfluence/ember-cli-typescript-blueprints/tar.gz/7f349e228ceb8d2ef72b369466e445b40a820931} + resolution: {gitHosted: true, tarball: https://codeload.github.com/upfluence/ember-cli-typescript-blueprints/tar.gz/7f349e228ceb8d2ef72b369466e445b40a820931} version: 3.0.0 engines: {node: 12.* || 14.* || >= 16} @@ -4085,6 +4377,21 @@ packages: resolution: {integrity: sha512-SB9NcZ27OtoUk+gfalsc3QU17+54OoqR668qHcuvHByk4KAhGxCKlkm9EBlKJcGr7yceOOAJqohTcCEBqfRw9g==} engines: {node: '>= 0.10.0'} + ember-eslint-parser@0.14.4: + resolution: {integrity: sha512-HSpJPP52KTpr2lbz41rHiWPsqSy4eXLZljpUez0RigVZJIbk3BWbRMHWeqL6GeylOVJPysD7Wx92Fg7mOFvbLA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@babel/eslint-parser': ^7.28.6 || ^8.0.0 + '@typescript-eslint/parser': '*' + peerDependenciesMeta: + '@babel/eslint-parser': + optional: true + '@typescript-eslint/parser': + optional: true + + ember-estree@0.6.11: + resolution: {integrity: sha512-aZyheQGUXyHu8GARPd1YyjbDMGkvqBYKzPj6RVp8qqMqA1L1MbkWKsljWE3K1CwiJcHwTPgm/O3oxS0TY1AX9Q==} + ember-intl@6.4.0: resolution: {integrity: sha512-BXxscjgoqzXQ6tUSV8aJsQcUAIcfqLJnNjegarFWdBBHLEOffQ8xARhvQC0hW40zGi/RHFEyTTx7vbiCPGtP1A==} engines: {node: 16.* || >= 18} @@ -4199,9 +4506,9 @@ packages: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + enhanced-resolve@5.24.3: + resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} + engines: {node: '>=10.13.0'} ensure-posix-path@1.1.1: resolution: {integrity: sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==} @@ -4295,47 +4602,52 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@9.1.2: - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} - hasBin: true + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} peerDependencies: - eslint: '>=7.0.0' + eslint: '>=6.0.0' - eslint-plugin-ember@10.6.1: - resolution: {integrity: sha512-R+TN3jwhYQ2ytZCA1VkfJDZSGgHFOHjsHU1DrBlRXYRepThe56PpuGxywAyDvQ7inhoAz3e6G6M60PzpvjzmNg==} - engines: {node: 10.* || 12.* || >= 14} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true peerDependencies: - eslint: '>= 6' + eslint: '>=7.0.0' - eslint-plugin-es@3.0.1: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} + eslint-plugin-ember@13.4.1: + resolution: {integrity: sha512-KyPKk3SfYQ5ci9U/bvVIA0NFB1UFn6rZAHNNb62AOgcMUNIR1/+0zqzyhrLHPyodo8BmE+kKDj7subsp71NkqA==} + engines: {node: '>= 20.19'} peerDependencies: - eslint: '>=4.19.1' + '@typescript-eslint/parser': '*' + eslint: '>= 8.40.0' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true - eslint-plugin-node@11.1.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=5.16.0' + eslint: '>=8' - eslint-plugin-prettier@5.5.5: - resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-plugin-n@18.2.2: + resolution: {integrity: sha512-gOO0lIqwEjZ750kv9/SptCWArUoAZXJoBr0vYWTO2dCBxctHUXlBIigiC8xuxxr/NKqgIT6Ehz1xRcilj8a5cA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' + eslint: '>=8.57.1' + ts-declaration-location: ^1.0.6 + typescript: '>=5.0.0' peerDependenciesMeta: - '@types/eslint': + ts-declaration-location: optional: true - eslint-config-prettier: + typescript: optional: true - eslint-plugin-qunit@6.2.0: - resolution: {integrity: sha512-KvPmkIC2MHpfRxs/r8WUeeGkG6y+3qwSi2AZIBtjcM/YG6Z3k0GxW5Hbu3l7X0TDhljVCeBb9Q5puUkHzl83Mw==} - engines: {node: 10.x || 12.x || >=14.0.0} + eslint-plugin-qunit@8.2.6: + resolution: {integrity: sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + peerDependencies: + eslint: '>=8.38.0' eslint-scope@4.0.3: resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} @@ -4345,9 +4657,9 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-utils@3.0.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} @@ -4355,10 +4667,6 @@ packages: peerDependencies: eslint: '>=5' - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -4367,18 +4675,27 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@7.32.0: - resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} - engines: {node: ^10.12.0 || >=12.0.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - espree@7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esprima@3.0.0: resolution: {integrity: sha512-xoBq/MIShSydNZOkjkoCEjqod963yHNXTLC40ypBhop6yPqflPz/vTinmCfSrGcywVLnSftRf6a0kJLdFdzemw==} @@ -4390,8 +4707,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -4495,9 +4812,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@2.2.7: resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} engines: {node: '>=4.0.0'} @@ -4535,6 +4849,15 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figgy-pudding@3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} deprecated: This module is no longer supported. @@ -4547,9 +4870,9 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-loader@6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -4650,9 +4973,9 @@ packages: resolution: {integrity: sha512-SRgwIMXlxkb6AUgaVjIX+jCEqdhyXu9hah7mcK+lWynjKtX73Ux1TDv71B7XyaQ+LJxkYRHl5yCL8IycAvQRUw==} engines: {node: 10.* || >= 12.*} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} @@ -4807,9 +5130,6 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -4869,6 +5189,9 @@ packages: resolution: {integrity: sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==} engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} @@ -4890,6 +5213,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob-promise@3.4.0: resolution: {integrity: sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==} engines: {node: '>=4'} @@ -4936,9 +5263,13 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@17.8.0: + resolution: {integrity: sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==} + engines: {node: '>=18'} globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -5150,6 +5481,10 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} + html-void-elements@1.0.5: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} @@ -5233,6 +5568,14 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -5774,6 +6117,13 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + lazy-universal-dotenv@3.0.1: resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} @@ -5905,6 +6255,9 @@ packages: lodash.assignin@4.2.0: resolution: {integrity: sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -5956,9 +6309,6 @@ packages: lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -6061,6 +6411,9 @@ packages: resolution: {integrity: sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==} engines: {node: 6.* || 8.* || >= 10.*} + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} + md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -6076,8 +6429,8 @@ packages: mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} mdn-links@0.1.0: resolution: {integrity: sha512-m+gI2Hrgro1O0SwqHd9cFkqN8VGzP56eprB63gxu6z9EFQDMeaR083wcNqMVADIbgiMP/TOCCe0ZIXHLBv2tUg==} @@ -6194,6 +6547,10 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.0.4: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} @@ -6547,6 +6904,10 @@ packages: overlayscrollbars@1.13.3: resolution: {integrity: sha512-1nB/B5kaakJuHXaLXLRK0bUIilWhUGT6q5g+l2s5vqYdLle/sd0kscBHkQC1kuuDg9p9WR4MTdySDOPbeL/86g==} + oxc-parser@0.130.0: + resolution: {integrity: sha512-X0PJ+NmOok8qP3vK9uaW431ngkdM9UPEK7KG466urtIL2+EYTEgbZK2yqe2MWKJKBjRlFweP/pJPx0x9muMEVw==} + engines: {node: ^20.19.0 || >=22.12.0} + p-all@2.1.0: resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} engines: {node: '>=6'} @@ -6778,6 +7139,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} @@ -6914,10 +7279,6 @@ packages: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -6961,10 +7322,6 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -7266,10 +7623,6 @@ packages: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -7383,6 +7736,9 @@ packages: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -7527,6 +7883,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -7635,10 +7996,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -7684,6 +8041,10 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated @@ -7886,10 +8247,6 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - style-loader@1.3.0: resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} engines: {node: '>= 8.9.0'} @@ -7931,6 +8288,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + symbol.prototype.description@1.0.5: resolution: {integrity: sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==} engines: {node: '>= 0.11.15'} @@ -7948,14 +8308,6 @@ packages: synchronous-promise@2.0.17: resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} - engines: {node: ^14.18.0 || >=16.0.0} - - table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} - engines: {node: '>=10.0.0'} - tap-parser@7.0.0: resolution: {integrity: sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==} hasBin: true @@ -7968,6 +8320,10 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar@6.2.0: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} @@ -8063,6 +8419,10 @@ packages: tiny-lr@2.0.0: resolution: {integrity: sha512-f6nh0VMRvhGx4KCeK1lQ/jaL0Zdb5WdR+Jk8q9OSUQnaSDxAEGH1fgqLZ+cMl5EW3F2MGnCsalBO1IsnnogW1Q==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tmp@0.0.28: resolution: {integrity: sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==} engines: {node: '>=0.4.0'} @@ -8145,6 +8505,12 @@ packages: trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -8204,6 +8570,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -8229,6 +8599,13 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript-eslint@8.65.0: + resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + typescript-memoize@1.1.1: resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==} @@ -8726,10 +9103,6 @@ snapshots: dependencies: '@babel/highlight': 7.23.4 - '@babel/code-frame@7.12.11': - dependencies: - '@babel/highlight': 7.23.4 - '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 @@ -9892,6 +10265,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.6.2 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.6.2 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.6.2 + optional: true + '@emotion/cache@10.0.29': dependencies: '@emotion/sheet': 0.9.4 @@ -9957,20 +10346,40 @@ snapshots: '@emotion/weak-memoize@0.2.5': {} - '@eslint/eslintrc@0.4.3': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.0)': dependencies: - ajv: 6.12.6 + eslint: 10.8.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - espree: 7.3.1 - globals: 13.24.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - js-yaml: 3.14.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color + '@eslint/config-helpers@0.7.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.8.0)': + optionalDependencies: + eslint: 10.8.0 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + '@figspec/components@1.0.3': dependencies: lit: 2.8.0 @@ -10080,6 +10489,11 @@ snapshots: dependencies: '@simple-dom/interface': 1.4.0 + '@glimmer/interfaces@0.94.6': + dependencies: + '@simple-dom/interface': 1.4.0 + type-fest: 4.41.0 + '@glimmer/reference@0.65.4': dependencies: '@glimmer/env': 0.1.7 @@ -10102,6 +10516,14 @@ snapshots: '@handlebars/parser': 2.0.0 simple-html-tokenizer: 0.5.11 + '@glimmer/syntax@0.95.0': + dependencies: + '@glimmer/interfaces': 0.94.6 + '@glimmer/util': 0.94.8 + '@glimmer/wire-format': 0.94.8 + '@handlebars/parser': 2.2.2 + simple-html-tokenizer: 0.5.11 + '@glimmer/tracking@1.1.2': dependencies: '@glimmer/env': 0.1.7 @@ -10121,6 +10543,10 @@ snapshots: '@glimmer/interfaces': 0.84.3 '@simple-dom/interface': 1.4.0 + '@glimmer/util@0.94.8': + dependencies: + '@glimmer/interfaces': 0.94.6 + '@glimmer/validator@0.44.0': {} '@glimmer/validator@0.65.4': @@ -10134,6 +10560,10 @@ snapshots: transitivePeerDependencies: - '@babel/core' + '@glimmer/wire-format@0.94.8': + dependencies: + '@glimmer/interfaces': 0.94.6 + '@glint/environment-ember-loose@1.5.2(@glimmer/component@1.1.2(@babel/core@7.23.9))(@glint/template@1.5.2)(@types/ember__array@4.0.10(@babel/core@7.23.9))(@types/ember__component@4.0.22(@babel/core@7.23.9))(@types/ember__controller@4.0.12(@babel/core@7.23.9))(@types/ember__object@4.0.12(@babel/core@7.23.9))(@types/ember__routing@4.0.21(@babel/core@7.23.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@3.2.7(@babel/core@7.23.9))': dependencies: '@glimmer/component': 1.1.2(@babel/core@7.23.9) @@ -10153,17 +10583,25 @@ snapshots: '@handlebars/parser@2.0.0': {} + '@handlebars/parser@2.2.2': {} + '@hapi/address@1.0.1': {} - '@humanwhocodes/config-array@0.5.0': + '@humanfs/core@0.19.2': dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@1.2.1': {} + '@humanwhocodes/retry@0.4.3': {} '@istanbuljs/load-nyc-config@1.1.0': dependencies: @@ -10289,6 +10727,13 @@ snapshots: call-me-maybe: 1.0.2 glob-to-regexp: 0.3.0 + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10313,7 +10758,73 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@pkgr/core@0.2.9': {} + '@one-ini/wasm@0.2.1': {} + + '@oxc-parser/binding-android-arm-eabi@0.130.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.130.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.130.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.130.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.130.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.130.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.130.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.130.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.130.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.130.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.130.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.130.0': + optional: true + + '@oxc-project/types@0.130.0': {} '@popperjs/core@2.11.8': {} @@ -10388,13 +10899,13 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-controls@6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': + '@storybook/addon-controls@6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': dependencies: '@storybook/addons': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/api': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/client-logger': 6.4.9 '@storybook/components': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - '@storybook/core-common': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/core-common': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.9 '@storybook/store': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) @@ -10414,7 +10925,7 @@ snapshots: - webpack-cli - webpack-command - '@storybook/addon-docs@6.4.9(eslint@7.32.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1)': + '@storybook/addon-docs@6.4.9(eslint@10.8.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1)': dependencies: '@babel/core': 7.23.9 '@babel/generator': 7.23.6 @@ -10427,10 +10938,10 @@ snapshots: '@mdx-js/react': 1.6.22(react@16.14.0) '@storybook/addons': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/api': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - '@storybook/builder-webpack4': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/builder-webpack4': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/client-logger': 6.4.9 '@storybook/components': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - '@storybook/core': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) + '@storybook/core': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) '@storybook/core-events': 6.4.9 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.9 @@ -10483,13 +10994,13 @@ snapshots: - webpack-cli - webpack-command - '@storybook/addon-essentials@6.4.9(@babel/core@7.23.9)(babel-loader@8.3.0(@babel/core@7.23.9)(webpack@5.90.1))(eslint@7.32.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1)': + '@storybook/addon-essentials@6.4.9(@babel/core@7.23.9)(babel-loader@8.3.0(@babel/core@7.23.9)(webpack@5.90.1))(eslint@10.8.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1)': dependencies: '@babel/core': 7.23.9 '@storybook/addon-actions': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/addon-backgrounds': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - '@storybook/addon-controls': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) - '@storybook/addon-docs': 6.4.9(eslint@7.32.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) + '@storybook/addon-controls': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/addon-docs': 6.4.9(eslint@10.8.0)(lit-html@2.8.0)(lit@2.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) '@storybook/addon-measure': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/addon-outline': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/addon-toolbars': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) @@ -10652,7 +11163,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 - '@storybook/builder-webpack4@6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': + '@storybook/builder-webpack4@6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': dependencies: '@babel/core': 7.23.9 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) @@ -10682,7 +11193,7 @@ snapshots: '@storybook/client-api': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/client-logger': 6.4.9 '@storybook/components': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - '@storybook/core-common': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/core-common': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/core-events': 6.4.9 '@storybook/node-logger': 6.4.9 '@storybook/preview-web': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) @@ -10702,7 +11213,7 @@ snapshots: css-loader: 3.6.0(webpack@4.47.0) file-loader: 6.2.0(webpack@4.47.0) find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0) + fork-ts-checker-webpack-plugin: 4.1.6(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 @@ -10713,7 +11224,7 @@ snapshots: postcss-loader: 4.3.0(postcss@7.0.39)(webpack@4.47.0) raw-loader: 4.0.2(webpack@4.47.0) react: 16.14.0 - react-dev-utils: 11.0.4(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0) + react-dev-utils: 11.0.4(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0) react-dom: 16.14.0(react@16.14.0) stable: 0.1.8 style-loader: 1.3.0(webpack@4.47.0) @@ -10882,7 +11393,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/core-common@6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': + '@storybook/core-common@6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': dependencies: '@babel/core': 7.23.9 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) @@ -10917,7 +11428,7 @@ snapshots: express: 4.18.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -10948,16 +11459,16 @@ snapshots: dependencies: core-js: 3.35.1 - '@storybook/core-server@6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': + '@storybook/core-server@6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/builder-webpack4': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/core-client': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@4.47.0) - '@storybook/core-common': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/core-common': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/core-events': 6.4.9 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.9 - '@storybook/manager-webpack4': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/manager-webpack4': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/node-logger': 6.4.9 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) @@ -11008,10 +11519,10 @@ snapshots: - webpack-cli - webpack-command - '@storybook/core@6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1)': + '@storybook/core@6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1)': dependencies: '@storybook/core-client': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) - '@storybook/core-server': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/core-server': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) react: 16.14.0 react-dom: 16.14.0(react@16.14.0) webpack: 5.90.1 @@ -11067,12 +11578,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/ember@6.4.9(@babel/core@7.23.9)(@glint/environment-ember-loose@1.5.2(@glimmer/component@1.1.2(@babel/core@7.23.9))(@glint/template@1.5.2)(@types/ember__array@4.0.10(@babel/core@7.23.9))(@types/ember__component@4.0.22(@babel/core@7.23.9))(@types/ember__controller@4.0.12(@babel/core@7.23.9))(@types/ember__object@4.0.12(@babel/core@7.23.9))(@types/ember__routing@4.0.21(@babel/core@7.23.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@3.2.7(@babel/core@7.23.9)))(@glint/template@1.5.2)(babel-plugin-ember-modules-api-polyfill@3.5.0)(babel-plugin-htmlbars-inline-precompile@5.3.1)(ember-source@3.28.12(@babel/core@7.23.9))(eslint@7.32.0)(typescript@5.3.3)(webpack@5.90.1)': + '@storybook/ember@6.4.9(@babel/core@7.23.9)(@glint/environment-ember-loose@1.5.2(@glimmer/component@1.1.2(@babel/core@7.23.9))(@glint/template@1.5.2)(@types/ember__array@4.0.10(@babel/core@7.23.9))(@types/ember__component@4.0.22(@babel/core@7.23.9))(@types/ember__controller@4.0.12(@babel/core@7.23.9))(@types/ember__object@4.0.12(@babel/core@7.23.9))(@types/ember__routing@4.0.21(@babel/core@7.23.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@3.2.7(@babel/core@7.23.9)))(@glint/template@1.5.2)(babel-plugin-ember-modules-api-polyfill@3.5.0)(babel-plugin-htmlbars-inline-precompile@5.3.1)(ember-source@3.28.12(@babel/core@7.23.9))(eslint@10.8.0)(typescript@5.3.3)(webpack@5.90.1)': dependencies: '@babel/core': 7.23.9 '@ember/test-helpers': 2.9.4(@babel/core@7.23.9)(@glint/environment-ember-loose@1.5.2(@glimmer/component@1.1.2(@babel/core@7.23.9))(@glint/template@1.5.2)(@types/ember__array@4.0.10(@babel/core@7.23.9))(@types/ember__component@4.0.22(@babel/core@7.23.9))(@types/ember__controller@4.0.12(@babel/core@7.23.9))(@types/ember__object@4.0.12(@babel/core@7.23.9))(@types/ember__routing@4.0.21(@babel/core@7.23.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@3.2.7(@babel/core@7.23.9)))(@glint/template@1.5.2)(ember-source@3.28.12(@babel/core@7.23.9)) - '@storybook/core': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) - '@storybook/core-common': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/core': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@5.90.1) + '@storybook/core-common': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/store': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) babel-plugin-ember-modules-api-polyfill: 3.5.0 babel-plugin-htmlbars-inline-precompile: 5.3.1 @@ -11102,14 +11613,14 @@ snapshots: - webpack-cli - webpack-command - '@storybook/manager-webpack4@6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': + '@storybook/manager-webpack4@6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)': dependencies: '@babel/core': 7.23.9 '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) '@babel/preset-react': 7.23.3(@babel/core@7.23.9) '@storybook/addons': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/core-client': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3)(webpack@4.47.0) - '@storybook/core-common': 6.4.9(eslint@7.32.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) + '@storybook/core-common': 6.4.9(eslint@10.8.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(typescript@5.3.3) '@storybook/node-logger': 6.4.9 '@storybook/theming': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@storybook/ui': 6.4.9(react-dom@16.14.0(react@16.14.0))(react@16.14.0) @@ -11315,6 +11826,11 @@ snapshots: '@tsconfig/ember@3.0.3': {} + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.6.2 + optional: true + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 @@ -11489,8 +12005,12 @@ snapshots: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.5': {} + '@types/estree@1.0.9': {} + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 20.11.16 @@ -11681,25 +12201,85 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.8.0 + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) debug: 4.3.4 - eslint: 7.32.0 + eslint: 10.8.0 optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + eslint: 10.8.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.65.0(typescript@5.3.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.3.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.3.3)': + dependencies: + typescript: 5.3.3 + + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0)(typescript@5.3.3)': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.3.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@5.3.3) + debug: 4.4.3 + eslint: 10.8.0 + ts-api-utils: 2.5.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/types@8.65.0': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -11714,15 +12294,60 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.3.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.3.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.3.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.3 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.65.0(eslint@10.8.0)(typescript@5.3.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.3.3) + eslint: 10.8.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@upfluence/w-conf@0.2.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(prettier@3.8.3)': + '@typescript-eslint/visitor-keys@8.65.0': dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + + '@upfluence/w-conf@0.3.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(prettier@3.8.3)(typescript@5.3.3)': + dependencies: + '@eslint/js': 10.0.1(eslint@10.8.0) '@trivago/prettier-plugin-sort-imports': 6.0.2(prettier@3.8.3) + eslint: 10.8.0 + eslint-config-prettier: 10.1.8(eslint@10.8.0) + eslint-plugin-ember: 13.4.1(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3) + eslint-plugin-n: 18.2.2(eslint@10.8.0)(typescript@5.3.3) + eslint-plugin-qunit: 8.2.6(eslint@10.8.0) + globals: 17.8.0 prettier: 3.8.3 + typescript-eslint: 8.65.0(eslint@10.8.0)(typescript@5.3.3) + transitivePeerDependencies: + - '@babel/eslint-parser' + - '@typescript-eslint/parser' + - supports-color + - ts-declaration-location + - typescript '@webassemblyjs/ast@1.11.6': dependencies: @@ -11912,6 +12537,10 @@ snapshots: dependencies: acorn: 7.4.1 + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + acorn-walk@7.2.0: {} acorn@6.4.2: {} @@ -11920,6 +12549,8 @@ snapshots: acorn@8.11.3: {} + acorn@8.17.0: {} + address@1.1.2: {} address@1.2.2: {} @@ -11973,6 +12604,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 @@ -11993,8 +12631,6 @@ snapshots: ansi-colors@3.2.4: {} - ansi-colors@4.1.3: {} - ansi-escapes@3.2.0: {} ansi-escapes@4.3.2: @@ -12065,6 +12701,8 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.2: {} + arr-diff@4.0.0: {} arr-flatten@1.1.0: {} @@ -12171,8 +12809,6 @@ snapshots: ast-types@0.13.3: {} - astral-regex@2.0.0: {} - async-disk-cache@1.3.5: dependencies: debug: 2.6.9 @@ -12237,6 +12873,8 @@ snapshots: aws-sign2@0.5.0: optional: true + axobject-query@4.1.0: {} + babel-import-util@2.0.1: {} babel-loader@8.3.0(@babel/core@7.23.9)(webpack@4.47.0): @@ -12406,6 +13044,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} base64id@2.0.0: {} @@ -12530,6 +13170,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.8: + dependencies: + balanced-match: 4.0.4 + braces@2.3.2: dependencies: arr-flatten: 1.1.0 @@ -13318,6 +13962,8 @@ snapshots: comma-separated-tokens@1.0.8: {} + commander@14.0.3: {} + commander@2.20.3: {} commander@2.8.1: @@ -13410,6 +14056,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-tag@4.2.0: {} + content-type@1.0.5: {} continuable-cache@0.3.1: {} @@ -13537,6 +14185,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + cryptiles@0.2.2: dependencies: boom: 0.4.2 @@ -13605,10 +14259,10 @@ snapshots: domutils: 3.1.0 nth-check: 2.1.1 - css-tree@2.3.1: + css-tree@3.2.1: dependencies: - mdn-data: 2.0.30 - source-map-js: 1.0.2 + mdn-data: 2.27.1 + source-map-js: 1.2.1 css-what@6.1.0: {} @@ -13843,6 +14497,13 @@ snapshots: errlop: 2.2.0 semver: 6.3.1 + editorconfig@3.0.2: + dependencies: + '@one-ini/wasm': 0.2.1 + commander: 14.0.3 + minimatch: 10.2.5 + semver: 7.8.5 + ee-first@1.1.1: {} electron-to-chromium@1.4.657: {} @@ -14366,6 +15027,28 @@ snapshots: ember-disable-prototype-extensions@1.1.3: {} + ember-eslint-parser@0.14.4(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(typescript@5.3.3): + dependencies: + '@glimmer/syntax': 0.95.0 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.3.3) + content-tag: 4.2.0 + ember-estree: 0.6.11 + eslint-scope: 9.1.2 + html-tags: 5.1.0 + mathml-tag-names: 4.0.0 + svg-tags: 1.0.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@10.8.0)(typescript@5.3.3) + transitivePeerDependencies: + - typescript + + ember-estree@0.6.11: + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/syntax': 0.95.0 + content-tag: 4.2.0 + oxc-parser: 0.130.0 + ember-intl@6.4.0(@babel/core@7.23.9)(@glint/template@1.5.2)(typescript@5.3.3)(webpack@5.90.1): dependencies: '@formatjs/icu-messageformat-parser': 2.7.6 @@ -14636,10 +15319,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - enquirer@2.4.1: + enhanced-resolve@5.24.3: dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 + graceful-fs: 4.2.11 + tapable: 2.3.3 ensure-posix-path@1.1.1: {} @@ -14765,54 +15448,67 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.2(eslint@7.32.0): + eslint-compat-utils@0.5.1(eslint@10.8.0): dependencies: - eslint: 7.32.0 + eslint: 10.8.0 + semver: 7.7.3 - eslint-plugin-ember@10.6.1(eslint@7.32.0): + eslint-config-prettier@10.1.8(eslint@10.8.0): + dependencies: + eslint: 10.8.0 + + eslint-plugin-ember@13.4.1(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3): dependencies: '@ember-data/rfc395-data': 0.0.4 - css-tree: 2.3.1 + aria-query: 5.3.2 + axobject-query: 4.1.0 + css-tree: 3.2.1 + editorconfig: 3.0.2 + ember-eslint-parser: 0.14.4(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(typescript@5.3.3) ember-rfc176-data: 0.3.18 - eslint: 7.32.0 - eslint-utils: 3.0.0(eslint@7.32.0) + eslint: 10.8.0 + eslint-utils: 3.0.0(eslint@10.8.0) estraverse: 5.3.0 + html-tags: 3.3.1 + language-tags: 1.0.9 + lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 + mathml-tag-names: 4.0.0 requireindex: 1.2.0 snake-case: 3.0.4 + svg-tags: 1.0.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@10.8.0)(typescript@5.3.3) + transitivePeerDependencies: + - '@babel/eslint-parser' + - typescript - eslint-plugin-es@3.0.1(eslint@7.32.0): + eslint-plugin-es-x@7.8.0(eslint@10.8.0): dependencies: - eslint: 7.32.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0) + '@eslint-community/regexpp': 4.12.2 + eslint: 10.8.0 + eslint-compat-utils: 0.5.1(eslint@10.8.0) - eslint-plugin-node@11.1.0(eslint@7.32.0): + eslint-plugin-n@18.2.2(eslint@10.8.0)(typescript@5.3.3): dependencies: - eslint: 7.32.0 - eslint-plugin-es: 3.0.1(eslint@7.32.0) - eslint-utils: 2.1.0 - ignore: 5.3.1 - minimatch: 3.1.2 - resolve: 1.22.8 - semver: 6.3.1 - - eslint-plugin-prettier@5.5.5(@types/eslint@8.56.2)(eslint-config-prettier@9.1.2(eslint@7.32.0))(eslint@7.32.0)(prettier@3.8.3): - dependencies: - eslint: 7.32.0 - prettier: 3.8.3 - prettier-linter-helpers: 1.0.1 - synckit: 0.11.12 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0) + enhanced-resolve: 5.24.3 + eslint: 10.8.0 + eslint-plugin-es-x: 7.8.0(eslint@10.8.0) + get-tsconfig: 4.14.0 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.7.3 optionalDependencies: - '@types/eslint': 8.56.2 - eslint-config-prettier: 9.1.2(eslint@7.32.0) + typescript: 5.3.3 - eslint-plugin-qunit@6.2.0(eslint@7.32.0): + eslint-plugin-qunit@8.2.6(eslint@10.8.0): dependencies: - eslint-utils: 3.0.0(eslint@7.32.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0) + eslint: 10.8.0 requireindex: 1.2.0 - transitivePeerDependencies: - - eslint eslint-scope@4.0.3: dependencies: @@ -14824,79 +15520,72 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-utils@2.1.0: + eslint-scope@9.1.2: dependencies: - eslint-visitor-keys: 1.3.0 + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@7.32.0): + eslint-utils@3.0.0(eslint@10.8.0): dependencies: - eslint: 7.32.0 + eslint: 10.8.0 eslint-visitor-keys: 2.1.0 - eslint-visitor-keys@1.3.0: {} - eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} - eslint@7.32.0: - dependencies: - '@babel/code-frame': 7.12.11 - '@eslint/eslintrc': 0.4.3 - '@humanwhocodes/config-array': 0.5.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - enquirer: 2.4.1 + eslint-visitor-keys@5.0.1: {} + + eslint@10.8.0: + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 2.1.0 - espree: 7.3.1 - esquery: 1.5.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 13.24.0 - ignore: 4.0.6 - import-fresh: 3.3.0 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-yaml: 3.14.1 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.3 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.6.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - table: 6.8.1 - text-table: 0.2.0 - v8-compile-cache: 2.4.0 transitivePeerDependencies: - supports-color esm@3.2.25: {} - espree@7.3.1: + espree@11.2.0: dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 esprima@3.0.0: {} esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -15063,8 +15752,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-glob@2.2.7: dependencies: '@mrmlnc/readdir-enhanced': 2.2.1 @@ -15122,6 +15809,10 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + figgy-pudding@3.5.2: {} figures@2.0.0: @@ -15132,9 +15823,9 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 file-loader@6.2.0(webpack@4.47.0): dependencies: @@ -15287,11 +15978,10 @@ snapshots: matcher-collection: 2.0.1 walk-sync: 2.2.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.2.9 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.2.9: {} @@ -15310,7 +16000,7 @@ snapshots: forever-agent@0.5.2: {} - fork-ts-checker-webpack-plugin@4.1.6(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0): + fork-ts-checker-webpack-plugin@4.1.6(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0): dependencies: '@babel/code-frame': 7.23.5 chalk: 2.4.2 @@ -15322,11 +16012,11 @@ snapshots: webpack: 4.47.0 worker-rpc: 0.1.1 optionalDependencies: - eslint: 7.32.0 + eslint: 10.8.0 transitivePeerDependencies: - supports-color - fork-ts-checker-webpack-plugin@6.5.3(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0): dependencies: '@babel/code-frame': 7.23.5 '@types/json-schema': 7.0.15 @@ -15344,7 +16034,7 @@ snapshots: typescript: 5.3.3 webpack: 4.47.0 optionalDependencies: - eslint: 7.32.0 + eslint: 10.8.0 form-data@0.1.4: dependencies: @@ -15496,8 +16186,6 @@ snapshots: es-abstract: 1.22.3 functions-have-names: 1.2.3 - functional-red-black-tree@1.0.1: {} - functions-have-names@1.2.3: {} fuse.js@3.6.1: {} @@ -15560,6 +16248,10 @@ snapshots: call-bind: 1.0.6 es-errors: 1.3.0 + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + get-value@2.0.6: {} git-hooks-list@1.0.3: {} @@ -15577,6 +16269,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob-promise@3.4.0(glob@7.2.3): dependencies: '@types/glob': 8.1.0 @@ -15642,9 +16338,9 @@ snapshots: globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@15.15.0: {} + + globals@17.8.0: {} globalthis@1.0.3: dependencies: @@ -15943,6 +16639,8 @@ snapshots: html-tags@3.3.1: {} + html-tags@5.1.0: {} + html-void-elements@1.0.5: {} html-webpack-plugin@4.5.2(webpack@4.47.0): @@ -16039,6 +16737,10 @@ snapshots: ignore@5.3.1: {} + ignore@5.3.2: {} + + ignore@7.0.6: {} + image-size@0.5.5: optional: true @@ -16568,6 +17270,12 @@ snapshots: klona@2.0.6: {} + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + lazy-universal-dotenv@3.0.1: dependencies: '@babel/runtime': 7.23.9 @@ -16746,6 +17454,8 @@ snapshots: lodash.assignin@4.2.0: {} + lodash.camelcase@4.3.0: {} + lodash.castarray@4.4.0: {} lodash.clonedeep@4.5.0: {} @@ -16794,8 +17504,6 @@ snapshots: dependencies: lodash._reinterpolate: 3.0.0 - lodash.truncate@4.4.2: {} - lodash.uniq@4.5.0: {} lodash.uniqby@4.7.0: {} @@ -16912,6 +17620,8 @@ snapshots: '@types/minimatch': 3.0.5 minimatch: 3.1.2 + mathml-tag-names@4.0.0: {} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 @@ -16939,7 +17649,7 @@ snapshots: mdast-util-to-string@1.1.0: {} - mdn-data@2.0.30: {} + mdn-data@2.27.1: {} mdn-links@0.1.0: {} @@ -17051,6 +17761,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.8 + minimatch@3.0.4: dependencies: brace-expansion: 1.1.11 @@ -17471,6 +18185,31 @@ snapshots: overlayscrollbars@1.13.3: {} + oxc-parser@0.130.0: + dependencies: + '@oxc-project/types': 0.130.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.130.0 + '@oxc-parser/binding-android-arm64': 0.130.0 + '@oxc-parser/binding-darwin-arm64': 0.130.0 + '@oxc-parser/binding-darwin-x64': 0.130.0 + '@oxc-parser/binding-freebsd-x64': 0.130.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.130.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.130.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.130.0 + '@oxc-parser/binding-linux-arm64-musl': 0.130.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.130.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.130.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.130.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.130.0 + '@oxc-parser/binding-linux-x64-gnu': 0.130.0 + '@oxc-parser/binding-linux-x64-musl': 0.130.0 + '@oxc-parser/binding-openharmony-arm64': 0.130.0 + '@oxc-parser/binding-wasm32-wasi': 0.130.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.130.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.130.0 + '@oxc-parser/binding-win32-x64-msvc': 0.130.0 + p-all@2.1.0: dependencies: p-map: 2.1.0 @@ -17684,6 +18423,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.5: {} + pidtree@0.3.1: {} pify@3.0.0: {} @@ -17818,10 +18559,6 @@ snapshots: prepend-http@2.0.0: {} - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - prettier@2.8.8: {} prettier@3.8.3: {} @@ -17849,8 +18586,6 @@ snapshots: process@0.11.10: {} - progress@2.0.3: {} - promise-inflight@1.0.1(bluebird@3.7.2): optionalDependencies: bluebird: 3.7.2 @@ -18015,7 +18750,7 @@ snapshots: react: 16.14.0 react-dom: 16.14.0(react@16.14.0) - react-dev-utils@11.0.4(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0): + react-dev-utils@11.0.4(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0): dependencies: '@babel/code-frame': 7.10.4 address: 1.1.2 @@ -18026,7 +18761,7 @@ snapshots: escape-string-regexp: 2.0.0 filesize: 6.1.0 find-up: 4.1.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@7.32.0)(typescript@5.3.3)(webpack@4.47.0) + fork-ts-checker-webpack-plugin: 4.1.6(eslint@10.8.0)(typescript@5.3.3)(webpack@4.47.0) global-modules: 2.0.0 globby: 11.0.1 gzip-size: 5.1.1 @@ -18257,8 +18992,6 @@ snapshots: define-properties: 1.2.1 set-function-name: 2.0.1 - regexpp@3.2.0: {} - regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 @@ -18412,6 +19145,8 @@ snapshots: http-errors: 1.6.3 path-is-absolute: 1.0.1 + resolve-pkg-maps@1.0.0: {} + resolve-url@0.2.1: {} resolve@1.22.8: @@ -18565,6 +19300,8 @@ snapshots: semver@7.7.3: {} + semver@7.8.5: {} + send@0.18.0: dependencies: debug: 2.6.9 @@ -18701,12 +19438,6 @@ snapshots: slash@3.0.0: {} - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - snake-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -18783,6 +19514,8 @@ snapshots: source-map-js@1.0.2: {} + source-map-js@1.2.1: {} + source-map-resolve@0.5.3: dependencies: atob: 2.1.2 @@ -18999,8 +19732,6 @@ snapshots: strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} - style-loader@1.3.0(webpack@4.47.0): dependencies: loader-utils: 2.0.4 @@ -19039,6 +19770,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svg-tags@1.0.0: {} + symbol.prototype.description@1.0.5: dependencies: call-bind: 1.0.6 @@ -19070,18 +19803,6 @@ snapshots: synchronous-promise@2.0.17: {} - synckit@0.11.12: - dependencies: - '@pkgr/core': 0.2.9 - - table@6.8.1: - dependencies: - ajv: 8.12.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tap-parser@7.0.0: dependencies: events-to-array: 1.1.2 @@ -19092,6 +19813,8 @@ snapshots: tapable@2.2.1: {} + tapable@2.3.3: {} + tar@6.2.0: dependencies: chownr: 2.0.0 @@ -19308,6 +20031,11 @@ snapshots: transitivePeerDependencies: - supports-color + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + tmp@0.0.28: dependencies: os-tmpdir: 1.0.2 @@ -19396,6 +20124,10 @@ snapshots: trough@1.0.5: {} + ts-api-utils@2.5.0(typescript@5.3.3): + dependencies: + typescript: 5.3.3 + ts-dedent@2.2.0: {} ts-pnp@1.2.0(typescript@5.3.3): @@ -19432,6 +20164,8 @@ snapshots: type-fest@0.8.1: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -19470,6 +20204,17 @@ snapshots: typedarray@0.0.6: {} + typescript-eslint@8.65.0(eslint@10.8.0)(typescript@5.3.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.3.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@5.3.3) + eslint: 10.8.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + typescript-memoize@1.1.1: {} typescript@5.3.3: {} diff --git a/tests/dummy/app/app.d.ts b/tests/dummy/app/app.d.ts new file mode 100644 index 000000000..4aacd205f --- /dev/null +++ b/tests/dummy/app/app.d.ts @@ -0,0 +1,3 @@ +import Application from '@ember/application'; + +export default class App extends Application {} diff --git a/tests/dummy/app/components/panel/example-row.ts b/tests/dummy/app/components/panel/example-row.ts deleted file mode 100644 index 7ddf85d88..000000000 --- a/tests/dummy/app/components/panel/example-row.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Component from '@glimmer/component'; - -interface PanelExampleRowArgs { - item: any; -} - -export default class PanelExampleRow extends Component {} diff --git a/tests/dummy/app/components/storybook.ts b/tests/dummy/app/components/storybook.ts index 1f35f8eda..ba5efc981 100644 --- a/tests/dummy/app/components/storybook.ts +++ b/tests/dummy/app/components/storybook.ts @@ -4,14 +4,12 @@ import Component from '@glimmer/component'; import type { IntlService } from 'ember-intl'; -interface Globals {} - interface StorybookArgs { story: { template: any; context: Record; }; - globals: Globals; + globals: Record; } export default class StorybookComponent extends Component { @@ -24,6 +22,8 @@ export default class StorybookComponent extends Component { } get storyComponent() { + // The class is a dynamic backing class filled in below, not a component file. + // eslint-disable-next-line ember/no-empty-glimmer-component-classes class StoryComponent extends Component {} Object.keys(this.storyComponentArgs).forEach((key) => { diff --git a/tests/dummy/app/components/wizard/example-controls.ts b/tests/dummy/app/components/wizard/example-controls.ts index de719a56a..b0a3d5507 100644 --- a/tests/dummy/app/components/wizard/example-controls.ts +++ b/tests/dummy/app/components/wizard/example-controls.ts @@ -4,9 +4,7 @@ import { action } from '@ember/object'; import type WizardManager from '@upfluence/oss-components/services/wizard-manager'; -interface WizardExampleControlsSignature {} - -export default class WizardExampleControls extends Component { +export default class WizardExampleControls extends Component { @service declare wizardManager: WizardManager; @action diff --git a/tests/dummy/app/components/wizard/example-menu.ts b/tests/dummy/app/components/wizard/example-menu.ts index 050c14513..9bbcdffd3 100644 --- a/tests/dummy/app/components/wizard/example-menu.ts +++ b/tests/dummy/app/components/wizard/example-menu.ts @@ -6,9 +6,7 @@ import { action } from '@ember/object'; import type WizardManager from '@upfluence/oss-components/services/wizard-manager'; import type { Section } from '@upfluence/oss-components/services/wizard-manager'; -interface WizardExampleMenuSignature {} - -export default class WizardExampleMenu extends Component { +export default class WizardExampleMenu extends Component { @service declare wizardManager: WizardManager; isSectionExpanded = helper((_, { sectionId }: { sectionId: string }): boolean => { diff --git a/tests/dummy/app/components/wizard/example-step-with-scroll.ts b/tests/dummy/app/components/wizard/example-step-with-scroll.ts index e7fb37d2d..650f98b30 100644 --- a/tests/dummy/app/components/wizard/example-step-with-scroll.ts +++ b/tests/dummy/app/components/wizard/example-step-with-scroll.ts @@ -1,7 +1,7 @@ import { action } from '@ember/object'; import { WizardBaseStep, type WizardBaseStepSignature } from '@upfluence/oss-components/components/wizard/base-step'; -interface WizardExampleStepWithScrollSignature extends WizardBaseStepSignature {} +type WizardExampleStepWithScrollSignature = WizardBaseStepSignature; export default class WizardExampleStepWithScroll extends WizardBaseStep { constructor(owner: unknown, args: WizardExampleStepWithScrollSignature) { @@ -16,7 +16,7 @@ export default class WizardExampleStepWithScroll extends WizardBaseStep { constructor(owner: unknown, args: WizardExampleStepSignature) { @@ -16,7 +16,7 @@ export default class WizardExampleStep extends WizardBaseStep { if (element === selectedTab) { diff --git a/tests/dummy/app/controllers/smart.ts b/tests/dummy/app/controllers/smart.ts index ddbf2ffd9..6c065a353 100644 --- a/tests/dummy/app/controllers/smart.ts +++ b/tests/dummy/app/controllers/smart.ts @@ -63,8 +63,8 @@ export default class Smart extends Controller { @tracked multilinePlaceholder: string = 'Small placeholder\nwith multiple\nlines'; @tracked numberValue: number = 42; - constructor() { - super(...arguments); + constructor(...args: ConstructorParameters) { + super(...args); this.addContentToFeedbackComponent(); } diff --git a/tests/integration/components/modifiers/enable-input-autofocus-test.ts b/tests/integration/components/modifiers/enable-input-autofocus-test.ts index 97234ed7b..71c3540db 100644 --- a/tests/integration/components/modifiers/enable-input-autofocus-test.ts +++ b/tests/integration/components/modifiers/enable-input-autofocus-test.ts @@ -16,7 +16,7 @@ module('Integration | Component | modifiers/enable-input-autofocus', function (h `); const inputElement = document.querySelector('.input'); - await assert.equal(document.activeElement, inputElement); + await assert.strictEqual(document.activeElement, inputElement); }); test('it focuses the first enabled input ', async function (assert) { @@ -29,7 +29,7 @@ module('Integration | Component | modifiers/enable-input-autofocus', function (h `); const inputElements = document.querySelectorAll('.input'); - await assert.equal(document.activeElement, inputElements[3]); + await assert.strictEqual(document.activeElement, inputElements[3]); }); }); @@ -40,7 +40,7 @@ module('Integration | Component | modifiers/enable-input-autofocus', function (h `); const inputElement = document.querySelector('.input'); - await assert.equal(document.activeElement, inputElement); + await assert.strictEqual(document.activeElement, inputElement); }); test('When adding the modifier to a disabled element, it does nothing', async function (assert) { diff --git a/tests/integration/components/modifiers/scroll-shadow-test.ts b/tests/integration/components/modifiers/scroll-shadow-test.ts index 54c7ff28d..0f26c3bd3 100644 --- a/tests/integration/components/modifiers/scroll-shadow-test.ts +++ b/tests/integration/components/modifiers/scroll-shadow-test.ts @@ -108,7 +108,7 @@ module('Integration | Component | modifiers/scroll-shadow', function (hooks) { `); - let container: HTMLElement | null = document.querySelector('.items-container'); + const container: HTMLElement | null = document.querySelector('.items-container'); container!.style.maxHeight = '80px'; container!.style.overflow = 'auto'; diff --git a/tests/integration/components/o-s-s/array-input-test.js b/tests/integration/components/o-s-s/array-input-test.js index 18adec252..f1b912a9b 100644 --- a/tests/integration/components/o-s-s/array-input-test.js +++ b/tests/integration/components/o-s-s/array-input-test.js @@ -107,11 +107,11 @@ module('Integration | Component | OSS::ArrayInput', function (hooks) { this.loadedValues = ['value1', 'value2']; await render(hbs``); let domTags = findAll('.upf-chip'); - assert.equal(domTags.length, 2); + assert.strictEqual(domTags.length, 2); assert.dom(domTags[1]).hasText('value2'); await triggerKeyEvent('.array-input-container input', 'keydown', 'Backspace', { code: 'Backspace' }); domTags = findAll('.upf-chip'); - assert.equal(domTags.length, 1); + assert.strictEqual(domTags.length, 1); assert.dom('.array-input-container input').hasValue('value2'); }); }); @@ -133,10 +133,10 @@ module('Integration | Component | OSS::ArrayInput', function (hooks) { this.loadedValues = ['value1', 'value2']; await render(hbs``); let domTagsRemove = findAll('.upf-chip'); - assert.equal(domTagsRemove.length, 2); + assert.strictEqual(domTagsRemove.length, 2); await click('.upf-chip i'); domTagsRemove = findAll('.upf-chip'); - assert.equal(domTagsRemove.length, 1); + assert.strictEqual(domTagsRemove.length, 1); assert.dom('.upf-chip').hasText('value2'); }); }); diff --git a/tests/integration/components/o-s-s/attribute/tag-array-test.ts b/tests/integration/components/o-s-s/attribute/tag-array-test.ts index 320646ab2..a7db8431f 100644 --- a/tests/integration/components/o-s-s/attribute/tag-array-test.ts +++ b/tests/integration/components/o-s-s/attribute/tag-array-test.ts @@ -25,7 +25,7 @@ module('Integration | Component | o-s-s/attribute/tag-array', function (hooks) { assert.dom('.oss-attribute__value .fx-row.fx-wrap').exists(); const allUpfTags = findAll('.upf-tag'); - assert.equal(allUpfTags.length, this.tags.length); + assert.strictEqual(allUpfTags.length, this.tags.length); }); test('If @tags are not passed to the component, a dash is displayed', async function (assert) { diff --git a/tests/integration/components/o-s-s/attributes-panel-test.ts b/tests/integration/components/o-s-s/attributes-panel-test.ts index 9ee41fb3a..e6d92f543 100644 --- a/tests/integration/components/o-s-s/attributes-panel-test.ts +++ b/tests/integration/components/o-s-s/attributes-panel-test.ts @@ -195,7 +195,7 @@ module('Integration | Component | o-s-s/attributes-panel', function (hooks) { test('it throws an error if @title is missing', async function (assert) { setupOnerror((error: Error) => { - assert.equal( + assert.strictEqual( error.message, 'Assertion Failed: [component][OSS::AttributesPanel] The @title parameter is mandatory' ); @@ -205,7 +205,7 @@ module('Integration | Component | o-s-s/attributes-panel', function (hooks) { test('it throws an error if @onSave is missing', async function (assert) { setupOnerror((error: Error) => { - assert.equal( + assert.strictEqual( error.message, 'Assertion Failed: [component][OSS::AttributesPanel] The @onSave parameter is mandatory' ); diff --git a/tests/integration/components/o-s-s/avatar-test.ts b/tests/integration/components/o-s-s/avatar-test.ts index 1590a3932..f47363bcb 100644 --- a/tests/integration/components/o-s-s/avatar-test.ts +++ b/tests/integration/components/o-s-s/avatar-test.ts @@ -14,9 +14,7 @@ module('Integration | Component | o-s-s/avatar', function (hooks) { assert.dom('.upf-avatar').exists(); assert.dom('.upf-avatar img').exists(); - assert - .dom('.upf-avatar img') - .hasAttribute('src', '/assets/images/brand-icon.svg'); + assert.dom('.upf-avatar img').hasAttribute('src', '/assets/images/brand-icon.svg'); }); test('it displays the initials when they are provided', async function (assert) { @@ -36,30 +34,24 @@ module('Integration | Component | o-s-s/avatar', function (hooks) { }); test('it displays the image when image and initials are provided', async function (assert) { - await render( - hbs`` - ); + await render(hbs``); assert.dom('.upf-avatar').exists(); assert.dom('.upf-avatar img').exists(); - assert - .dom('.upf-avatar img') - .hasAttribute('src', '/assets/images/brand-icon.svg'); + assert.dom('.upf-avatar img').hasAttribute('src', '/assets/images/brand-icon.svg'); }); test('it updates the image when a new @image is provided', async function (assert) { this.updatedImage = null; await render(hbs``); - assert.ok(this.updatedImage === null); + assert.strictEqual(this.updatedImage, null); assert.dom('.upf-avatar').exists(); assert.dom('.upf-avatar img').doesNotExist(); assert.dom('.upf-avatar span').hasText('TS'); this.set('updatedImage', '/assets/images/brand-icon.svg'); assert.dom('.upf-avatar span').doesNotExist(); - assert - .dom('.upf-avatar img') - .hasAttribute('src', '/assets/images/brand-icon.svg'); + assert.dom('.upf-avatar img').hasAttribute('src', '/assets/images/brand-icon.svg'); }); }); @@ -77,10 +69,9 @@ module('Integration | Component | o-s-s/avatar', function (hooks) { await render(hbs``); assert.dom('.upf-avatar').hasClass(`upf-avatar--skin`).hasClass(`upf-avatar--skin-${skin}`); - }) - }) - - }) + }); + }); + }); module('Sizes', function () { test('it sets the right default class when size is not provided', async function (assert) { @@ -109,7 +100,7 @@ module('Integration | Component | o-s-s/avatar', function (hooks) { module('Error behavior', function () { test('it throws an error if the wrong size argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, `Assertion Failed: [component][OSS::Avatar] Unknown size. Available sizes are: ${Object.keys( SizeDefinition @@ -122,7 +113,7 @@ module('Integration | Component | o-s-s/avatar', function (hooks) { test('it throws an error if the wrong skin argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, `Assertion Failed: [component][OSS::Avatar] Unknown skin. Available skins are: ${AvatarSkins.join(', ')}` ); diff --git a/tests/integration/components/o-s-s/badge-test.ts b/tests/integration/components/o-s-s/badge-test.ts index ba51b7197..99dc2f88f 100644 --- a/tests/integration/components/o-s-s/badge-test.ts +++ b/tests/integration/components/o-s-s/badge-test.ts @@ -74,7 +74,7 @@ module('Integration | Component | o-s-s/badge', function (hooks) { module('Error management', function () { test('it throws an error when an unsupported skin is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Badge] Unknown skin. Available skins are: primary, success, alert, error, xtd-cyan, xtd-orange, xtd-yellow, xtd-lime, xtd-blue, xtd-violet, xtd-smart' ); @@ -85,7 +85,7 @@ module('Integration | Component | o-s-s/badge', function (hooks) { test('it throws an error when an unsupported size is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Badge] Unknown size. Available sizes are: sm, md, lg' ); @@ -96,7 +96,7 @@ module('Integration | Component | o-s-s/badge', function (hooks) { test('it throws an error if no argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Badge] One of @icon, @image or @text arguments is mandatory. You passed 0 arguments' ); @@ -107,7 +107,7 @@ module('Integration | Component | o-s-s/badge', function (hooks) { test('it throws an error if more than one content argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Badge] One of @icon, @image or @text arguments is mandatory. You passed 2 arguments' ); diff --git a/tests/integration/components/o-s-s/button-dropdown-test.ts b/tests/integration/components/o-s-s/button-dropdown-test.ts index c25dd8c49..5b7584b34 100644 --- a/tests/integration/components/o-s-s/button-dropdown-test.ts +++ b/tests/integration/components/o-s-s/button-dropdown-test.ts @@ -212,7 +212,7 @@ module('Integration | Component | o-s-s/button-dropdown', function (hooks) { module('Error management', function () { test('it throws an error if no icon or label args is provided', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ButtonDropdown] You must pass either a @label or an @icon argument.' ); @@ -225,7 +225,7 @@ module('Integration | Component | o-s-s/button-dropdown', function (hooks) { test('it throws an error if mainAction exists and is not a function', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ButtonDropdown] The parameter @mainAction should be a function.' ); diff --git a/tests/integration/components/o-s-s/button-test.ts b/tests/integration/components/o-s-s/button-test.ts index 25a1b01b4..37174fb6f 100644 --- a/tests/integration/components/o-s-s/button-test.ts +++ b/tests/integration/components/o-s-s/button-test.ts @@ -36,7 +36,9 @@ module('Integration | Component | o-s-s/button', function (hooks) { }); test('when icon and iconUrl are present, it only renders the icon', async function (assert) { - await render(hbs``); + await render( + hbs`` + ); assert.dom('.upf-btn i').hasClass('fa-facebook'); assert.dom('.upf-btn img').doesNotExist(); @@ -222,7 +224,7 @@ module('Integration | Component | o-s-s/button', function (hooks) { module('Error management', function () { test('it fails if @label, @icon and @iconUrl are missing', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Button] You must pass either a @label, an @icon or an @iconUrl argument.' ); @@ -233,7 +235,7 @@ module('Integration | Component | o-s-s/button', function (hooks) { test('it fails if callback missing for @countDown argument', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, "Assertion Failed: [component][OSS::Button] You must pass either a hash with 'callback' value to @countDown argument." ); diff --git a/tests/integration/components/o-s-s/carousel-test.ts b/tests/integration/components/o-s-s/carousel-test.ts index 51e135a89..ecb984d11 100644 --- a/tests/integration/components/o-s-s/carousel-test.ts +++ b/tests/integration/components/o-s-s/carousel-test.ts @@ -39,7 +39,7 @@ module('Integration | Component | o-s-s/carousel', function (hooks) { test('If no pages are yielded to the component, it throws an error', async function (assert) { setupOnerror((error: Error) => { - assert.equal(error.message, '[component][OSS::Carousel] No pages found in the carousel'); + assert.strictEqual(error.message, '[component][OSS::Carousel] No pages found in the carousel'); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/checkbox-test.ts b/tests/integration/components/o-s-s/checkbox-test.ts index 9bdef9c7f..fee7542a9 100644 --- a/tests/integration/components/o-s-s/checkbox-test.ts +++ b/tests/integration/components/o-s-s/checkbox-test.ts @@ -43,15 +43,14 @@ module('Integration | Component | o-s-s/checkbox', function (hooks) { }); test('the onChange hooks is called with the new value', async function (assert: Assert) { + const onChangeSpy = sinon.spy(); this.checked = false; - this.onChange = (value: boolean) => { - assert.equal(value, true); - }; + this.onChange = onChangeSpy; await render(hbs``); await click('.upf-checkbox'); - assert.expect(1); + assert.ok(onChangeSpy.calledOnceWithExactly(true)); }); module('@partial argument', () => { @@ -160,7 +159,7 @@ module('Integration | Component | o-s-s/checkbox', function (hooks) { module('Error management', function () { test('it throws an error if checked argument is missing', async function (assert) { setupOnerror((error: Error) => { - assert.equal( + assert.strictEqual( error.message, 'Assertion Failed: [component][OSS::Checkbox] Boolean @checked argument is mandatory.' ); @@ -168,9 +167,12 @@ module('Integration | Component | o-s-s/checkbox', function (hooks) { await render(hbs``); }); - test('it throws an error if checked argument is missing', async function (assert) { + test('it throws an error if the onChange argument is missing', async function (assert) { setupOnerror((error: Error) => { - assert.equal(error.message, 'Assertion Failed: [component][OSS::Checkbox] @onChange argument is mandatory.'); + assert.strictEqual( + error.message, + 'Assertion Failed: [component][OSS::Checkbox] @onChange argument is mandatory.' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/chip-test.ts b/tests/integration/components/o-s-s/chip-test.ts index cef89cd22..36d6e8017 100644 --- a/tests/integration/components/o-s-s/chip-test.ts +++ b/tests/integration/components/o-s-s/chip-test.ts @@ -103,7 +103,7 @@ module('Integration | Component | o-s-s/chip', function (hooks) { module('Error management', function () { test('It throws an error if @onRemove is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Chip] The parameter @onRemove of type function is mandatory' ); @@ -113,7 +113,7 @@ module('Integration | Component | o-s-s/chip', function (hooks) { test('It throws an error if @label is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Chip] The @label parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [component][OSS::Chip] The @label parameter is mandatory'); }); await render(hbs``); }); diff --git a/tests/integration/components/o-s-s/code-block-test.ts b/tests/integration/components/o-s-s/code-block-test.ts index f92c2f287..1088c844a 100644 --- a/tests/integration/components/o-s-s/code-block-test.ts +++ b/tests/integration/components/o-s-s/code-block-test.ts @@ -26,7 +26,7 @@ module('Integration | Component | o-s-s/code-block', function (hooks) { await render(hbs``); const codeLines = findAll('.code-block code'); - assert.equal(codeLines.length, 60); + assert.strictEqual(codeLines.length, 60); assert.dom(codeLines[0]).hasText("import Component from '@glimmer/component';"); assert.dom(codeLines[1]).hasText(`import { action } from '@ember/object';`); assert.dom(codeLines[2]).hasText(`import { inject as service } from '@ember/service';`); diff --git a/tests/integration/components/o-s-s/completion-badge-test.ts b/tests/integration/components/o-s-s/completion-badge-test.ts index 2dc6fd0e1..376fe9ff3 100644 --- a/tests/integration/components/o-s-s/completion-badge-test.ts +++ b/tests/integration/components/o-s-s/completion-badge-test.ts @@ -181,7 +181,7 @@ module('Integration | Component | o-s-s/completion-badge', function (hooks) { module('Error management', function () { test('it throws an error when an unsupported skin is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CompletionBadge] Unknown skin. Available skins are: primary, success, alert, error, xtd-cyan, xtd-orange, xtd-yellow, xtd-lime, xtd-blue, xtd-violet, xtd-smart' ); @@ -192,7 +192,7 @@ module('Integration | Component | o-s-s/completion-badge', function (hooks) { test('it throws an error when an unsupported size is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CompletionBadge] Unknown size. Available sizes are: sm, md, lg' ); @@ -203,7 +203,7 @@ module('Integration | Component | o-s-s/completion-badge', function (hooks) { test('it throws an error if no argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CompletionBadge] One of @icon, @image or @text arguments is mandatory. You passed 0 arguments' ); @@ -214,7 +214,7 @@ module('Integration | Component | o-s-s/completion-badge', function (hooks) { test('it throws an error if more than one content argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CompletionBadge] One of @icon, @image or @text arguments is mandatory. You passed 2 arguments' ); diff --git a/tests/integration/components/o-s-s/context-menu/panel-test.ts b/tests/integration/components/o-s-s/context-menu/panel-test.ts index d470600c2..6639599fb 100644 --- a/tests/integration/components/o-s-s/context-menu/panel-test.ts +++ b/tests/integration/components/o-s-s/context-menu/panel-test.ts @@ -1,7 +1,7 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { click, render, settled, triggerEvent, waitUntil } from '@ember/test-helpers'; -import { hbs, type TemplateFactory } from 'ember-cli-htmlbars'; +import { hbs } from 'ember-cli-htmlbars'; import { setupIntl } from 'ember-intl/test-support'; import sinon from 'sinon'; import { setComponentTemplate } from '@ember/component'; @@ -53,17 +53,17 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { this.set('isInitialized', true); await settled(); const panelRef = document.querySelector('.context-menu-panel__scrollable-container') as HTMLElement; - assert.equal(panelRef.style.top, '36px'); + assert.strictEqual(panelRef.style.top, '36px'); await waitUntil(() => panelRef.style.left === '63.5px', { timeout: 300 }); - assert.equal(panelRef.style.left, '63.5px'); + assert.strictEqual(panelRef.style.left, '63.5px'); buttonRef.style.marginLeft = '50px'; await settled(); - assert.equal(panelRef.style.top, '36px'); + assert.strictEqual(panelRef.style.top, '36px'); await waitUntil(() => panelRef.style.left === '113.5px', { timeout: 300 }); - assert.equal(panelRef.style.left, '113.5px'); + assert.strictEqual(panelRef.style.left, '113.5px'); }); - module('placement', function (hooks) { + module('placement', function () { test('When placement is set to right-start, it positions the panel accordingly', async function (assert) { await render(hbs` {{#if this.isInitialized}} @@ -85,8 +85,8 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { const expectedLeftPosition = Number(((leftPosition + buttonRef.getBoundingClientRect().width) * 2).toFixed(4)) + 'px'; const expectedTopPosition = 0 + 'px'; - assert.equal(expectedLeftPosition, panelRef.style.left); - assert.equal(expectedTopPosition, panelRef.style.top); + assert.strictEqual(expectedLeftPosition, panelRef.style.left); + assert.strictEqual(expectedTopPosition, panelRef.style.top); }); test('When placement is set to bottom-start, it positions the panel accordingly', async function (assert) { @@ -110,8 +110,8 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { const expectedLeftPosition = 0 + 'px'; const expectedTopPosition = Number(((topPosition + buttonRef.getBoundingClientRect().height) * 2).toFixed(4)) + 'px'; - assert.equal(expectedLeftPosition, panelRef.style.left); - assert.equal(expectedTopPosition, panelRef.style.top); + assert.strictEqual(expectedLeftPosition, panelRef.style.left); + assert.strictEqual(expectedTopPosition, panelRef.style.top); }); }); @@ -134,7 +134,7 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { this.set('isInitialized', true); const panelRef = document.querySelector('.context-menu-panel__scrollable-container') as HTMLElement; await settled(); - assert.equal(panelRef.style.top, '36px'); + assert.strictEqual(panelRef.style.top, '36px'); }); test('When offset is defined, panel is is moved by that many pixels than defined to his reference target', async function (assert) { @@ -155,7 +155,7 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { this.set('isInitialized', true); const panelRef = document.querySelector('.context-menu-panel__scrollable-container') as HTMLElement; await settled(); - assert.equal(panelRef.style.top, '56px'); + assert.strictEqual(panelRef.style.top, '56px'); }); }); @@ -184,8 +184,8 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { const triggerPosition = ( panels[0]?.querySelector('div.context-menu-panel__dropdown li:nth-of-type(1)') as HTMLElement ).getBoundingClientRect(); - assert.equal(triggerPosition.x + triggerPosition.width, panels[1]?.getBoundingClientRect().x); - assert.equal(triggerPosition.y + SUBPANEL_OFFSET / 2, panels[1]?.getBoundingClientRect().y); + assert.strictEqual(triggerPosition.x + triggerPosition.width, panels[1]?.getBoundingClientRect().x); + assert.strictEqual(triggerPosition.y + SUBPANEL_OFFSET / 2, panels[1]?.getBoundingClientRect().y); }); test('Submenu items are properly displayed', async function (assert) { @@ -195,16 +195,16 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { await click('div.context-menu-panel__dropdown li:nth-of-type(1) .oss-infinite-select-option'); assert.dom('div.context-menu-panel__dropdown').exists({ count: 2 }); const panels = document.querySelectorAll('div.context-menu-panel__dropdown'); - assert.equal(panels[1]?.querySelectorAll('li').length, 3); - assert.equal( + assert.strictEqual(panels[1]?.querySelectorAll('li').length, 3); + assert.strictEqual( (panels[1]?.querySelector('li:nth-of-type(1)') as HTMLElement).textContent?.trim(), 'Sub Item 1.1' ); - assert.equal( + assert.strictEqual( (panels[1]?.querySelector('li:nth-of-type(2)') as HTMLElement).textContent?.trim(), 'Sub Item 1.2' ); - assert.equal( + assert.strictEqual( (panels[1]?.querySelector('li:nth-of-type(3)') as HTMLElement).textContent?.trim(), 'Sub Item 1.3' ); @@ -212,9 +212,11 @@ module('Integration | Component | o-s-s/context-menu/panel', function (hooks) { }); test('If item has custom component it render the component instead of default one', async function (assert) { + // The backing class only exists to receive the template below. + // eslint-disable-next-line ember/no-empty-glimmer-component-classes class TestComponent extends Component {} setComponentTemplate(hbs`
{{@item.title}}
` as any, TestComponent); - const component = this.owner.register('component:test-component', TestComponent); + this.owner.register('component:test-component', TestComponent); this.items = [{ title: 'custom', action: () => console.log('Item 1 clicked'), rowRenderer: TestComponent }]; await render(hbs``); diff --git a/tests/integration/components/o-s-s/country-selector-test.ts b/tests/integration/components/o-s-s/country-selector-test.ts index 82310fdda..b5c956cd0 100644 --- a/tests/integration/components/o-s-s/country-selector-test.ts +++ b/tests/integration/components/o-s-s/country-selector-test.ts @@ -107,7 +107,7 @@ module('Integration | Component | o-s-s/country-selector', function (hooks) { await render(hbs``); await click('[data-control-name="country-selector-input"]'); const rows = findAll('.upf-infinite-select__item'); - assert.equal(rows.length, this.countries.length); + assert.strictEqual(rows.length, this.countries.length); }); test('if @sourceList contain ids, then country icons are displayed', async function (assert) { @@ -244,7 +244,7 @@ module('Integration | Component | o-s-s/country-selector', function (hooks) { module('error management', () => { test('it throws an error if @sourceList is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CountrySelector] The parameter @sourceList of type object is mandatory' ); @@ -255,7 +255,7 @@ module('Integration | Component | o-s-s/country-selector', function (hooks) { test('it throws an error if @onChange is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CountrySelector] The @onChange parameter is mandatory' ); @@ -265,12 +265,12 @@ module('Integration | Component | o-s-s/country-selector', function (hooks) { }); }); - module('@feedbackMessageMessage argument', () => { + module('@feedbackMessageMessage argument', (hooks) => { hooks.beforeEach(function () { this.feedbackMessage = { type: 'error', value: 'This is an error message' }; }); - module('when @feedbackMessage is provided', () => { + module('when @feedbackMessage is not provided', () => { test('no error message is displayed', async function (assert) { await render(hbs``); assert.dom('[data-control-name="country-selector-feedback-message"]').doesNotExist(); diff --git a/tests/integration/components/o-s-s/currency-input-test.ts b/tests/integration/components/o-s-s/currency-input-test.ts index eecf06583..e3a4b9d37 100644 --- a/tests/integration/components/o-s-s/currency-input-test.ts +++ b/tests/integration/components/o-s-s/currency-input-test.ts @@ -83,7 +83,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { assert.dom('.upf-infinite-select').exists(); await typeIn('.upf-infinite-select input', 'usd'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 1); + assert.strictEqual(clickableRows.length, 1); assert.dom(clickableRows[0]).hasText('$ USD'); }); @@ -93,7 +93,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { assert.dom('.upf-infinite-select').exists(); await typeIn('.upf-infinite-select input', '€'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 1); + assert.strictEqual(clickableRows.length, 1); assert.dom(clickableRows[0]).hasText('€ EUR'); }); @@ -124,7 +124,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { @allowedCurrencies={{this.allowedCurrencies}} />`); await click('.currency-selector'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 2); + assert.strictEqual(clickableRows.length, 2); }); module('Selected currency highlighting', () => { @@ -168,7 +168,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { await render(hbs``); await typeIn('input', '8'); assert.ok(this.onChange.calledOnce); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('input', 'keydown', 'A', { code: 'a' }); assert.dom('input').hasValue('08'); }); @@ -240,7 +240,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { test('When selection is applied, it replaces the selection', async function (assert) { await render(hbs``); assert.dom('input').hasValue('1234567890'); - let input = document.querySelector('input.ember-text-field') as HTMLInputElement; + const input = document.querySelector('input.ember-text-field') as HTMLInputElement; input.setSelectionRange(4, 6); await triggerEvent('input', 'paste', { clipboardData: { @@ -254,7 +254,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { test('It throws an error if @onChange is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::CurrencyInput] The parameter @onChange of type function is mandatory' ); @@ -282,13 +282,15 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { }); test("It doesn't display an icon below the component", async function (assert) { - assert.expect(1); await render( hbs`` ); - icon - ? assert.dom('.currency-input-container > span i').hasClass(icon) - : assert.dom('.currency-input-container > span i').doesNotExist(); + + if (icon) { + assert.dom('.currency-input-container > span i').hasClass(icon); + } else { + assert.dom('.currency-input-container > span i').doesNotExist(); + } }); test('It displays a red border around the component', async function (assert) { @@ -428,7 +430,7 @@ module('Integration | Component | o-s-s/currency-input', function (hooks) { assert.dom('.oss-infinite-select-option--selected').containsText('EUR'); }); - module('With @onlyCurrency', () => { + module('With @onlyCurrency', (hooks) => { hooks.beforeEach(function () { this.options = { allowEmpty: true }; }); diff --git a/tests/integration/components/o-s-s/dialog-test.ts b/tests/integration/components/o-s-s/dialog-test.ts index f0b59e3fb..15a799ea0 100644 --- a/tests/integration/components/o-s-s/dialog-test.ts +++ b/tests/integration/components/o-s-s/dialog-test.ts @@ -165,7 +165,7 @@ module('Integration | Component | o-s-s/dialog', function (hooks) { module('Error management', function () { test('The component throws an error if the @title parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Dialog] The title parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [component][OSS::Dialog] The title parameter is mandatory'); }); await render(hbs``); @@ -173,7 +173,10 @@ module('Integration | Component | o-s-s/dialog', function (hooks) { test('The component throws an error if the @mainAction parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Dialog] The mainAction parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::Dialog] The mainAction parameter is mandatory' + ); }); await render(hbs``); @@ -181,7 +184,7 @@ module('Integration | Component | o-s-s/dialog', function (hooks) { test('The component throws an error if the @secondaryAction parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Dialog] The secondaryAction parameter is mandatory' ); diff --git a/tests/integration/components/o-s-s/email-input-test.ts b/tests/integration/components/o-s-s/email-input-test.ts index e394a6b70..514ed5e6c 100644 --- a/tests/integration/components/o-s-s/email-input-test.ts +++ b/tests/integration/components/o-s-s/email-input-test.ts @@ -54,7 +54,7 @@ module('Integration | Component | o-s-s/email-input', function (hooks) { test('If the email regex is matched, and the @validates method is passed, then the status of the validation is returned', async function (assert) { this.value = 'john.doe@example.com'; this.validates = (x: boolean) => { - assert.equal(x, true); + assert.true(x); }; await render(hbs``); await typeIn('input', 'a'); @@ -63,7 +63,7 @@ module('Integration | Component | o-s-s/email-input', function (hooks) { test('If the email regex isnt matched, and the @validates method is passed, then the status of the validation is returned', async function (assert) { this.value = 'foo@f'; this.validates = (x: boolean) => { - assert.equal(x, false); + assert.false(x); }; await render(hbs``); await typeIn('input', 'a'); @@ -71,7 +71,10 @@ module('Integration | Component | o-s-s/email-input', function (hooks) { test('it throws an error when the @value parameter is missing', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::EmailInput] The @value parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::EmailInput] The @value parameter is mandatory' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/empty-state-test.ts b/tests/integration/components/o-s-s/empty-state-test.ts index 10498b0da..fe3ada32c 100644 --- a/tests/integration/components/o-s-s/empty-state-test.ts +++ b/tests/integration/components/o-s-s/empty-state-test.ts @@ -66,7 +66,7 @@ module('Integration | Component | o-s-s/empty-state', function (hooks) { assert.dom('button').hasText('Retry'); }); - module('component size', function (hooks) { + module('component size', function () { test('it applies md sizes by default', async function (assert) { await render(hbs``); assert.dom('div.font-color-gray-900').hasClass('font-size-lg'); @@ -92,10 +92,13 @@ module('Integration | Component | o-s-s/empty-state', function (hooks) { }); }); - module('error management', function (hooks) { + module('error management', function () { test('it throws an error if the @title parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::EmptyState] The title parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::EmptyState] The title parameter is mandatory' + ); }); await render(hbs``); @@ -103,7 +106,10 @@ module('Integration | Component | o-s-s/empty-state', function (hooks) { test('it throws an error if the @subtitle parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::EmptyState] The subtitle parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::EmptyState] The subtitle parameter is mandatory' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/expandable-badge-test.ts b/tests/integration/components/o-s-s/expandable-badge-test.ts index fd556ec83..40c88bfd6 100644 --- a/tests/integration/components/o-s-s/expandable-badge-test.ts +++ b/tests/integration/components/o-s-s/expandable-badge-test.ts @@ -177,7 +177,7 @@ module('Integration | Component | o-s-s/expandable-badge', function (hooks) { module('Error management', function () { test('it throws an error when an unsupported skin is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ExpandableBadge] Unknown skin. Available skins are: primary, success, alert, error, xtd-cyan, xtd-orange, xtd-yellow, xtd-lime, xtd-blue, xtd-violet, xtd-smart' ); @@ -188,7 +188,7 @@ module('Integration | Component | o-s-s/expandable-badge', function (hooks) { test('it throws an error when an unsupported size is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ExpandableBadge] Unknown size. Available sizes are: sm, md, lg' ); @@ -199,7 +199,7 @@ module('Integration | Component | o-s-s/expandable-badge', function (hooks) { test('it throws an error if no @expandableLabel argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ExpandableBadge] The @expandedLabel argument is mandatory.' ); @@ -210,7 +210,7 @@ module('Integration | Component | o-s-s/expandable-badge', function (hooks) { test('it throws an error if no argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ExpandableBadge] One of @icon, @image, @flag or @text arguments is mandatory. You passed 0 arguments' ); @@ -221,7 +221,7 @@ module('Integration | Component | o-s-s/expandable-badge', function (hooks) { test('it throws an error if more than one content argument is passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ExpandableBadge] One of @icon, @image, @flag or @text arguments is mandatory. You passed 2 arguments' ); diff --git a/tests/integration/components/o-s-s/feature-card-test.ts b/tests/integration/components/o-s-s/feature-card-test.ts index 834282065..ee9c56c0d 100644 --- a/tests/integration/components/o-s-s/feature-card-test.ts +++ b/tests/integration/components/o-s-s/feature-card-test.ts @@ -85,7 +85,7 @@ module('Integration | Component | o-s-s/feature-card', function (hooks) { module('Error management', () => { test('it throws when @title is missing', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::FeatureCard] The @title parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::FeatureCard] The @title parameter is mandatory'); }); await render(hbs``); @@ -93,7 +93,7 @@ module('Integration | Component | o-s-s/feature-card', function (hooks) { test('it throws when @description is missing', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::FeatureCard] The @description parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::FeatureCard] The @description parameter is mandatory'); }); await render(hbs``); @@ -101,7 +101,7 @@ module('Integration | Component | o-s-s/feature-card', function (hooks) { test('it throws when @image is missing', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [OSS::FeatureCard] The @image parameter is mandatory and must contain a src key' ); @@ -112,7 +112,7 @@ module('Integration | Component | o-s-s/feature-card', function (hooks) { test('it throws when @colorVariant is unknown', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [OSS::FeatureCard] @colorVariant must be one of: blue, violet, yellow' ); @@ -125,7 +125,7 @@ module('Integration | Component | o-s-s/feature-card', function (hooks) { test('it throws when @shadowVariant is unknown', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::FeatureCard] @shadowVariant must be one of: sm, lg'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::FeatureCard] @shadowVariant must be one of: sm, lg'); }); await render( diff --git a/tests/integration/components/o-s-s/feature-cards-container-test.ts b/tests/integration/components/o-s-s/feature-cards-container-test.ts index 00b25516c..673fefe23 100644 --- a/tests/integration/components/o-s-s/feature-cards-container-test.ts +++ b/tests/integration/components/o-s-s/feature-cards-container-test.ts @@ -128,7 +128,10 @@ module('Integration | Component | o-s-s/feature-cards-container', function (hook module('Error management', () => { test('it throws when @cards is missing', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::FeatureCardsContainer] The @cards parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [OSS::FeatureCardsContainer] The @cards parameter is mandatory' + ); }); await render(hbs``); @@ -138,7 +141,7 @@ module('Integration | Component | o-s-s/feature-cards-container', function (hook this.cards = []; setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [OSS::FeatureCardsContainer] @cards must contain between 1 and 3 cards' ); diff --git a/tests/integration/components/o-s-s/icon-test.ts b/tests/integration/components/o-s-s/icon-test.ts index 1214e8d39..a4061ecbd 100644 --- a/tests/integration/components/o-s-s/icon-test.ts +++ b/tests/integration/components/o-s-s/icon-test.ts @@ -47,7 +47,7 @@ module('Integration | Component | o-s-s/icon', function (hooks) { test('it throws an error if icon argument is missing', async function (assert) { setupOnerror((error: Error) => { - assert.equal(error.message, 'Assertion Failed: [component][OSS::Icon] The @icon parameter is mandatory'); + assert.strictEqual(error.message, 'Assertion Failed: [component][OSS::Icon] The @icon parameter is mandatory'); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/infinite-select-test.js b/tests/integration/components/o-s-s/infinite-select-test.js index 7d6ab6e93..9cad6ecaa 100644 --- a/tests/integration/components/o-s-s/infinite-select-test.js +++ b/tests/integration/components/o-s-s/infinite-select-test.js @@ -62,7 +62,7 @@ module('Integration | Component | o-s-s/infinite-select', function (hooks) { module('with onSearch hook', function () { test('it calls the onSearch hook with the typed keyword', async function (assert) { this.onSearch = (keyword) => { - assert.equal(keyword, 'b', 'Enters the onSearch hook'); + assert.strictEqual(keyword, 'b', 'Enters the onSearch hook'); }; this.onSelect = () => {}; @@ -99,7 +99,7 @@ module('Integration | Component | o-s-s/infinite-select', function (hooks) { test('it calls the onSelect hook with the clicked item', async function (assert) { this.items = FAKE_DATA; this.onSelect = (item) => { - assert.equal(item.name, 'Batman'); + assert.strictEqual(item.name, 'Batman'); }; await render( @@ -282,7 +282,7 @@ module('Integration | Component | o-s-s/infinite-select', function (hooks) { this.onSearch = () => {}; }); - module('If keyboard is disabled', function () { + module('If keyboard is disabled', function (hooks) { hooks.beforeEach(function () { this.enableKeyboard = false; }); @@ -501,7 +501,7 @@ module('Integration | Component | o-s-s/infinite-select', function (hooks) { module('On item selection, if onSelect is not passed', function () { test('it should throw an error', async function (assert) { setupOnerror((err) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::InfiniteSelect] `onSelect` action is mandatory' ); @@ -514,7 +514,7 @@ module('Integration | Component | o-s-s/infinite-select', function (hooks) { module('When the search is enabled, if no onSearch hook has been passed', function () { test('should throw an error', async function (assert) { setupOnerror((err) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::InfiniteSelect] Search is enabled without an `onSearch` action being passed' ); diff --git a/tests/integration/components/o-s-s/infinite-select/option-test.ts b/tests/integration/components/o-s-s/infinite-select/option-test.ts index 33ddaa14e..7e65e8e73 100644 --- a/tests/integration/components/o-s-s/infinite-select/option-test.ts +++ b/tests/integration/components/o-s-s/infinite-select/option-test.ts @@ -524,14 +524,17 @@ module('Integration | Component | o-s-s/infinite-select/option', function (hooks module('for errors management', () => { test('The component throws an error if the title parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::InfiniteSelect::Option] @title is required'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::InfiniteSelect::Option] @title is required' + ); }); await render(hbs``); }); test('The component throws an error if the onSelect function parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::InfiniteSelect::Option] The parameter @onSelect of type function is mandatory' ); diff --git a/tests/integration/components/o-s-s/input-group-test.ts b/tests/integration/components/o-s-s/input-group-test.ts index a59734b86..8141e7192 100644 --- a/tests/integration/components/o-s-s/input-group-test.ts +++ b/tests/integration/components/o-s-s/input-group-test.ts @@ -21,7 +21,7 @@ module('Integration | Component | o-s-s/input-group', function (hooks) { assert.dom('.oss-input-group-row-suffix').hasText('@domain.com'); }); - test('Passing the @suffix parameter displays the input suffix', async function (assert) { + test('Passing both the @prefix and @suffix parameters displays them', async function (assert) { await render(hbs``); assert.dom('.oss-input-group-row-prefix').hasText('email'); assert.dom('.oss-input-group-row-suffix').hasText('@domain.com'); @@ -51,7 +51,7 @@ module('Integration | Component | o-s-s/input-group', function (hooks) { test('it fails if no prefix or suffix parameters are passed', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::InputGroup] No @prefix or @suffix parameter were passed. If you are not going to use any, you should use an OSS::InputContainer.' ); diff --git a/tests/integration/components/o-s-s/layout/sidebar-test.ts b/tests/integration/components/o-s-s/layout/sidebar-test.ts index e29b07f8e..0de15e131 100644 --- a/tests/integration/components/o-s-s/layout/sidebar-test.ts +++ b/tests/integration/components/o-s-s/layout/sidebar-test.ts @@ -147,12 +147,12 @@ module('Integration | Component | o-s-s/layout/sidebar', function (hooks) { await click('[data-control-name="sidebar-expanded-state-toggle"]'); assert.dom('.oss-sidebar-container').doesNotHaveClass('oss-sidebar-container--expanded'); - assert.equal(window.localStorage.getItem('_upf.oss-layout-sidebar-expanded'), 'false'); + assert.strictEqual(window.localStorage.getItem('_upf.oss-layout-sidebar-expanded'), 'false'); await click('[data-control-name="sidebar-expanded-state-toggle"]'); assert.dom('.oss-sidebar-container').hasClass('oss-sidebar-container--expanded'); - assert.equal(window.localStorage.getItem('_upf.oss-layout-sidebar-expanded'), 'true'); + assert.strictEqual(window.localStorage.getItem('_upf.oss-layout-sidebar-expanded'), 'true'); }); }); diff --git a/tests/integration/components/o-s-s/layout/sidebar/item-test.ts b/tests/integration/components/o-s-s/layout/sidebar/item-test.ts index 0343470c2..3a49e1052 100644 --- a/tests/integration/components/o-s-s/layout/sidebar/item-test.ts +++ b/tests/integration/components/o-s-s/layout/sidebar/item-test.ts @@ -82,9 +82,9 @@ module('Integration | Component | oss/layout/sidebar/item', function (hooks) { hbs`` ); - assert.equal(router.currentRouteName, null); + assert.strictEqual(router.currentRouteName, null); await click('.oss-sidebar-item'); - assert.equal(router.currentRouteName, 'index'); + assert.strictEqual(router.currentRouteName, 'index'); }); test('When locked is true lockedAction is triggered', async function (assert) { @@ -116,8 +116,8 @@ module('Integration | Component | oss/layout/sidebar/item', function (hooks) { test('passing data-control-name works', async function (assert) { await render(hbs``); - let inputWrapper: Element | null = find('.oss-sidebar-item'); - assert.equal(inputWrapper?.getAttribute('data-control-name'), 'layout-sidebar'); + const inputWrapper: Element | null = find('.oss-sidebar-item'); + assert.strictEqual(inputWrapper?.getAttribute('data-control-name'), 'layout-sidebar'); }); }); }); diff --git a/tests/integration/components/o-s-s/link-test.ts b/tests/integration/components/o-s-s/link-test.ts index 0902407d9..353eaf67d 100644 --- a/tests/integration/components/o-s-s/link-test.ts +++ b/tests/integration/components/o-s-s/link-test.ts @@ -29,7 +29,7 @@ module('Integration | Component | o-s-s/link', function (hooks) { }); test('it opens link with href and target', async function (assert: Assert) { - let windowOpenStub = sinon.stub(window, 'open'); + const windowOpenStub = sinon.stub(window, 'open'); await render(hbs` `); @@ -53,7 +53,7 @@ module('Integration | Component | o-s-s/link', function (hooks) { test('it fails if no label nor icon argument are present', async function (assert: Assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Link] You must pass either a @label or an @icon argument.' ); diff --git a/tests/integration/components/o-s-s/marketing/banner-test.ts b/tests/integration/components/o-s-s/marketing/banner-test.ts index 71fbdc2ec..5ec39091e 100644 --- a/tests/integration/components/o-s-s/marketing/banner-test.ts +++ b/tests/integration/components/o-s-s/marketing/banner-test.ts @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; -import { render, settled, setupOnerror } from '@ember/test-helpers'; +import { render, setupOnerror } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; import { setupIntl } from 'ember-intl/test-support'; @@ -102,13 +102,13 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { test('it renders it', async function (assert) { await render(hbs``); const element = document.querySelector('.upf-marketing-banner__container') as HTMLElement; - assert.equal(getComputedStyle(element, ':before').display, 'flex'); + assert.strictEqual(getComputedStyle(element, ':before').display, 'flex'); }); test('it sets the correct value for --background-grid-display CSS variable', async function (assert) { await render(hbs``); const element = document.querySelector('.upf-marketing-banner') as HTMLElement; - assert.equal(element.style.getPropertyValue('--background-grid-display'), 'flex'); + assert.strictEqual(element.style.getPropertyValue('--background-grid-display'), 'flex'); }); }); @@ -121,7 +121,7 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { hbs`` ); const element = document.querySelector('.upf-marketing-banner__container') as HTMLElement; - assert.equal(getComputedStyle(element, ':before').display, 'none'); + assert.strictEqual(getComputedStyle(element, ':before').display, 'none'); }); test('it sets the correct value for --background-grid-display CSS variable', async function (assert) { @@ -132,7 +132,7 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { hbs`` ); const element = document.querySelector('.upf-marketing-banner') as HTMLElement; - assert.equal(element.style.getPropertyValue('--background-grid-display'), 'none'); + assert.strictEqual(element.style.getPropertyValue('--background-grid-display'), 'none'); }); }); @@ -145,7 +145,7 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { hbs`` ); const element = document.querySelector('.upf-marketing-banner__container') as HTMLElement; - assert.equal(getComputedStyle(element, ':before').display, 'flex'); + assert.strictEqual(getComputedStyle(element, ':before').display, 'flex'); }); test('it sets the correct value for --background-grid-display CSS variable', async function (assert) { @@ -156,7 +156,7 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { hbs`` ); const element = document.querySelector('.upf-marketing-banner') as HTMLElement; - assert.equal(element.style.getPropertyValue('--background-grid-display'), 'flex'); + assert.strictEqual(element.style.getPropertyValue('--background-grid-display'), 'flex'); }); }); }); @@ -174,7 +174,7 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { ); const element = document.querySelector('.upf-marketing-banner') as HTMLElement; - assert.equal(element.style.getPropertyValue('--illustration-display'), 'flex'); + assert.strictEqual(element.style.getPropertyValue('--illustration-display'), 'flex'); assert.dom('.upf-marketing-banner__illustration').hasStyle({ display: 'flex' }); assert.dom('.upf-marketing-banner__illustration img').hasAttribute('src', ILLUSTRATION_SRC); }); @@ -206,7 +206,7 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { ); const element = document.querySelector('.upf-marketing-banner') as HTMLElement; - assert.equal(element.style.getPropertyValue('--illustration-display'), 'none'); + assert.strictEqual(element.style.getPropertyValue('--illustration-display'), 'none'); assert.dom('.upf-marketing-banner__illustration').hasStyle({ display: 'none' }); }); }); @@ -229,14 +229,14 @@ module('Integration | Component | o-s-s/marketing/banner', function (hooks) { module('Error management', function () { test('It throws an error if @title is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Marketing::Banner] @title is required'); + assert.strictEqual(err.message, 'Assertion Failed: [component][OSS::Marketing::Banner] @title is required'); }); await render(hbs``); }); test('It throws an error if @subtitle is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Marketing::Banner] @subtitle is required'); + assert.strictEqual(err.message, 'Assertion Failed: [component][OSS::Marketing::Banner] @subtitle is required'); }); await render(hbs``); }); diff --git a/tests/integration/components/o-s-s/modal-dialog-test.ts b/tests/integration/components/o-s-s/modal-dialog-test.ts index 23568ce00..436a719ba 100644 --- a/tests/integration/components/o-s-s/modal-dialog-test.ts +++ b/tests/integration/components/o-s-s/modal-dialog-test.ts @@ -240,7 +240,10 @@ module('Integration | Component | o-s-s/modal-dialog', function (hooks) { module('Error management', function () { test('The component throws an error if the title parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::ModalDialog] The title parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::ModalDialog] The title parameter is mandatory' + ); }); await render(hbs``); @@ -248,7 +251,10 @@ module('Integration | Component | o-s-s/modal-dialog', function (hooks) { test('The component throws an error if the close parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::ModalDialog] The close function is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::ModalDialog] The close function is mandatory' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/mode-switch-test.ts b/tests/integration/components/o-s-s/mode-switch-test.ts index e3282c46b..bfc7734ec 100644 --- a/tests/integration/components/o-s-s/mode-switch-test.ts +++ b/tests/integration/components/o-s-s/mode-switch-test.ts @@ -38,7 +38,7 @@ module('Integration | Component | o-s-s/mode-switch', function (hooks) { assert.dom('[data-control-name="option2-input"]').isNotChecked(); }); - module('selected option parameter', function (hooks) { + module('selected option parameter', function () { test('it renders with option 1 as selected parameter', async function (assert) { await render(hbs``); diff --git a/tests/integration/components/o-s-s/nav-tab-test.ts b/tests/integration/components/o-s-s/nav-tab-test.ts index febcfbaa1..695a10bb9 100644 --- a/tests/integration/components/o-s-s/nav-tab-test.ts +++ b/tests/integration/components/o-s-s/nav-tab-test.ts @@ -115,7 +115,7 @@ module('Integration | Component | o-s-s/nav-tab', function (hooks) { module('Error management', function () { test('It throws an error if @onSelection is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::NavTab] The parameter @onSelection of type function is mandatory' ); @@ -125,12 +125,18 @@ module('Integration | Component | o-s-s/nav-tab', function (hooks) { test('It throws an error if @tabArray is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::NavTab] The parameter @tabArray is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::NavTab] The parameter @tabArray is mandatory' + ); }); await render(hbs``); setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::NavTab] The parameter @tabArray is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::NavTab] The parameter @tabArray is mandatory' + ); }); await render(hbs``); }); @@ -138,7 +144,7 @@ module('Integration | Component | o-s-s/nav-tab', function (hooks) { test('It throws an error if @label and @icon is missing for any element in @tabArray', async function (assert) { this.tabArray.push({ label: '', key: 'foo', icon: '' }); setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::NavTab] The @label or @icon parameter is mandatory for each element in @tabArray' ); diff --git a/tests/integration/components/o-s-s/number-input-test.ts b/tests/integration/components/o-s-s/number-input-test.ts index 56a6b1317..0be7bff53 100644 --- a/tests/integration/components/o-s-s/number-input-test.ts +++ b/tests/integration/components/o-s-s/number-input-test.ts @@ -62,7 +62,7 @@ module('Integration | Component | o-s-s/number-input', function (hooks) { test('Up arrow increases the value by the step', async function (assert) { await render(hbs``); assert.dom('.number-input input').hasValue('0'); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('.number-input input', 'keydown', 'ArrowUp', { code: 'ArrowUp' }); assert.dom('.number-input input').hasValue('1'); }); @@ -70,7 +70,7 @@ module('Integration | Component | o-s-s/number-input', function (hooks) { test('Right arrow increases the value by the step', async function (assert) { await render(hbs``); assert.dom('.number-input input').hasValue('0'); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('.number-input input', 'keydown', 'ArrowRight', { code: 'ArrowRight' }); assert.dom('.number-input input').hasValue('1'); }); @@ -100,7 +100,7 @@ module('Integration | Component | o-s-s/number-input', function (hooks) { test('Down arrow increases the value by the step', async function (assert) { await render(hbs``); assert.dom('.number-input input').hasValue('0'); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('.number-input input', 'keydown', 'ArrowDown', { code: 'ArrowDown' }); assert.dom('.number-input input').hasValue('-1'); }); @@ -108,7 +108,7 @@ module('Integration | Component | o-s-s/number-input', function (hooks) { test('Left arrow increases the value by the step', async function (assert) { await render(hbs``); assert.dom('.number-input input').hasValue('0'); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('.number-input input', 'keydown', 'ArrowLeft', { code: 'ArrowLeft' }); assert.dom('.number-input input').hasValue('-1'); }); diff --git a/tests/integration/components/o-s-s/onboarding-state-test.ts b/tests/integration/components/o-s-s/onboarding-state-test.ts index 558fb1385..9094f3bac 100644 --- a/tests/integration/components/o-s-s/onboarding-state-test.ts +++ b/tests/integration/components/o-s-s/onboarding-state-test.ts @@ -121,7 +121,7 @@ module('Integration | Component | o-s-s/onboarding-state', function (hooks) { module('Error management', () => { test('for title parameter, the component throws an error if the parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::OnboardingState] The @title parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::OnboardingState] The @title parameter is mandatory'); }); await render(hbs``); @@ -129,7 +129,10 @@ module('Integration | Component | o-s-s/onboarding-state', function (hooks) { test('for subtitle, the component throws an error if the parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::OnboardingState] The @subtitle parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [OSS::OnboardingState] The @subtitle parameter is mandatory' + ); }); await render(hbs``); @@ -137,7 +140,10 @@ module('Integration | Component | o-s-s/onboarding-state', function (hooks) { test('for imageUrl, the component throws an error if the parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::OnboardingState] The @imageUrl parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [OSS::OnboardingState] The @imageUrl parameter is mandatory' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/password-input-test.ts b/tests/integration/components/o-s-s/password-input-test.ts index ae816ff68..9889e766f 100644 --- a/tests/integration/components/o-s-s/password-input-test.ts +++ b/tests/integration/components/o-s-s/password-input-test.ts @@ -53,7 +53,7 @@ module('Integration | Component | o-s-s/password-input', function (hooks) { test('If the password regex is matched, and the @validates method is passed, then the status of the validation is returned', async function (assert) { this.value = '1Aaaaaa'; this.validates = (x: boolean) => { - assert.equal(x, true); + assert.true(x); }; await render(hbs``); await typeIn('input', 'a'); @@ -62,7 +62,7 @@ module('Integration | Component | o-s-s/password-input', function (hooks) { test('If the password regex isnt matched, and the @validates method is passed, then the status of the validation is returned', async function (assert) { this.value = '1A'; this.validates = (x: boolean) => { - assert.equal(x, false); + assert.false(x); }; await render(hbs``); await typeIn('input', 'a'); @@ -212,7 +212,10 @@ module('Integration | Component | o-s-s/password-input', function (hooks) { test('it throws an error when the @value parameter is missing', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::PasswordInput] The @value parameter is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::PasswordInput] The @value parameter is mandatory' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/phone-number-input-test.ts b/tests/integration/components/o-s-s/phone-number-input-test.ts index a41c46636..997d1c5bd 100644 --- a/tests/integration/components/o-s-s/phone-number-input-test.ts +++ b/tests/integration/components/o-s-s/phone-number-input-test.ts @@ -64,7 +64,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { assert.dom('.upf-infinite-select').exists(); await typeIn('.upf-infinite-select input', 'fran'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 1); + assert.strictEqual(clickableRows.length, 1); assert.dom(clickableRows[0]).hasText('France (+33)'); }); @@ -75,7 +75,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { assert.dom('.upf-infinite-select').exists(); await typeIn('.upf-infinite-select input', '33'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 2); + assert.strictEqual(clickableRows.length, 2); assert.dom(clickableRows[0]).hasText('France (+33)'); }); @@ -118,7 +118,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { ); await typeIn('input', '8'); assert.ok(this.onChange.calledOnce); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('input', 'keydown', 'A', { code: 'a' }); assert.ok(this.onValidation.calledWithExactly(true)); assert.dom('input').hasValue('8'); @@ -179,7 +179,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { hbs`` ); assert.dom('input').hasValue('1234567890'); - let input = document.querySelector('input.ember-text-field') as HTMLInputElement; + const input = document.querySelector('input.ember-text-field') as HTMLInputElement; input.setSelectionRange(4, 6); await triggerEvent('input', 'paste', { clipboardData: { @@ -226,7 +226,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { module('Error management', function () { test('It throws an error if @prefix is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::PhoneNumberInput] The parameter @prefix of type string is mandatory' ); @@ -238,7 +238,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { test('It throws an error if @number is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::PhoneNumberInput] The parameter @number of type string is mandatory' ); @@ -250,7 +250,7 @@ module('Integration | Component | o-s-s/phone-number-input', function (hooks) { test('It throws an error if @onChange is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::PhoneNumberInput] The parameter @onChange of type function is mandatory' ); diff --git a/tests/integration/components/o-s-s/pill-test.ts b/tests/integration/components/o-s-s/pill-test.ts index 126a1b1c6..dd8017a52 100644 --- a/tests/integration/components/o-s-s/pill-test.ts +++ b/tests/integration/components/o-s-s/pill-test.ts @@ -39,7 +39,7 @@ module('Integration | Component | o-s-s/pill', function (hooks) { module('Error management', function () { test('it fails if @label is missing', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Pill] You must pass a @label argument.'); + assert.strictEqual(err.message, 'Assertion Failed: [component][OSS::Pill] You must pass a @label argument.'); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/power-select-test.ts b/tests/integration/components/o-s-s/power-select-test.ts index f1c68020e..e85d2ab49 100644 --- a/tests/integration/components/o-s-s/power-select-test.ts +++ b/tests/integration/components/o-s-s/power-select-test.ts @@ -2,7 +2,7 @@ import { hbs } from 'ember-cli-htmlbars'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupIntl } from 'ember-intl/test-support'; -import { render, setupOnerror, findAll, click, typeIn, scrollTo, type TestContext } from '@ember/test-helpers'; +import { render, setupOnerror, findAll, click, typeIn, scrollTo } from '@ember/test-helpers'; import sinon from 'sinon'; module('Integration | Component | o-s-s/power-select', function (hooks) { @@ -418,7 +418,7 @@ module('Integration | Component | o-s-s/power-select', function (hooks) { module('Error management', () => { test('without selected-item named block', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::PowerSelect] You must pass selected-item named block' ); @@ -431,7 +431,7 @@ module('Integration | Component | o-s-s/power-select', function (hooks) { test('without option-item named block', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::PowerSelect] You must pass option-item named block' ); diff --git a/tests/integration/components/o-s-s/progress-bar-test.ts b/tests/integration/components/o-s-s/progress-bar-test.ts index 4633887de..a69532276 100644 --- a/tests/integration/components/o-s-s/progress-bar-test.ts +++ b/tests/integration/components/o-s-s/progress-bar-test.ts @@ -47,7 +47,7 @@ module('Integration | Component | o-s-s/progress-bar', function (hooks) { assert.dom('.oss-progress-bar').exists(); const innerBar = this.element.querySelector('.oss-progress-bar__inner') as Element; - assert.equal(innerBar.clientHeight, 1, 'Element has the correct height'); + assert.strictEqual(innerBar.clientHeight, 1, 'Element has the correct height'); }); test('if the value is "sm", the progress bar height is the proper height', async function (assert) { @@ -55,7 +55,7 @@ module('Integration | Component | o-s-s/progress-bar', function (hooks) { assert.dom('.oss-progress-bar').exists(); const innerBar = this.element.querySelector('.oss-progress-bar__inner') as Element; - assert.equal(innerBar.clientHeight, 4, 'Element has the correct height'); + assert.strictEqual(innerBar.clientHeight, 4, 'Element has the correct height'); }); test('if the value is "lg", the progress bar height is the proper height', async function (assert) { @@ -63,7 +63,7 @@ module('Integration | Component | o-s-s/progress-bar', function (hooks) { assert.dom('.oss-progress-bar').exists(); const innerBar = this.element.querySelector('.oss-progress-bar__inner') as Element; - assert.equal(innerBar.clientHeight, 10, 'Element has the correct height'); + assert.strictEqual(innerBar.clientHeight, 10, 'Element has the correct height'); }); test('if the value is unspecified, the progress bar height is the proper height', async function (assert) { @@ -71,7 +71,7 @@ module('Integration | Component | o-s-s/progress-bar', function (hooks) { assert.dom('.oss-progress-bar').exists(); const innerBar = this.element.querySelector('.oss-progress-bar__inner') as Element; - assert.equal(innerBar.clientHeight, 10, 'Element has the correct height'); + assert.strictEqual(innerBar.clientHeight, 10, 'Element has the correct height'); }); }); @@ -218,7 +218,7 @@ module('Integration | Component | o-s-s/progress-bar', function (hooks) { test('if the value is higher than 100, it throws an error', async function (assert) { setupOnerror((error: Error) => { - assert.equal( + assert.strictEqual( error.message, 'Assertion Failed: [component][OSS::ProgressBar] The sum of all skins values must be between 0 and 100' ); diff --git a/tests/integration/components/o-s-s/scrollable-panel-test.ts b/tests/integration/components/o-s-s/scrollable-panel-test.ts index b7ded590e..30eb48dc5 100644 --- a/tests/integration/components/o-s-s/scrollable-panel-test.ts +++ b/tests/integration/components/o-s-s/scrollable-panel-test.ts @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; -import { render, scrollTo, settled, waitFor } from '@ember/test-helpers'; +import { render, scrollTo, waitFor } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; import sinon from 'sinon'; diff --git a/tests/integration/components/o-s-s/select-test.ts b/tests/integration/components/o-s-s/select-test.ts index d69dc4747..6082d60c0 100644 --- a/tests/integration/components/o-s-s/select-test.ts +++ b/tests/integration/components/o-s-s/select-test.ts @@ -315,11 +315,9 @@ module('Integration | Component | o-s-s/select', function (hooks) { }); test('the search is displayed if the @onSearch arg is provided', async function (assert) { - assert.expect(4); - this.value = this.items[0]; this.onSearch = (keyword: string) => { - assert.equal(keyword, 'F'); + assert.strictEqual(keyword, 'F'); this.set( 'items', this.items.filter( @@ -570,7 +568,7 @@ module('Integration | Component | o-s-s/select', function (hooks) { module('Error management', function () { test('it throws an error if no @onChange arg is passed', async function (assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Select] The parameter @onChange of type function is mandatory' ); @@ -581,7 +579,7 @@ module('Integration | Component | o-s-s/select', function (hooks) { test('it throws an error if the component is invoked with no option named blocked', async function (assert) { setupOnerror((err: Error) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::Select] You must pass option named block'); + assert.strictEqual(err.message, 'Assertion Failed: [component][OSS::Select] You must pass option named block'); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/skeleton-test.ts b/tests/integration/components/o-s-s/skeleton-test.ts index 044f87486..5f5cc7549 100644 --- a/tests/integration/components/o-s-s/skeleton-test.ts +++ b/tests/integration/components/o-s-s/skeleton-test.ts @@ -75,9 +75,9 @@ module('Integration | Component | o-s-s/skeleton', function (hooks) { test('Default has one skeleton effect', async function (assert) { await render(hbs``); - let items = findAll('.upf-skeleton-effect'); + const items = findAll('.upf-skeleton-effect'); - assert.ok(items.length === 1); + assert.strictEqual(items.length, 1); }); test('The content has multiple skeleton effect', async function (assert) { @@ -85,9 +85,9 @@ module('Integration | Component | o-s-s/skeleton', function (hooks) { await render(hbs``); - let items = findAll('.upf-skeleton-effect'); + const items = findAll('.upf-skeleton-effect'); - assert.ok(items.length === 4); + assert.strictEqual(items.length, 4); }); }); @@ -100,17 +100,18 @@ module('Integration | Component | o-s-s/skeleton', function (hooks) { test('Default randomize is false', async function (assert) { await render(hbs``); - let item = find('.upf-skeleton-effect') as HTMLElement; + const item = find('.upf-skeleton-effect') as HTMLElement; - assert.ok(this.width == item?.offsetWidth); + assert.strictEqual(this.width, item?.offsetWidth); }); test('Randomize width is within a 15% range', async function (assert) { await render(hbs``); - let item = find('.upf-skeleton-effect') as HTMLElement; + const item = find('.upf-skeleton-effect') as HTMLElement; - assert.ok(item.offsetWidth <= 230 && item.offsetWidth >= 170); + assert.ok(item.offsetWidth <= 230); + assert.ok(item.offsetWidth >= 170); }); }); @@ -134,15 +135,15 @@ module('Integration | Component | o-s-s/skeleton', function (hooks) { test('passing data-control-name works', async function (assert) { await render(hbs``); - let inputWrapper: Element | null = find('.upf-skeleton-effect'); - assert.equal(inputWrapper?.getAttribute('data-control-name'), 'layout-sidebar'); + const inputWrapper: Element | null = find('.upf-skeleton-effect'); + assert.strictEqual(inputWrapper?.getAttribute('data-control-name'), 'layout-sidebar'); }); }); module('Error management', () => { test('it throws an error if @direct is provided and does not match required values', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Skeleton] The @direction argument should be a value of row,column,col' ); diff --git a/tests/integration/components/o-s-s/slider-test.ts b/tests/integration/components/o-s-s/slider-test.ts index 8bf45a5a0..17707f536 100644 --- a/tests/integration/components/o-s-s/slider-test.ts +++ b/tests/integration/components/o-s-s/slider-test.ts @@ -133,7 +133,7 @@ module('Integration | Component | o-s-s/slider', function (hooks) { assert.ok(this.onChange.calledWith(20)); }); - test("when the min is defined, the user can't set value under the minimum", async function (assert) { + test("when the max is defined, the user can't set value above the maximum", async function (assert) { this.inputOptions = { max: 20 }; await render( hbs`` @@ -224,7 +224,7 @@ module('Integration | Component | o-s-s/slider', function (hooks) { await fillIn('.oss-slider__number-input input', '30'); - assert.equal(this.min, this.value); + assert.strictEqual(Number(this.value), this.min); const element = this.element.querySelector('.oss-slider__range'); assert.strictEqual(element.style.getPropertyValue('--range-percentage'), '0%'); }); diff --git a/tests/integration/components/o-s-s/smart/button-test.ts b/tests/integration/components/o-s-s/smart/button-test.ts index 35340a5c8..d58be405f 100644 --- a/tests/integration/components/o-s-s/smart/button-test.ts +++ b/tests/integration/components/o-s-s/smart/button-test.ts @@ -1,9 +1,7 @@ import { hbs } from 'ember-cli-htmlbars'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; -import { render, click, setupOnerror, waitUntil } from '@ember/test-helpers'; - -import sinon from 'sinon'; +import { render, setupOnerror } from '@ember/test-helpers'; module('Integration | Component | o-s-s/smart/button', function (hooks) { setupRenderingTest(hooks); @@ -33,7 +31,9 @@ module('Integration | Component | o-s-s/smart/button', function (hooks) { }); test('it renders the iconUrl and label when present', async function (assert) { - await render(hbs``); + await render( + hbs`` + ); assert.dom('.upf-smart-btn img').hasAttribute('src', '/@upfluence/oss-components/assets/images/no-image.svg'); assert.dom('.upf-smart-btn span').hasText('Label'); @@ -150,7 +150,7 @@ module('Integration | Component | o-s-s/smart/button', function (hooks) { module('Error management', function () { test('it fails if @label, @icon and @iconUrl are missing', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::Button] You must pass either a @label, an @icon or an @iconUrl argument.' ); diff --git a/tests/integration/components/o-s-s/smart/immersive/currency-input-test.ts b/tests/integration/components/o-s-s/smart/immersive/currency-input-test.ts index 9f5fd9e16..f6a3b622f 100644 --- a/tests/integration/components/o-s-s/smart/immersive/currency-input-test.ts +++ b/tests/integration/components/o-s-s/smart/immersive/currency-input-test.ts @@ -66,7 +66,7 @@ module('Integration | Component | o-s-s/smart/immersive/currency-input', functio assert.dom('.upf-infinite-select').exists(); await typeIn('.upf-infinite-select input', 'usd'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 1); + assert.strictEqual(clickableRows.length, 1); assert.dom(clickableRows[0]).hasText('$ USD'); }); @@ -76,7 +76,7 @@ module('Integration | Component | o-s-s/smart/immersive/currency-input', functio assert.dom('.upf-infinite-select').exists(); await typeIn('.upf-infinite-select input', '€'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 1); + assert.strictEqual(clickableRows.length, 1); assert.dom(clickableRows[0]).hasText('€ EUR'); }); @@ -99,7 +99,7 @@ module('Integration | Component | o-s-s/smart/immersive/currency-input', functio @allowedCurrencies={{this.allowedCurrencies}} />`); await click('.currency-selector'); const clickableRows = findAll('.upf-infinite-select__item'); - assert.equal(clickableRows.length, 2); + assert.strictEqual(clickableRows.length, 2); }); module('Selected currency highlighting', () => { @@ -148,7 +148,7 @@ module('Integration | Component | o-s-s/smart/immersive/currency-input', functio await render(hbs``); await typeIn('input', '8'); assert.ok(this.onChange.calledOnce); - // @ts-ignore + // @ts-expect-error the modifiers argument is missing from the helper typings await triggerKeyEvent('input', 'keydown', 'A', { code: 'a' }); assert.dom('input').hasValue('8'); }); @@ -193,7 +193,7 @@ module('Integration | Component | o-s-s/smart/immersive/currency-input', functio test('When selection is applied, it replaces the selection', async function (assert) { await render(hbs``); assert.dom('input').hasValue('1234567890'); - let input = document.querySelector('input.ember-text-field') as HTMLInputElement; + const input = document.querySelector('input.ember-text-field') as HTMLInputElement; input.setSelectionRange(4, 6); await triggerEvent('input', 'paste', { clipboardData: { @@ -233,7 +233,7 @@ module('Integration | Component | o-s-s/smart/immersive/currency-input', functio test('It throws an error if @onChange is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::Immersive::CurrencyInput] The parameter @onChange of type function is mandatory' ); diff --git a/tests/integration/components/o-s-s/smart/immersive/input-test.ts b/tests/integration/components/o-s-s/smart/immersive/input-test.ts index aa9cda94f..f96c4df9e 100644 --- a/tests/integration/components/o-s-s/smart/immersive/input-test.ts +++ b/tests/integration/components/o-s-s/smart/immersive/input-test.ts @@ -89,16 +89,16 @@ module('Integration | Component | o-s-s/smart/immersive/input', function (hooks) await renderComponent(); const element = document.querySelector('.smart-immersive-input-container') as HTMLElement; - assert.equal(element.offsetWidth, 52); + assert.strictEqual(element.offsetWidth, 52); }); test('When input has value or placeholder, the size is based on input content', async function (assert) { await renderComponent(); const element = document.querySelector('.smart-immersive-input-container') as HTMLElement; - assert.equal(element.offsetWidth, 104); + assert.strictEqual(element.offsetWidth, 104); await typeIn('.smart-immersive-input-container input', 'more text'); - assert.equal(element.offsetWidth, 158); + assert.strictEqual(element.offsetWidth, 158); }); }); diff --git a/tests/integration/components/o-s-s/smart/immersive/logo-test.ts b/tests/integration/components/o-s-s/smart/immersive/logo-test.ts index eb4801bad..9c4d35fae 100644 --- a/tests/integration/components/o-s-s/smart/immersive/logo-test.ts +++ b/tests/integration/components/o-s-s/smart/immersive/logo-test.ts @@ -165,7 +165,7 @@ module('Integration | Component | o-s-s/smart/immersive/logo', function (hooks) this.icon = 'invalidFormat'; setupOnerror((error: Error) => { - assert.equal( + assert.strictEqual( error.message, `Assertion Failed: Invalid icon format "${this.icon}". Expected format is "iconName:colorName".` ); @@ -186,9 +186,7 @@ module('Integration | Component | o-s-s/smart/immersive/logo', function (hooks) />`); assert.dom('.smart-logo-image').exists('Fallback image container is rendered'); - assert - .dom('.smart-logo-image') - .hasAttribute('src', '/@upfluence/oss-components/assets/images/picture-frame.svg'); + assert.dom('.smart-logo-image').hasAttribute('src', '/@upfluence/oss-components/assets/images/picture-frame.svg'); }); module('@size', () => { diff --git a/tests/integration/components/o-s-s/smart/immersive/select-test.ts b/tests/integration/components/o-s-s/smart/immersive/select-test.ts index 47d74d973..d6a89af7b 100644 --- a/tests/integration/components/o-s-s/smart/immersive/select-test.ts +++ b/tests/integration/components/o-s-s/smart/immersive/select-test.ts @@ -29,7 +29,7 @@ module('Integration | Component | o-s-s/smart/immersive/select', function (hooks module('It renders', () => { test('When missing selected-item name block, it throws an error', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::Immersive::Select] You must pass selected-item named block' ); @@ -50,7 +50,7 @@ module('Integration | Component | o-s-s/smart/immersive/select', function (hooks test('With missing option-item name block, it throws an error', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::Immersive::Select] You must pass option-item named block' ); diff --git a/tests/integration/components/o-s-s/smart/input-test.ts b/tests/integration/components/o-s-s/smart/input-test.ts index 26573a4ff..daf8206c5 100644 --- a/tests/integration/components/o-s-s/smart/input-test.ts +++ b/tests/integration/components/o-s-s/smart/input-test.ts @@ -70,13 +70,13 @@ module('Integration | Component | o-s-s/smart/input', function (hooks) { test('Sets @placeholder correctly', async function (assert) { await renderComponentWithParams(); - let input = find('.upf-input'); + const input = find('.upf-input'); assert.strictEqual(input?.getAttribute('placeholder'), 'Type here'); }); test('Calls @onChange on input', async function (assert) { await renderComponentWithParams(); - let input = find('.upf-input'); + const input = find('.upf-input'); assert.ok(input, 'Input element should exist'); await typeIn(input as Element, 'X'); assert.ok(onValueChange.called); diff --git a/tests/integration/components/o-s-s/smart/number-input-test.ts b/tests/integration/components/o-s-s/smart/number-input-test.ts index 0e1c1b0f9..226499726 100644 --- a/tests/integration/components/o-s-s/smart/number-input-test.ts +++ b/tests/integration/components/o-s-s/smart/number-input-test.ts @@ -1,6 +1,6 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; -import { render, click, typeIn, find } from '@ember/test-helpers'; +import { render, click } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; import sinon from 'sinon'; @@ -157,7 +157,7 @@ module('Integration | Component | o-s-s/smart/number-input', function (hooks) { }); }); - module('State Priority', (hooks) => { + module('State Priority', () => { test('error state takes priority over filled state', async function (assert) { await render(hbs` `); - let items = findAll('.upf-smart-skeleton-effect'); + const items = findAll('.upf-smart-skeleton-effect'); - assert.ok(items.length === 1); + assert.strictEqual(items.length, 1); }); test('The content has multiple skeleton effect', async function (assert) { @@ -85,9 +85,9 @@ module('Integration | Component | o-s-s/smart/skeleton', function (hooks) { await render(hbs``); - let items = findAll('.upf-smart-skeleton-effect'); + const items = findAll('.upf-smart-skeleton-effect'); - assert.ok(items.length === 4); + assert.strictEqual(items.length, 4); }); }); @@ -100,17 +100,18 @@ module('Integration | Component | o-s-s/smart/skeleton', function (hooks) { test('Default randomize is falsy', async function (assert) { await render(hbs``); - let item = find('.upf-smart-skeleton-effect') as HTMLElement; + const item = find('.upf-smart-skeleton-effect') as HTMLElement; - assert.ok(this.width == item?.offsetWidth); + assert.strictEqual(this.width, item?.offsetWidth); }); test('Randomize width is within a 15% range', async function (assert) { await render(hbs``); - let item = find('.upf-smart-skeleton-effect') as HTMLElement; + const item = find('.upf-smart-skeleton-effect') as HTMLElement; - assert.ok(item.offsetWidth <= 230 && item.offsetWidth >= 170); + assert.ok(item.offsetWidth <= 230); + assert.ok(item.offsetWidth >= 170); }); }); @@ -136,15 +137,15 @@ module('Integration | Component | o-s-s/smart/skeleton', function (hooks) { test('Passing a data-control-name applies it to the component', async function (assert) { await render(hbs``); - let inputWrapper: Element | null = find('.upf-smart-skeleton-effect'); - assert.equal(inputWrapper?.getAttribute('data-control-name'), 'layout-sidebar'); + const inputWrapper: Element | null = find('.upf-smart-skeleton-effect'); + assert.strictEqual(inputWrapper?.getAttribute('data-control-name'), 'layout-sidebar'); }); }); module('Error management', () => { test('It throws an error if @direction is provided and does not match required values', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::Skeleton] The @direction argument should be a value of row,column,col' ); diff --git a/tests/integration/components/o-s-s/smart/text-area-test.ts b/tests/integration/components/o-s-s/smart/text-area-test.ts index 7019b8f68..5f4f008d5 100644 --- a/tests/integration/components/o-s-s/smart/text-area-test.ts +++ b/tests/integration/components/o-s-s/smart/text-area-test.ts @@ -47,7 +47,7 @@ module('Integration | Component | o-s-s/smart/text-area', function (hooks) { test('Default height', async function (assert) { await render(hbs``); - assert.equal(document.querySelector(this.textareaSelector).offsetHeight, 52); + assert.strictEqual(document.querySelector(this.textareaSelector).offsetHeight, 52); }); test('Row change height', async function (assert) { @@ -81,16 +81,16 @@ module('Integration | Component | o-s-s/smart/text-area', function (hooks) { test('passing data-control-name works', async function (assert) { await render(hbs``); - let inputWrapper: Element | null = document.querySelector('.oss-smart-text-area-container'); + const inputWrapper: Element | null = document.querySelector('.oss-smart-text-area-container'); - assert.equal(inputWrapper?.getAttribute('data-control-name'), 'description-input'); + assert.strictEqual(inputWrapper?.getAttribute('data-control-name'), 'description-input'); }); }); module('error management', () => { test('it throws an error if @resize is not a correct value', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::TextArea] The @resize parameter should be a value of resize' ); diff --git a/tests/integration/components/o-s-s/smart/toggle-buttons-test.ts b/tests/integration/components/o-s-s/smart/toggle-buttons-test.ts index 1291b5b87..c6be6ee3c 100644 --- a/tests/integration/components/o-s-s/smart/toggle-buttons-test.ts +++ b/tests/integration/components/o-s-s/smart/toggle-buttons-test.ts @@ -116,7 +116,7 @@ module('Integration | Component | o-s-s/smart/toggle-buttons', function (hooks) module('Error management', () => { test('it throws an error if @toggles is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::ToggleButtons] The @toggles parameter of type Toggle[] is mandatory' ); @@ -129,7 +129,7 @@ module('Integration | Component | o-s-s/smart/toggle-buttons', function (hooks) test('it throws an error if @onSelection is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::ToggleButtons] The @onSelection parameter of type function is mandatory' ); @@ -140,7 +140,7 @@ module('Integration | Component | o-s-s/smart/toggle-buttons', function (hooks) test('it throws an error if @selectedToggle is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::ToggleButtons] The @selectedToggle parameter of type string or null is mandatory' ); @@ -153,7 +153,7 @@ module('Integration | Component | o-s-s/smart/toggle-buttons', function (hooks) this.selectedToggle = 'toto'; setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Smart::ToggleButtons] The @selectedToggle parameter should be null or a value of toggles' ); diff --git a/tests/integration/components/o-s-s/social-post-badge-test.ts b/tests/integration/components/o-s-s/social-post-badge-test.ts index 00aa88404..09ad24ed1 100644 --- a/tests/integration/components/o-s-s/social-post-badge-test.ts +++ b/tests/integration/components/o-s-s/social-post-badge-test.ts @@ -122,7 +122,7 @@ module('Integration | Component | o-s-s/social-post-badge', function (hooks) { module('error management', () => { test('it throws an error if @selectedToggle is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::SocialPostBadge] The @postType parameter of type String is mandatory' ); @@ -136,7 +136,7 @@ module('Integration | Component | o-s-s/social-post-badge', function (hooks) { this.postType = 'toto'; setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::SocialPostBadge] The @postType parameter should be a value of SocialPostType' ); diff --git a/tests/integration/components/o-s-s/split-modal-test.ts b/tests/integration/components/o-s-s/split-modal-test.ts index 529f2d04f..98baec221 100644 --- a/tests/integration/components/o-s-s/split-modal-test.ts +++ b/tests/integration/components/o-s-s/split-modal-test.ts @@ -90,7 +90,10 @@ module('Integration | Component | o-s-s/split-modal', function (hooks) { module('Error management', function () { test('The component throws an error if the close parameter is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::SplitModal] The close function is mandatory'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::SplitModal] The close function is mandatory' + ); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/stack-container-test.ts b/tests/integration/components/o-s-s/stack-container-test.ts index 7b0aae875..6d7de5e47 100644 --- a/tests/integration/components/o-s-s/stack-container-test.ts +++ b/tests/integration/components/o-s-s/stack-container-test.ts @@ -74,11 +74,8 @@ module('Integration | Component | o-s-s/stack-container', function (hooks) { const subElements = document.querySelectorAll('.oss-stack-container > *'); subElements.forEach((child, index) => { - if (index < subElements.length - 1) { - assert.strictEqual((child as HTMLElement).style.marginRight, '-10px'); - } else { - assert.strictEqual((child as HTMLElement).style.marginRight, ''); - } + const expectedMargin = index < subElements.length - 1 ? '-10px' : ''; + assert.strictEqual((child as HTMLElement).style.marginRight, expectedMargin); }); }); @@ -87,11 +84,12 @@ module('Integration | Component | o-s-s/stack-container', function (hooks) { const subElements = document.querySelectorAll('.oss-stack-container > *'); subElements.forEach((child, index) => { - if (index < subElements.length - 1) { - assert.strictEqual((child as HTMLElement).style.marginRight, '-6px', 'Default margin is applied'); - } else { - assert.strictEqual((child as HTMLElement).style.marginRight, '', 'No margin for the last child'); - } + const isLastChild = index === subElements.length - 1; + assert.strictEqual( + (child as HTMLElement).style.marginRight, + isLastChild ? '' : '-6px', + isLastChild ? 'No margin for the last child' : 'Default margin is applied' + ); }); }); @@ -102,11 +100,12 @@ module('Integration | Component | o-s-s/stack-container', function (hooks) { const subElements = document.querySelectorAll('.oss-stack-container > *'); subElements.forEach((child, index) => { - if (index < subElements.length - 1) { - assert.strictEqual((child as HTMLElement).style.marginRight, '-20px', 'Margin is negative'); - } else { - assert.strictEqual((child as HTMLElement).style.marginRight, '', 'No margin for the last child'); - } + const isLastChild = index === subElements.length - 1; + assert.strictEqual( + (child as HTMLElement).style.marginRight, + isLastChild ? '' : '-20px', + isLastChild ? 'No margin for the last child' : 'Margin is negative' + ); }); }); }); diff --git a/tests/integration/components/o-s-s/star-rating-test.ts b/tests/integration/components/o-s-s/star-rating-test.ts index 5d680827e..3c0cd7e79 100644 --- a/tests/integration/components/o-s-s/star-rating-test.ts +++ b/tests/integration/components/o-s-s/star-rating-test.ts @@ -47,7 +47,7 @@ module('Integration | Component | o-s-s/star-rating', function (hooks) { module('Error management', function () { test('failing to pass @rating throws an error', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::StarRating] @rating argument is mandatory and must be a number' ); @@ -58,7 +58,7 @@ module('Integration | Component | o-s-s/star-rating', function (hooks) { test('failing to pass @totalStart throws an error', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::StarRating] @totalStars argument is mandatory and must be a number' ); diff --git a/tests/integration/components/o-s-s/tag-test.ts b/tests/integration/components/o-s-s/tag-test.ts index 5a63afe32..c2b0280e0 100644 --- a/tests/integration/components/o-s-s/tag-test.ts +++ b/tests/integration/components/o-s-s/tag-test.ts @@ -106,7 +106,7 @@ module('Integration | Component | o-s-s/tag', function (hooks) { test('it fails if @label and @icon are missing', async function (assert) { setupOnerror((err: { message: string }) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::Tag] You must pass either a @label or an @icon argument.' ); diff --git a/tests/integration/components/o-s-s/text-area-test.ts b/tests/integration/components/o-s-s/text-area-test.ts index 6c75bf464..bf499ba45 100644 --- a/tests/integration/components/o-s-s/text-area-test.ts +++ b/tests/integration/components/o-s-s/text-area-test.ts @@ -55,7 +55,7 @@ module('Integration | Component | o-s-s/text-area', function (hooks) { test('Default height', async function (assert) { await render(hbs``); - assert.equal(document.querySelector(this.textareaSelector).offsetHeight, 52); + assert.strictEqual(document.querySelector(this.textareaSelector).offsetHeight, 52); }); test('Row change height', async function (assert) { @@ -89,16 +89,16 @@ module('Integration | Component | o-s-s/text-area', function (hooks) { test('passing data-control-name works', async function (assert) { await render(hbs``); - let inputWrapper: Element | null = document.querySelector('.oss-textarea-container'); + const inputWrapper: Element | null = document.querySelector('.oss-textarea-container'); - assert.equal(inputWrapper?.getAttribute('data-control-name'), 'description-input'); + assert.strictEqual(inputWrapper?.getAttribute('data-control-name'), 'description-input'); }); }); module('error management', () => { test('it throws an error if @resize is not a correct value', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::TextArea] The @resize parameter should be a value of resize' ); diff --git a/tests/integration/components/o-s-s/togglable-section-test.ts b/tests/integration/components/o-s-s/togglable-section-test.ts index e7a44943b..f9bc4525d 100644 --- a/tests/integration/components/o-s-s/togglable-section-test.ts +++ b/tests/integration/components/o-s-s/togglable-section-test.ts @@ -27,7 +27,7 @@ module('Integration | Component | o-s-s/togglable-section', function (hooks) { test('It throws an error if the @title param is not passed', async function (assert) { setupOnerror((err: any) => { - assert.equal(err.message, 'Assertion Failed: [OSS::TogglableSection] The @title parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::TogglableSection] The @title parameter is mandatory'); }); await render(hbs` { - assert.equal(err.message, 'Assertion Failed: [OSS::TogglableSection] The @toggled parameter is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::TogglableSection] The @toggled parameter is mandatory'); }); await render(hbs` { - assert.equal(err.message, 'Assertion Failed: [OSS::TogglableSection] The @onChange function is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [OSS::TogglableSection] The @onChange function is mandatory'); }); await render(hbs``); diff --git a/tests/integration/components/o-s-s/toggle-buttons-test.ts b/tests/integration/components/o-s-s/toggle-buttons-test.ts index 9d10faa95..ecbab6631 100644 --- a/tests/integration/components/o-s-s/toggle-buttons-test.ts +++ b/tests/integration/components/o-s-s/toggle-buttons-test.ts @@ -116,7 +116,7 @@ module('Integration | Component | o-s-s/toggle-buttons', function (hooks) { module('Error management', () => { test('it throws an error if @toggles is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ToggleButtons] The @toggles parameter of type Toggle[] is mandatory' ); @@ -129,7 +129,7 @@ module('Integration | Component | o-s-s/toggle-buttons', function (hooks) { test('it throws an error if @onSelection is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ToggleButtons] The @onSelection parameter of type function is mandatory' ); @@ -140,7 +140,7 @@ module('Integration | Component | o-s-s/toggle-buttons', function (hooks) { test('it throws an error if @selectedToggle is not provided', async function (assert) { setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ToggleButtons] The @selectedToggle parameter of type string or null is mandatory' ); @@ -153,7 +153,7 @@ module('Integration | Component | o-s-s/toggle-buttons', function (hooks) { this.selectedToggle = 'toto'; setupOnerror((err: any) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ToggleButtons] The @selectedToggle parameter should be null or a value of toggles' ); diff --git a/tests/integration/components/o-s-s/toggle-switch-test.js b/tests/integration/components/o-s-s/toggle-switch-test.js index 8db7f60e1..57a62d152 100644 --- a/tests/integration/components/o-s-s/toggle-switch-test.js +++ b/tests/integration/components/o-s-s/toggle-switch-test.js @@ -2,6 +2,7 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { click, render, setupOnerror } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; +import sinon from 'sinon'; module('Integration | Component | o-s-s/toggle-switch', function (hooks) { setupRenderingTest(hooks); @@ -22,21 +23,24 @@ module('Integration | Component | o-s-s/toggle-switch', function (hooks) { }); test('it triggers the onChange action when clicking the button', async function (assert) { - this.onChange = (v) => { - assert.equal(v, false); - }; + const onChangeSpy = sinon.spy(); + this.onChange = onChangeSpy; await render(hbs``); await click('.upf-toggle'); - assert.expect(1); + assert.ok(onChangeSpy.calledOnce); + assert.false(onChangeSpy.firstCall.args[0]); }); module('Error management', function () { test('it throws an error if no onChange action is passed', async function (assert) { setupOnerror((err) => { - assert.equal(err.message, 'Assertion Failed: [component][OSS::ToggleSwitch] Please provide an onChange action'); + assert.strictEqual( + err.message, + 'Assertion Failed: [component][OSS::ToggleSwitch] Please provide an onChange action' + ); }); await render(hbs``); @@ -46,7 +50,7 @@ module('Integration | Component | o-s-s/toggle-switch', function (hooks) { this.onChange = () => {}; setupOnerror((err) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ToggleSwitch] Please provide a boolean @value. @value is undefined' ); @@ -59,7 +63,7 @@ module('Integration | Component | o-s-s/toggle-switch', function (hooks) { this.onChange = () => {}; setupOnerror((err) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [component][OSS::ToggleSwitch] Please provide a boolean @value. @value is string' ); diff --git a/tests/integration/components/wizard/base-step-test.ts b/tests/integration/components/wizard/base-step-test.ts index 852c2bcd3..6318222a3 100644 --- a/tests/integration/components/wizard/base-step-test.ts +++ b/tests/integration/components/wizard/base-step-test.ts @@ -67,7 +67,7 @@ module('Integration | Component | wizard/base-step', function (hooks) { test('it sets validateStep if not present', async function (assert) { await render(hbs``); - assert.ok(typeof this.step.validateStep === 'function'); + assert.strictEqual(typeof this.step.validateStep, 'function'); }); test("It doesn't set validateStep if already present", async function (assert) { diff --git a/tests/integration/helpers/redirect-to-test.ts b/tests/integration/helpers/redirect-to-test.ts index 632dfdc99..6e67091de 100644 --- a/tests/integration/helpers/redirect-to-test.ts +++ b/tests/integration/helpers/redirect-to-test.ts @@ -30,7 +30,7 @@ module('Integration | Helper | redirect-to', function (hooks) { module('Error management', function () { test('it throws an error if the url argument is missing', async function (assert) { setupOnerror((err: Error) => { - assert.equal(err.message, 'Assertion Failed: [helper][OSS::redirect-to] url argument is mandatory.'); + assert.strictEqual(err.message, 'Assertion Failed: [helper][OSS::redirect-to] url argument is mandatory.'); }); await render(hbs`
link
`); @@ -38,7 +38,7 @@ module('Integration | Helper | redirect-to', function (hooks) { test('it throws an error if the target is not a valid one', async function (assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [helper][OSS::redirect-to] the target argument must be a valid one: https://www.w3schools.com/tags/att_a_target.asp.' ); diff --git a/tests/integration/helpers/stop-propagation-test.ts b/tests/integration/helpers/stop-propagation-test.ts index d258a1000..847737056 100644 --- a/tests/integration/helpers/stop-propagation-test.ts +++ b/tests/integration/helpers/stop-propagation-test.ts @@ -2,6 +2,7 @@ import { hbs } from 'ember-cli-htmlbars'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { click, render } from '@ember/test-helpers'; +import sinon from 'sinon'; module('Integration | Helper | stop-propagation', function (hooks) { setupRenderingTest(hooks); @@ -15,17 +16,17 @@ module('Integration | Helper | stop-propagation', function (hooks) { }); test('it renders', async function (assert) { - Event.prototype.stopPropagation = () => { - assert.ok(true); - }; - - this.onClick = (arg: string, event: Event) => { - assert.equal(arg, 'foo'); - assert.ok(event instanceof MouseEvent); - }; + const stopPropagationSpy = sinon.spy(); + const onClickSpy = sinon.spy(); + Event.prototype.stopPropagation = stopPropagationSpy; + this.onClick = onClickSpy; await render(hbs``); await click('button'); - assert.expect(3); + + assert.ok(stopPropagationSpy.called); + assert.ok(onClickSpy.calledOnce); + assert.strictEqual(onClickSpy.firstCall.args[0], 'foo'); + assert.ok(onClickSpy.firstCall.args[1] instanceof MouseEvent); }); }); diff --git a/tests/integration/helpers/transition-to-test.ts b/tests/integration/helpers/transition-to-test.ts index 3e6684b6a..4d6edc164 100644 --- a/tests/integration/helpers/transition-to-test.ts +++ b/tests/integration/helpers/transition-to-test.ts @@ -52,7 +52,7 @@ module('Integration | Helper | transition-to', function (hooks) { module('Error management', function () { test('it throws an error if the route argument is missing', async function (assert) { setupOnerror((err: Error) => { - assert.equal(err.message, 'Assertion Failed: [helper][OSS::transition-to] route argument is mandatory'); + assert.strictEqual(err.message, 'Assertion Failed: [helper][OSS::transition-to] route argument is mandatory'); }); await render(hbs`link`); @@ -60,7 +60,7 @@ module('Integration | Helper | transition-to', function (hooks) { test('it throws an error if both models and model arguments are passed', async function (assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [helper][OSS::transition-to] only one of model or models argument must be provided' ); @@ -71,7 +71,7 @@ module('Integration | Helper | transition-to', function (hooks) { test('it throws an error if queryParams argument is passed but is not an object', async function (assert) { setupOnerror((err: Error) => { - assert.equal( + assert.strictEqual( err.message, 'Assertion Failed: [helper][OSS::transition-to] queryParams argument must be an object' ); diff --git a/tests/integration/modifiers/attach-element-test.ts b/tests/integration/modifiers/attach-element-test.ts index a0b3eb5b7..0b03c48b9 100644 --- a/tests/integration/modifiers/attach-element-test.ts +++ b/tests/integration/modifiers/attach-element-test.ts @@ -21,7 +21,7 @@ module('Integration | Modifiers | modifiers/attach-element', function (hooks) { const attachedElement = find('.attached-element') as HTMLElement; expectedEmptyAttributes.forEach((attr) => { - assert.equal(attachedElement.style.getPropertyValue(attr), ''); + assert.strictEqual(attachedElement.style.getPropertyValue(attr), ''); }); }); diff --git a/tests/integration/modifiers/text-carousel-test.ts b/tests/integration/modifiers/text-carousel-test.ts index d8d23cb85..9853f4ef6 100644 --- a/tests/integration/modifiers/text-carousel-test.ts +++ b/tests/integration/modifiers/text-carousel-test.ts @@ -63,7 +63,7 @@ module('Integration | Modifier | text-carousel', function (hooks) { this.set('labels', []); setupOnerror((error: Error) => { - assert.equal(error.message, '[modifier][text-carousel] Requires a non-empty labels array'); + assert.strictEqual(error.message, '[modifier][text-carousel] Requires a non-empty labels array'); }); await render(hbs`
Previous text
`); diff --git a/tests/test-helper.ts b/tests/test-helper.ts index 878deddf1..9474c899d 100644 --- a/tests/test-helper.ts +++ b/tests/test-helper.ts @@ -1,6 +1,5 @@ -// @ts-nocheck -import Application from '../app'; -import config from '../config/environment'; +import Application from 'dummy/app'; +import config from 'dummy/config/environment'; import { setApplication } from '@ember/test-helpers'; import * as QUnit from 'qunit'; import { setup } from 'qunit-dom'; diff --git a/tests/unit/instance-initializers/override-intl-test.ts b/tests/unit/instance-initializers/override-intl-test.ts index c9f5971dc..05f4350ae 100644 --- a/tests/unit/instance-initializers/override-intl-test.ts +++ b/tests/unit/instance-initializers/override-intl-test.ts @@ -1,4 +1,4 @@ -// @ts-ignore +// @ts-expect-error the dummy app module has no type declaration import { initialize } from 'dummy/instance-initializers/override-intl'; import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; diff --git a/tests/unit/services/base-uploader-test.ts b/tests/unit/services/base-uploader-test.ts index f77513a94..adecda356 100644 --- a/tests/unit/services/base-uploader-test.ts +++ b/tests/unit/services/base-uploader-test.ts @@ -134,16 +134,12 @@ module('Unit | Service | base-uploader', function (hooks) { }); test('calling the `url` getter throws throws a NotImplemented error', function (assert: Assert) { - try { - this.service.url; - } catch (err: any) { - assert.equal( - err.message, + assert.throws( + () => this.service.url, + (err: Error) => + err.message === '[@upfluence/oss-components::uploader] NotImpemented: Please extend this service and inherit this method.' - ); - } - - assert.expect(1); + ); }); test('calling the upload method throws a NotImplemented error', function (assert) { @@ -165,7 +161,7 @@ module('Unit | Service | base-uploader', function (hooks) { [] ); } catch (err: any) { - assert.equal( + assert.strictEqual( err.message, '[@upfluence/oss-components::uploader] NotImpemented: Please extend this service and inherit this method.' ); diff --git a/tests/unit/services/form-manager-test.ts b/tests/unit/services/form-manager-test.ts index 6c3669160..cc4d6b4b5 100644 --- a/tests/unit/services/form-manager-test.ts +++ b/tests/unit/services/form-manager-test.ts @@ -20,7 +20,7 @@ module('Unit | Service | form-manager', function (hooks) { module('#generateId', function () { test('it generates a unique ID', function (assert) { - assert.equal(this.service.generateId(), FAKE_UUID); + assert.strictEqual(this.service.generateId(), FAKE_UUID); }); }); @@ -28,9 +28,9 @@ module('Unit | Service | form-manager', function (hooks) { test('it returns a form instance', function (assert) { const instance = this.service.getInstance('test'); - assert.equal(instance.id, 'test'); + assert.strictEqual(instance.id, 'test'); ['validateForm', 'validateField', 'getErrors', 'clearErrors'].forEach((method) => { - assert.equal(typeof instance[method], 'function'); + assert.strictEqual(typeof instance[method], 'function'); }); }); }); @@ -43,7 +43,7 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField(id, field, validator); - assert.equal(this.service.formValidators[id][field], validator); + assert.strictEqual(this.service.formValidators[id][field], validator); }); }); @@ -53,7 +53,7 @@ module('Unit | Service | form-manager', function (hooks) { this.service.unregisterField('test', 'testField'); - assert.equal(this.service.formValidators['test']['testField'], undefined); + assert.strictEqual(this.service.formValidators['test']['testField'], undefined); }); }); @@ -71,7 +71,7 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField('test', field, validator); - assert.equal(this.formInstance.validateField(field), false); + assert.false(this.formInstance.validateField(field)); assert.deepEqual(this.service.formFeedbacks['test'][field], { kind: 'blank', message: { type: 'error', value: 'Error' } @@ -86,7 +86,7 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField('test', field, validator); - assert.equal(this.formInstance.validateField(field), true); + assert.true(this.formInstance.validateField(field)); assert.deepEqual(this.service.formFeedbacks['test'][field], { kind: 'be_cautious', message: { type: 'warning', value: 'warning' } @@ -99,8 +99,8 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField('test', field, validator); - assert.equal(this.formInstance.validateField(field), true); - assert.equal(this.service.formFeedbacks['test'], undefined); + assert.true(this.formInstance.validateField(field)); + assert.strictEqual(this.service.formFeedbacks['test'], undefined); }); }); @@ -113,7 +113,7 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField('test', field, validator); - assert.equal(this.formInstance.validateForm(), false); + assert.false(this.formInstance.validateForm()); assert.deepEqual(this.service.formFeedbacks['test'][field], { kind: 'blank', message: { type: 'error', value: 'Error' } @@ -128,7 +128,7 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField('test', field, validator); - assert.equal(this.formInstance.validateForm(), true); + assert.true(this.formInstance.validateForm()); assert.deepEqual(this.service.formFeedbacks['test'][field], { kind: 'be_cautious', message: { type: 'warning', value: 'warning' } @@ -141,8 +141,8 @@ module('Unit | Service | form-manager', function (hooks) { this.service.registerField('test', field, validator); - assert.equal(this.formInstance.validateForm(), true); - assert.equal(this.service.formFeedbacks['test'], undefined); + assert.true(this.formInstance.validateForm()); + assert.strictEqual(this.service.formFeedbacks['test'], undefined); }); }); diff --git a/tests/unit/services/toast-test.ts b/tests/unit/services/toast-test.ts index 8e1ef1997..1cdf928cc 100644 --- a/tests/unit/services/toast-test.ts +++ b/tests/unit/services/toast-test.ts @@ -2,6 +2,7 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; import { click } from '@ember/test-helpers'; import ToastService from '@upfluence/oss-components/services/toast'; +import sinon from 'sinon'; const TOAST_TYPES = ['info', 'success', 'warning', 'error']; @@ -16,10 +17,10 @@ module('Unit | Service | toast', function (hooks) { assert.ok(this.service); assert.ok(this.service instanceof ToastService); - assert.ok(typeof this.service.info === 'function'); - assert.ok(typeof this.service.success === 'function'); - assert.ok(typeof this.service.warning === 'function'); - assert.ok(typeof this.service.error === 'function'); + assert.strictEqual(typeof this.service.info, 'function'); + assert.strictEqual(typeof this.service.success, 'function'); + assert.strictEqual(typeof this.service.warning, 'function'); + assert.strictEqual(typeof this.service.error, 'function'); }); module('public methods', function () { @@ -45,19 +46,17 @@ module('Unit | Service | toast', function (hooks) { const animation = toast.getAnimations().filter((animation: Animation) => animation.id === 'destroy')[0]; await animation.finished; - assert.true(toast.parentElement === null); + assert.strictEqual(toast.parentElement, null); }); test('the onclick function is called when the toast is clicked', async function (assert: Assert) { - const toast = this.service.error('Message', 'Title', { - timeout: 100, - onclick: (event: MouseEvent) => { - assert.equal(event.type, 'click'); - } - }); + const onclickSpy = sinon.spy(); + const toast = this.service.error('Message', 'Title', { timeout: 100, onclick: onclickSpy }); await click(toast); - assert.expect(1); + + assert.ok(onclickSpy.calledOnce); + assert.strictEqual(onclickSpy.firstCall.args[0].type, 'click'); }); module('badge options', function () { diff --git a/tests/unit/services/wizard-manager-test.ts b/tests/unit/services/wizard-manager-test.ts index a925bc426..b58db0115 100644 --- a/tests/unit/services/wizard-manager-test.ts +++ b/tests/unit/services/wizard-manager-test.ts @@ -31,17 +31,17 @@ module('Unit | Service | wizard-manager', function (hooks) { test('Sections are properly initialized', function (assert) { this.service.initialize(this.config as WizardConfiguration); - assert.equal(this.service.sections.length, 1); - assert.equal(this.service.sections[0].key, 'section-1'); + assert.strictEqual(this.service.sections.length, 1); + assert.strictEqual(this.service.sections[0].key, 'section-1'); }); test('Steps are properly initialized', function (assert) { this.service.initialize(this.config as WizardConfiguration); - assert.equal(this.service.allSteps.length, 3); - assert.equal(this.service.allSteps[0].key, 'step-1'); - assert.equal(this.service.allSteps[1].key, 'step-2'); - assert.equal(this.service.allSteps[2].key, 'step-3'); + assert.strictEqual(this.service.allSteps.length, 3); + assert.strictEqual(this.service.allSteps[0].key, 'step-1'); + assert.strictEqual(this.service.allSteps[1].key, 'step-2'); + assert.strictEqual(this.service.allSteps[2].key, 'step-3'); }); test('Extra step properties are preserved', function (assert) { @@ -54,8 +54,8 @@ module('Unit | Service | wizard-manager', function (hooks) { this.service.initialize(this.config as WizardConfiguration); const step1 = this.service.allSteps[0]; const section1 = this.service.sections[0]; - assert.equal(section1.customProp, 'customValue', 'Extra properties are preserved in sections'); - assert.equal(step1.customProp, 'customValue', 'Extra properties are preserved in steps'); + assert.strictEqual(section1.customProp, 'customValue', 'Extra properties are preserved in sections'); + assert.strictEqual(step1.customProp, 'customValue', 'Extra properties are preserved in steps'); }); test('Setting a visited attribute on steps overwrites the default', function (assert) { @@ -72,15 +72,15 @@ module('Unit | Service | wizard-manager', function (hooks) { test('Focused step is set to first step', function (assert) { this.service.initialize(this.config as WizardConfiguration); - assert.equal(this.service.focusedStepId, this.service.allSteps[0].id); + assert.strictEqual(this.service.focusedStepId, this.service.allSteps[0].id); }); test('Setting centerStepsInContainer option to true adds empty steps to the start and end', function (assert) { this.config.options = { centerStepsInContainer: true }; this.service.initialize(this.config as WizardConfiguration); const steps = this.service.sections[0].steps; - assert.equal(steps[0].displayState, 'empty'); - assert.equal(steps[steps.length - 1].displayState, 'empty'); + assert.strictEqual(steps[0].displayState, 'empty'); + assert.strictEqual(steps[steps.length - 1].displayState, 'empty'); }); test('Not setting centerStepsInContainer does not add empty steps', function (assert) { @@ -112,7 +112,7 @@ module('Unit | Service | wizard-manager', function (hooks) { this.service.selectStep(step2Id); await settled(); - assert.equal(this.service.focusedStepId, step2Id); + assert.strictEqual(this.service.focusedStepId, step2Id); }); test('calling selectStep with a bypassValidations flag focuses the step without validation', async function (assert) { @@ -128,11 +128,11 @@ module('Unit | Service | wizard-manager', function (hooks) { const step2Id = this.service.allSteps[1].id; this.validateStub = sinon.stub(this.service.allSteps[0], 'validateStep').resolves(true); - assert.equal(this.service.focusedStepId, step1Id); + assert.strictEqual(this.service.focusedStepId, step1Id); this.service.selectStep(step2Id, true); await settled(); - assert.equal(this.service.focusedStepId, step2Id); + assert.strictEqual(this.service.focusedStepId, step2Id); assert.true(this.validateStub.notCalled, 'validateStep was not called when bypassValidations is true'); }); @@ -175,7 +175,7 @@ module('Unit | Service | wizard-manager', function (hooks) { this.service.selectStep(step3.id); await settled(); - assert.equal(this.service.focusedStepId, step3.id, 'Focused on step 3 after validation'); + assert.strictEqual(this.service.focusedStepId, step3.id, 'Focused on step 3 after validation'); assert.true(stub1.calledOnce); assert.true(stub2.calledOnce); }); @@ -195,7 +195,7 @@ module('Unit | Service | wizard-manager', function (hooks) { this.service.selectStep(step3.id); await settled(); - assert.equal(this.service.focusedStepId, step2.id); + assert.strictEqual(this.service.focusedStepId, step2.id); }); }); @@ -336,14 +336,14 @@ module('Unit | Service | wizard-manager', function (hooks) { assert.strictEqual(this.service.sections.length, 0); assert.strictEqual(this.service.allSteps.length, 0); assert.strictEqual(this.service.focusedStepId, ''); - assert.strictEqual(this.service.initialized, false); + assert.false(this.service.initialized); }); test('markStepAsCompleted marks a step as completed', async function (assert) { this.service.initialize(this.config as WizardConfiguration); await settled(); const step1 = this.service.allSteps[0]; - assert.equal(step1.completed, undefined); + assert.strictEqual(step1.completed, undefined); this.service.markStepAsCompleted(step1.id); assert.true(step1.completed); }); @@ -366,11 +366,11 @@ module('Unit | Service | wizard-manager', function (hooks) { this.service.initialize(this.config as WizardConfiguration); await settled(); const step1 = this.service.allSteps[0]; - assert.equal(step1.hidden, undefined); + assert.strictEqual(step1.hidden, undefined); this.service.toggleStepVisibility(step1.id, true); - assert.equal(step1.hidden, true); + assert.true(step1.hidden); this.service.toggleStepVisibility(step1.id, false); - assert.equal(step1.hidden, false); + assert.false(step1.hidden); }); test('It rerenders the display states when triggered', async function (assert) { diff --git a/tests/unit/utils/upf-local-storage-test.js b/tests/unit/utils/upf-local-storage-test.js index 2d026584c..e353c13cc 100644 --- a/tests/unit/utils/upf-local-storage-test.js +++ b/tests/unit/utils/upf-local-storage-test.js @@ -29,13 +29,13 @@ module('Unit | Utility | UPFLocalStorage', function (hooks) { test('Saving content without specifying a prefix will use the default ".upf_" prefix', function (assert) { let upfStorage = new UPFLocalStorage(); upfStorage.saveItem(TEST_KEY, TEST_VALUE); - assert.equal(TEST_VALUE, localStorage.getItem(DEFAULT_PREFIX + TEST_KEY)); + assert.strictEqual(TEST_VALUE, localStorage.getItem(DEFAULT_PREFIX + TEST_KEY)); }); test('Setting a custom prefix on the Ctor will save content with the set prefix', function (assert) { let upfStorage = new UPFLocalStorage(CUSTOM_PREFIX); upfStorage.saveItem(TEST_KEY, TEST_VALUE); - assert.equal(TEST_VALUE, localStorage.getItem(CUSTOM_PREFIX + TEST_KEY)); + assert.strictEqual(TEST_VALUE, localStorage.getItem(CUSTOM_PREFIX + TEST_KEY)); }); }); @@ -179,13 +179,13 @@ module('Unit | Utility | UPFLocalStorage', function (hooks) { module('Method: getItem', function () { test('getItem() returns null if no key is found', function (assert) { let upfStorage = new UPFLocalStorage(); - assert.equal(null, upfStorage.getItem(TEST_KEY)); + assert.strictEqual(upfStorage.getItem(TEST_KEY), null); }); test('getItem() returns the proper value if the key is found', function (assert) { let upfStorage = new UPFLocalStorage(); upfStorage.saveItem(TEST_KEY, TEST_VALUE); - assert.equal(TEST_VALUE, upfStorage.getItem(TEST_KEY)); + assert.strictEqual(TEST_VALUE, upfStorage.getItem(TEST_KEY)); }); }); @@ -195,7 +195,7 @@ module('Unit | Utility | UPFLocalStorage', function (hooks) { upfStorage.saveItem(TEST_KEY, TEST_VALUE); assert.deepEqual(TEST_VALUE, localStorage.getItem(DEFAULT_PREFIX + TEST_KEY)); upfStorage.delete(TEST_KEY); - assert.equal(null, upfStorage.getItem(TEST_KEY)); + assert.strictEqual(upfStorage.getItem(TEST_KEY), null); }); test('delete() uses the custom prefix when removing a key', function (assert) { @@ -203,7 +203,7 @@ module('Unit | Utility | UPFLocalStorage', function (hooks) { upfStorage.saveItem(TEST_KEY, TEST_VALUE); assert.deepEqual(TEST_VALUE, localStorage.getItem(CUSTOM_PREFIX + TEST_KEY)); upfStorage.delete(TEST_KEY); - assert.equal(null, upfStorage.getItem(TEST_KEY)); + assert.strictEqual(upfStorage.getItem(TEST_KEY), null); }); }); }); diff --git a/tests/utils-test.ts b/tests/utils-test.ts index 00c3cf7da..b3cb3d774 100644 --- a/tests/utils-test.ts +++ b/tests/utils-test.ts @@ -15,9 +15,9 @@ module('Tests | Utils', function (hooks) { const rgbColor = CSSVariableToRGB('--test-rgb-color'); const rgbaColor = CSSVariableToRGB('--test-rgba-color'); - assert.equal(hexColor, 'rgb(255, 87, 51)', 'Hex color converted to RGB correctly'); - assert.equal(rgbaColor, 'rgb(139, 65, 9)', 'RGBA color converted to RGB correctly'); - assert.equal(rgbColor, 'rgb(34, 139, 34)', 'RGB color converted to RGB correctly'); + assert.strictEqual(hexColor, 'rgb(255, 87, 51)', 'Hex color converted to RGB correctly'); + assert.strictEqual(rgbaColor, 'rgb(139, 65, 9)', 'RGBA color converted to RGB correctly'); + assert.strictEqual(rgbColor, 'rgb(34, 139, 34)', 'RGB color converted to RGB correctly'); }); test('hexToRGB converts hex color to RGB', function (assert) { @@ -27,7 +27,7 @@ module('Tests | Utils', function (hooks) { const shortHexRGB = hexToRGB(shortHex); const longHexRGB = hexToRGB(longHex); - assert.equal(shortHexRGB, 'rgb(0, 255, 0)', 'Short hex color converted to RGB correctly'); - assert.equal(longHexRGB, 'rgb(0, 255, 0)', 'Long hex color converted to RGB correctly'); + assert.strictEqual(shortHexRGB, 'rgb(0, 255, 0)', 'Short hex color converted to RGB correctly'); + assert.strictEqual(longHexRGB, 'rgb(0, 255, 0)', 'Long hex color converted to RGB correctly'); }); }); diff --git a/types/global.d.ts b/types/global.d.ts index 236548f33..4a2de1941 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -9,3 +9,8 @@ declare module '@upfluence/oss-components/templates/*' { declare module 'ember-intl/test-support' { function setupIntl(...args: unknown[]): unknown; } + +declare module 'ember-cli-code-coverage/test-support' { + export function forceModulesToBeLoaded(filterFunction?: (type: string, moduleName: string) => boolean): void; + export function sendCoverage(): Promise; +} From 54c908643dfd0eb199feb58c58535206575f985c Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Tue, 28 Jul 2026 09:53:26 +0200 Subject: [PATCH 02/13] Auto fix for eslint for hbs file --- addon/components/o-s-s/scrollable-bar.hbs | 6 +- package.json | 1 - pnpm-lock.yaml | 99 ++--------------------- 3 files changed, 10 insertions(+), 96 deletions(-) diff --git a/addon/components/o-s-s/scrollable-bar.hbs b/addon/components/o-s-s/scrollable-bar.hbs index de807a3d1..d1d2e077f 100644 --- a/addon/components/o-s-s/scrollable-bar.hbs +++ b/addon/components/o-s-s/scrollable-bar.hbs @@ -3,8 +3,7 @@ {{#if (eq this.buttonStyle "icon")}} @@ -28,8 +27,7 @@ {{#if (eq this.buttonStyle "icon")}} diff --git a/package.json b/package.json index 1af257f40..a8bde878b 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,6 @@ "@types/qunit": "^2.19.9", "@types/rsvp": "^4.0.8", "@types/sinon": "^10.0.2", - "@typescript-eslint/parser": "^5.0.0", "@upfluence/w-conf": "^0.3.0", "babel-loader": "^8.1.0", "css-loader": "^5.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d32e2a32..df63c5de2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -192,12 +192,9 @@ importers: '@types/sinon': specifier: ^10.0.2 version: 10.0.20 - '@typescript-eslint/parser': - specifier: ^5.0.0 - version: 5.62.0(eslint@10.8.0)(typescript@5.3.3) '@upfluence/w-conf': specifier: ^0.3.0 - version: 0.3.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(prettier@3.8.3)(typescript@5.3.3) + version: 0.3.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(prettier@3.8.3)(typescript@5.3.3) babel-loader: specifier: ^8.1.0 version: 8.3.0(@babel/core@7.23.9)(webpack@5.90.1) @@ -2361,16 +2358,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.65.0': resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2384,10 +2371,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@8.65.0': resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2405,23 +2388,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@8.65.0': resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.65.0': resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2435,10 +2405,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@8.65.0': resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8530,12 +8496,6 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tty-browserify@0.0.0: resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} @@ -12217,18 +12177,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - debug: 4.3.4 - eslint: 10.8.0 - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3)': dependencies: '@typescript-eslint/scope-manager': 8.65.0 @@ -12250,11 +12198,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@8.65.0': dependencies: '@typescript-eslint/types': 8.65.0 @@ -12276,24 +12219,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.65.0(typescript@5.3.3)': dependencies: '@typescript-eslint/project-service': 8.65.0(typescript@5.3.3) @@ -12320,23 +12247,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.65.0': dependencies: '@typescript-eslint/types': 8.65.0 eslint-visitor-keys: 5.0.1 - '@upfluence/w-conf@0.3.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(prettier@3.8.3)(typescript@5.3.3)': + '@upfluence/w-conf@0.3.0(@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3))(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(prettier@3.8.3)(typescript@5.3.3)': dependencies: '@eslint/js': 10.0.1(eslint@10.8.0) '@trivago/prettier-plugin-sort-imports': 6.0.2(prettier@3.8.3) eslint: 10.8.0 eslint-config-prettier: 10.1.8(eslint@10.8.0) - eslint-plugin-ember: 13.4.1(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3) + eslint-plugin-ember: 13.4.1(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3) eslint-plugin-n: 18.2.2(eslint@10.8.0)(typescript@5.3.3) eslint-plugin-qunit: 8.2.6(eslint@10.8.0) globals: 17.8.0 @@ -15027,7 +14949,7 @@ snapshots: ember-disable-prototype-extensions@1.1.3: {} - ember-eslint-parser@0.14.4(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(typescript@5.3.3): + ember-eslint-parser@0.14.4(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(typescript@5.3.3): dependencies: '@glimmer/syntax': 0.95.0 '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.3.3) @@ -15038,7 +14960,7 @@ snapshots: mathml-tag-names: 4.0.0 svg-tags: 1.0.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@5.3.3) transitivePeerDependencies: - typescript @@ -15457,14 +15379,14 @@ snapshots: dependencies: eslint: 10.8.0 - eslint-plugin-ember@13.4.1(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3): + eslint-plugin-ember@13.4.1(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(eslint@10.8.0)(typescript@5.3.3): dependencies: '@ember-data/rfc395-data': 0.0.4 aria-query: 5.3.2 axobject-query: 4.1.0 css-tree: 3.2.1 editorconfig: 3.0.2 - ember-eslint-parser: 0.14.4(@typescript-eslint/parser@5.62.0(eslint@10.8.0)(typescript@5.3.3))(typescript@5.3.3) + ember-eslint-parser: 0.14.4(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@5.3.3))(typescript@5.3.3) ember-rfc176-data: 0.3.18 eslint: 10.8.0 eslint-utils: 3.0.0(eslint@10.8.0) @@ -15478,7 +15400,7 @@ snapshots: snake-case: 3.0.4 svg-tags: 1.0.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@10.8.0)(typescript@5.3.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@5.3.3) transitivePeerDependencies: - '@babel/eslint-parser' - typescript @@ -20138,11 +20060,6 @@ snapshots: tslib@2.6.2: {} - tsutils@3.21.0(typescript@5.3.3): - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - tty-browserify@0.0.0: {} tunnel-agent@0.4.3: From c2acc5fdafb13af72bdf8b6d0b01c2d8645feb3c Mon Sep 17 00:00:00 2001 From: Julien Vannier Date: Tue, 28 Jul 2026 11:22:26 +0200 Subject: [PATCH 03/13] Fix no-invalid-interactive eslint for hbs --- addon/components/o-s-s/button-dropdown.hbs | 16 ++++++++++++++-- addon/components/o-s-s/checkbox.hbs | 7 ++++++- addon/components/o-s-s/chip.hbs | 7 ++++++- addon/components/o-s-s/currency-input.hbs | 1 + addon/components/o-s-s/infinite-select.hbs | 1 + .../components/o-s-s/infinite-select/option.hbs | 8 +++++++- addon/components/o-s-s/phone-number-input.hbs | 6 +++++- addon/components/o-s-s/side-panel.hbs | 1 + .../o-s-s/smart/immersive/currency-input.hbs | 1 + addon/components/o-s-s/smart/tag-input.hbs | 1 + addon/components/o-s-s/toggle-switch.hbs | 3 +++ addon/components/o-s-s/upload-area.hbs | 2 ++ 12 files changed, 48 insertions(+), 6 deletions(-) diff --git a/addon/components/o-s-s/button-dropdown.hbs b/addon/components/o-s-s/button-dropdown.hbs index 742c2cd98..8d6461aeb 100644 --- a/addon/components/o-s-s/button-dropdown.hbs +++ b/addon/components/o-s-s/button-dropdown.hbs @@ -5,10 +5,16 @@ {{if this.displayDropdown 'oss-button-dropdown__trigger--active'}} fx-row fx-xalign-center" role={{unless @mainAction "button"}} + tabindex={{unless @mainAction "0"}} {{on "click" this.onDropdownClick}} ...attributes > -
+
{{#if @icon}} {{/if}} @@ -17,7 +23,12 @@ {{/if}}
{{#unless @hideArrow}} -
+
{{/unless}} @@ -25,6 +36,7 @@ {{#if this.displayDropdown}}
+
+
{{#if (has-block "prefix")}} {{yield to="prefix"}} {{/if}} diff --git a/addon/components/o-s-s/currency-input.hbs b/addon/components/o-s-s/currency-input.hbs index a4d055c5e..93ed32bf3 100644 --- a/addon/components/o-s-s/currency-input.hbs +++ b/addon/components/o-s-s/currency-input.hbs @@ -7,6 +7,7 @@
diff --git a/addon/components/o-s-s/infinite-select.hbs b/addon/components/o-s-s/infinite-select.hbs index a1721bd04..144108c54 100644 --- a/addon/components/o-s-s/infinite-select.hbs +++ b/addon/components/o-s-s/infinite-select.hbs @@ -19,6 +19,7 @@ {{/if}}
    +
    {{#if this.isSelectionMultiple}} diff --git a/addon/components/o-s-s/phone-number-input.hbs b/addon/components/o-s-s/phone-number-input.hbs index bfb1aa627..f78ca7216 100644 --- a/addon/components/o-s-s/phone-number-input.hbs +++ b/addon/components/o-s-s/phone-number-input.hbs @@ -10,7 +10,11 @@
    -
    +
    {{@prefix}}
    diff --git a/addon/components/o-s-s/smart/tag-input.hbs b/addon/components/o-s-s/smart/tag-input.hbs index d9de0f55b..48b53ca09 100644 --- a/addon/components/o-s-s/smart/tag-input.hbs +++ b/addon/components/o-s-s/smart/tag-input.hbs @@ -1,4 +1,5 @@