fix: types base constructor same return type

This commit is contained in:
Joren Broekema 2021-01-13 17:05:07 +01:00
parent 9f0691609f
commit 8fb7e7a193
61 changed files with 114 additions and 102 deletions

View file

@ -0,0 +1,21 @@
---
'@lion/calendar': patch
'@lion/checkbox-group': patch
'@lion/core': patch
'@lion/fieldset': patch
'@lion/form-core': patch
'@lion/input-date': patch
'@lion/input-datepicker': patch
'@lion/input-email': patch
'@lion/input-iban': patch
'@lion/listbox': patch
'@lion/localize': patch
'@lion/overlays': patch
'@lion/pagination': patch
'@lion/progress-indicator': patch
'@lion/radio-group': patch
'@lion/select-rich': patch
'@lion/switch': patch
---
Fix type issues where base constructors would not have the same return type. This allows us to remove a LOT of @ts-expect-errors/@ts-ignores across lion.

View file

@ -2,3 +2,4 @@ node_modules
coverage/
bundlesize/
.history/
*.d.ts

View file

@ -25,7 +25,6 @@ import { isSameDate } from './utils/isSameDate.js';
/**
* @customElement lion-calendar
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionCalendar extends LocalizeMixin(LitElement) {
static get localizeNamespaces() {
return [

View file

@ -4,7 +4,6 @@ import { ChoiceGroupMixin, FormGroupMixin } from '@lion/form-core';
/**
* A wrapper around multiple checkboxes
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionCheckboxGroup extends ChoiceGroupMixin(FormGroupMixin(LitElement)) {
constructor() {
super();

View file

@ -10,6 +10,7 @@ export type Delegations = {
};
export declare class DelegateHost {
constructor(...args: any[]);
delegations: Delegations;
protected _connectDelegateMixin(): void;

View file

@ -2,6 +2,7 @@ import { Constructor } from '@open-wc/dedupe-mixin';
import { LitElement } from '../index.js';
export declare class DisabledHost {
constructor(...args: any[]);
disabled: boolean;
/**
@ -20,6 +21,6 @@ export declare class DisabledHost {
export declare function DisabledMixinImplementation<T extends Constructor<LitElement>>(
superclass: T,
): T & Constructor<DisabledHost>;
): T & Constructor<DisabledHost> & typeof DisabledHost;
export type DisabledMixin = typeof DisabledMixinImplementation;

View file

@ -2,6 +2,7 @@ import { Constructor } from '@open-wc/dedupe-mixin';
import { DisabledHost } from './DisabledMixinTypes';
import { LitElement } from '../index.js';
export declare class DisabledWithTabIndexHost {
constructor(...args: any[]);
tabIndex: number;
/**
* Makes request to make the element disabled and set the tabindex

View file

@ -7,6 +7,7 @@ export type SlotsMap = {
};
export declare class SlotHost {
constructor(...args: any[]);
/**
* Obtains all the slots to create
*/
@ -50,6 +51,6 @@ export declare class SlotHost {
*/
export declare function SlotMixinImplementation<T extends Constructor<HTMLElement>>(
superclass: T,
): T & Constructor<SlotHost>;
): T & Constructor<SlotHost> & typeof SlotHost;
export type SlotMixin = typeof SlotMixinImplementation;

View file

@ -21,6 +21,7 @@ export declare class UpdateStylesHost {
*
* @param {StylesMap} updateStyles
*/
constructor(...args: any[]);
public updateStyles(updateStyles: StylesMap): void;
}

View file

@ -19,13 +19,15 @@ import { FormGroupMixin } from '@lion/form-core';
*
* @customElement lion-fieldset
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionFieldset extends FormGroupMixin(LitElement) {
constructor() {
super();
/** @override FormRegistrarMixin */
this._isFormOrFieldset = true;
/** @override FormControlMixin */
/**
* @type {'child' | 'choice-group' | 'fieldset'}
* @override FormControlMixin
*/
this._repropagationRole = 'fieldset';
}
}

View file

@ -9,7 +9,6 @@ import { Unparseable } from './validate/Unparseable.js';
* @typedef {import('@lion/core').CSSResult} CSSResult
* @typedef {import('@lion/core').nothing} nothing
* @typedef {import('@lion/core/types/SlotMixinTypes').SlotsMap} SlotsMap
* @typedef {import('../types/FormControlMixinTypes.js').FormControlHost} FormControlHost
* @typedef {import('../types/FormControlMixinTypes.js').FormControlMixin} FormControlMixin
* @typedef {import('../types/FormControlMixinTypes.js').ModelValueEventDetails} ModelValueEventDetails
*/
@ -522,15 +521,13 @@ const FormControlMixinImplementation = superclass =>
/**
* @param {?} modelValue
* @return {boolean}
*
* FIXME: Move to FormatMixin? Since there we have access to modelValue prop
*/
// @ts-expect-error
// @ts-ignore FIXME: Move to FormatMixin? Since there we have access to modelValue prop
_isEmpty(modelValue = this.modelValue) {
let value = modelValue;
// @ts-expect-error
// @ts-ignore
if (this.modelValue instanceof Unparseable) {
// @ts-expect-error
// @ts-ignore
value = this.modelValue.viewValue;
}

View file

@ -304,15 +304,16 @@ const FormatMixinImplementation = superclass =>
*/
_onModelValueChanged(...args) {
this._calculateValues({ source: 'model' });
// @ts-expect-error only passing this so a subclasser can use it, but we do not use it ourselves
this._dispatchModelValueChangedEvent(...args);
}
/**
* @param {{ modelValue: unknown; }[]} args
* This is wrapped in a distinct method, so that parents can control when the changed event
* is fired. For objects, a deep comparison might be needed.
*/
_dispatchModelValueChangedEvent() {
// eslint-disable-next-line no-unused-vars
_dispatchModelValueChangedEvent(...args) {
/** @event model-value-changed */
this.dispatchEvent(
new CustomEvent('model-value-changed', {

View file

@ -22,7 +22,7 @@ import { InteractionStateMixin } from './InteractionStateMixin.js'; // applies F
*
* @customElement lion-field
*/
// @ts-expect-error base constructors same return type
// @ts-expect-error lit properties false positive
export class LionField extends FormControlMixin(
InteractionStateMixin(FocusMixin(FormatMixin(ValidateMixin(SlotMixin(LitElement))))),
) {

View file

@ -244,12 +244,15 @@ const ChoiceInputMixinImplementation = superclass =>
* hasChanged is designed for async (updated) callback, also check for sync
* (requestUpdateInternal) callback
* @param {{ modelValue:unknown }} newV
* @param {{ modelValue:unknown }} [oldV]
* @param {{ modelValue:unknown }} [old]
*/
// @ts-expect-error
_onModelValueChanged({ modelValue }, { modelValue: old }) {
// @ts-expect-error
if (this.constructor._classProperties.get('modelValue').hasChanged(modelValue, old)) {
_onModelValueChanged({ modelValue }, old) {
let _old;
if (old && old.modelValue) {
_old = old.modelValue;
}
// @ts-expect-error lit private property
if (this.constructor._classProperties.get('modelValue').hasChanged(modelValue, _old)) {
super._onModelValueChanged({ modelValue });
}
}

View file

@ -93,7 +93,7 @@ const FormRegistrarMixinImplementation = superclass =>
console.info('Error Node:', child); // eslint-disable-line no-console
throw new TypeError('You need to define a name');
}
// @ts-expect-error
// @ts-expect-error this._isFormOrFieldset true means we can assume `this.name` exists
if (name === this.name) {
console.info('Error Node:', child); // eslint-disable-line no-console
throw new TypeError(`You can not have the same name "${name}" as your parent`);

View file

@ -53,7 +53,7 @@ const SyncUpdatableMixinImplementation = superclass =>
* @param {*} oldValue
*/
static __syncUpdatableHasChanged(name, newValue, oldValue) {
// @ts-expect-error FIXME: Typescript bug, superclass static method not availabe from static context
// @ts-expect-error accessing private lit property
const properties = this._classProperties;
if (properties.get(name) && properties.get(name).hasChanged) {
return properties.get(name).hasChanged(newValue, oldValue);

View file

@ -10,7 +10,7 @@ import { FormRegistrarPortalMixin } from '../src/registration/FormRegistrarPorta
/**
* @typedef {Object} customConfig
* @property {typeof HTMLElement | typeof import('@lion/core').UpdatingElement | typeof LitElement} [baseElement]
* @property {typeof LitElement} [baseElement]
* @property {string} [customConfig.suffix]
* @property {string} [customConfig.parentTagString]
* @property {string} [customConfig.childTagString]
@ -22,19 +22,16 @@ import { FormRegistrarPortalMixin } from '../src/registration/FormRegistrarPorta
*/
export const runRegistrationSuite = customConfig => {
const cfg = {
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/38535
baseElement: HTMLElement,
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/38535 fixed in later typescript version
baseElement: LitElement,
...customConfig,
};
describe(`FormRegistrationMixins ${cfg.suffix}`, () => {
// @ts-expect-error base constructors same return type & type cannot be assigned like this
class RegistrarClass extends FormRegistrarMixin(cfg.baseElement) {}
cfg.parentTagString = defineCE(RegistrarClass);
// @ts-expect-error base constructors same return type & type cannot be assigned like this
class RegisteringClass extends FormRegisteringMixin(cfg.baseElement) {}
cfg.childTagString = defineCE(RegisteringClass);
// @ts-expect-error base constructors same return type & type cannot be assigned like this
class PortalClass extends FormRegistrarPortalMixin(cfg.baseElement) {}
cfg.portalTagString = defineCE(PortalClass);
@ -91,7 +88,6 @@ export const runRegistrationSuite = customConfig => {
});
it('works for components that have a delayed render', async () => {
// @ts-expect-error base constructors same return type
class PerformUpdate extends FormRegistrarMixin(LitElement) {
async performUpdate() {
await new Promise(resolve => setTimeout(() => resolve(), 10));

View file

@ -9,7 +9,6 @@ import { Unparseable, Validator } from '../index.js';
* @typedef {ArrayConstructor | ObjectConstructor | NumberConstructor | BooleanConstructor | StringConstructor | DateConstructor | 'iban' | 'email'} modelValueType
*/
// @ts-expect-error base constructor same return type
class FormatClass extends FormatMixin(LitElement) {
get _inputNode() {
return /** @type {HTMLInputElement} */ (super._inputNode); // casts type
@ -279,7 +278,6 @@ export function runFormatMixinSuite(customConfig) {
});
it('works if there is no underlying _inputNode', async () => {
// @ts-expect-error base constructor same return type
const tagNoInputString = defineCE(class extends FormatMixin(LitElement) {});
const tagNoInput = unsafeStatic(tagNoInputString);
expect(async () => {

View file

@ -24,7 +24,6 @@ export function runInteractionStateMixinSuite(customConfig) {
};
describe(`InteractionStateMixin`, async () => {
// @ts-expect-error base constructors same return type
class IState extends InteractionStateMixin(ValidateMixin(LitElement)) {
connectedCallback() {
super.connectedCallback();
@ -244,7 +243,6 @@ export function runInteractionStateMixinSuite(customConfig) {
describe('SubClassers', () => {
it('can override the `_leaveEvent`', async () => {
// @ts-expect-error base constructor same return type
class IStateCustomBlur extends InteractionStateMixin(LitElement) {
constructor() {
super();

View file

@ -28,7 +28,6 @@ export function runValidateMixinSuite(customConfig) {
const lightDom = cfg.lightDom || '';
// @ts-expect-error base constructor same return type
class ValidateElement extends ValidateMixin(LitElement) {
connectedCallback() {
super.connectedCallback();
@ -562,7 +561,6 @@ export function runValidateMixinSuite(customConfig) {
};
const withSuccessTagString = defineCE(
// @ts-expect-error
class extends ValidateMixin(LitElement) {
static get validationTypes() {
return [...super.validationTypes, 'success'];
@ -677,7 +675,6 @@ export function runValidateMixinSuite(customConfig) {
});
it('calls "._isEmpty" when provided (useful for different modelValues)', async () => {
// @ts-expect-error base constructor same return type
class _isEmptyValidate extends ValidateMixin(LitElement) {
_isEmpty() {
// @ts-expect-error
@ -729,7 +726,6 @@ export function runValidateMixinSuite(customConfig) {
describe('Default (preconfigured) Validators', () => {
const preconfTagString = defineCE(
// @ts-expect-error base constructor same return type
class extends ValidateMixin(LitElement) {
constructor() {
super();
@ -752,7 +748,6 @@ export function runValidateMixinSuite(customConfig) {
it('can be altered by App Developers', async () => {
const altPreconfTagString = defineCE(
// @ts-expect-error base constructor same return type
class extends ValidateMixin(LitElement) {
constructor() {
super();
@ -918,7 +913,6 @@ export function runValidateMixinSuite(customConfig) {
describe('Extensibility: Custom Validator types', () => {
const customTypeTagString = defineCE(
// @ts-expect-error base constructor same return type
class extends ValidateMixin(LitElement) {
static get validationTypes() {
return [...super.validationTypes, 'x', 'y'];
@ -1026,7 +1020,6 @@ export function runValidateMixinSuite(customConfig) {
describe('Subclassers', () => {
describe('Adding new Validator types', () => {
it('can add helpers for validation types', async () => {
// @ts-expect-error base constructor same return type
class ValidateHasX extends ValidateMixin(LitElement) {
static get validationTypes() {
return [...super.validationTypes, 'x'];
@ -1074,7 +1067,6 @@ export function runValidateMixinSuite(customConfig) {
.concat(array2.filter(x => !array1.includes(x)));
}
const elTagString = defineCE(
// @ts-expect-error base constructor same return type
class extends ValidateMixin(LitElement) {
static get validationTypes() {
return [...super.validationTypes, 'x'];
@ -1123,7 +1115,7 @@ export function runValidateMixinSuite(customConfig) {
// TODO: add this test on FormControl layer
it('reconsiders feedback visibility when interaction states changed', async () => {
const elTagString = defineCE(
// @ts-expect-error base constructor same return type
// @ts-expect-error lit properties false positive, they get merged with parent properties by lit automatically
class extends ValidateMixin(LitElement) {
static get properties() {
return {
@ -1168,7 +1160,7 @@ export function runValidateMixinSuite(customConfig) {
it('filters feedback visibility according interaction states', async () => {
const elTagString = defineCE(
// @ts-expect-error base constructor same return type
// @ts-expect-error lit properties false positive, they get merged with parent properties by lit automatically
class extends ValidateMixin(LitElement) {
static get validationTypes() {
return ['error', 'info'];

View file

@ -12,7 +12,6 @@ export function runValidateMixinFeedbackPart() {
localizeTearDown();
});
// @ts-expect-error base constructor same return type
class ValidateElement extends ValidateMixin(LitElement) {
connectedCallback() {
super.connectedCallback();
@ -80,7 +79,6 @@ export function runValidateMixinFeedbackPart() {
});
it('reflects .showsFeedbackFor as attribute joined with "," to be used as a style hook', async () => {
// @ts-expect-error base constructors same return type
class ValidateElementCustomTypes extends ValidateMixin(LitElement) {
static get validationTypes() {
return [...super.validationTypes, 'x'];
@ -307,7 +305,6 @@ export function runValidateMixinFeedbackPart() {
});
it('shows success message after fixing an error', async () => {
// @ts-expect-error base constructor same return type
class ValidateElementCustomTypes extends ValidateMixin(LitElement) {
static get validationTypes() {
return ['error', 'success'];
@ -362,7 +359,6 @@ export function runValidateMixinFeedbackPart() {
describe('Meta data', () => {
it('".getMessage()" gets a reference to formControl, params, modelValue and type', async () => {
// @ts-expect-error base constructor same return type
class ValidateElementCustomTypes extends ValidateMixin(LitElement) {
static get validationTypes() {
return ['error', 'x'];

View file

@ -8,7 +8,6 @@ import { ChoiceInputMixin } from '../../src/choice-group/ChoiceInputMixin.js';
class ChoiceInput extends ChoiceInputMixin(LionInput) {}
customElements.define('choice-group-input', ChoiceInput);
// @ts-expect-error
class ChoiceGroup extends ChoiceGroupMixin(FormGroupMixin(LitElement)) {}
customElements.define('choice-group', ChoiceGroup);

View file

@ -20,12 +20,14 @@ export function runFormGroupMixinInputSuite(cfg = {}) {
const childTagString = cfg.childTagString || defineCE(FormChild);
// @ts-expect-error
const FormGroup = class extends FormGroupMixin(LitElement) {
constructor() {
super();
/** @override from FormRegistrarMixin */
this._isFormOrFieldset = true;
/**
* @type {'fieldset' | 'child' | 'choice-group'}
*/
this._repropagationRole = 'fieldset'; // configures FormControlMixin
}
};

View file

@ -29,7 +29,6 @@ export function runFormGroupMixinSuite(cfg = {}) {
const childTagString = cfg.childTagString || defineCE(FormChild);
// @ts-expect-error base constructors same return type
class FormGroup extends FormGroupMixin(LitElement) {
constructor() {
super();
@ -131,8 +130,9 @@ export function runFormGroupMixinSuite(cfg = {}) {
try {
// we test the api directly as errors thrown from a web component are in a
// different context and we can not catch them here => register fake elements
// @ts-expect-error
el.addFormElement(/** @type {FormControlHost} */ ({}));
el.addFormElement(
/** @type {HTMLElement & import('../../types/FormControlMixinTypes').FormControlHost} */ ({}),
);
} catch (err) {
error = err;
}
@ -151,8 +151,11 @@ export function runFormGroupMixinSuite(cfg = {}) {
try {
// we test the api directly as errors thrown from a web component are in a
// different context and we can not catch them here => register fake elements
// @ts-expect-error
el.addFormElement(/** @type {FormControlHost} */ ({ name: 'foo' }));
el.addFormElement(
/** @type {HTMLElement & import('../../types/FormControlMixinTypes').FormControlHost} */ ({
name: 'foo',
}),
);
} catch (err) {
error = err;
}
@ -171,10 +174,16 @@ export function runFormGroupMixinSuite(cfg = {}) {
try {
// we test the api directly as errors thrown from a web component are in a
// different context and we can not catch them here => register fake elements
// @ts-expect-error
el.addFormElement(/** @type {FormControlHost} */ ({ name: 'fooBar' }));
// @ts-expect-error
el.addFormElement(/** @type {FormControlHost} */ ({ name: 'fooBar' }));
el.addFormElement(
/** @type {HTMLElement & import('../../types/FormControlMixinTypes').FormControlHost} */ ({
name: 'fooBar',
}),
);
el.addFormElement(
/** @type {HTMLElement & import('../../types/FormControlMixinTypes').FormControlHost} */ ({
name: 'fooBar',
}),
);
} catch (err) {
error = err;
}
@ -628,7 +637,7 @@ export function runFormGroupMixinSuite(cfg = {}) {
return 'Input1IsTen';
}
// @ts-expect-error
/** @param {?} value */
execute(value) {
const hasError = value.input1 !== 10;
return hasError;
@ -643,10 +652,8 @@ export function runFormGroupMixinSuite(cfg = {}) {
<${childTag} name="input2" .validators=${[new IsNumber()]}></${childTag}>
</${tag}>
`));
const inputs = el.querySelectorAll(childTagString);
// @ts-expect-error
const inputs = /** @type {FormChild[]} */ (Array.from(el.querySelectorAll(childTagString)));
inputs[1].modelValue = 2; // make it dirty
// @ts-expect-error
inputs[1].focus();
outSideButton.focus();
@ -662,8 +669,8 @@ export function runFormGroupMixinSuite(cfg = {}) {
const fieldset = /** @type {FormGroup} */ (await fixture(
html`<${tag}>${inputSlots}</${tag}>`,
));
// @ts-expect-error
fieldset.formElements['hobbies[]'][0].serializer = v => `${v.value}-serialized`;
fieldset.formElements['hobbies[]'][0].serializer = /** @param {?} v */ v =>
`${v.value}-serialized`;
fieldset.formElements['hobbies[]'][0].modelValue = { checked: false, value: 'Bar' };
fieldset.formElements['hobbies[]'][1].modelValue = { checked: false, value: 'rugby' };
fieldset.formElements['gender[]'][0].modelValue = { checked: false, value: 'male' };

View file

@ -3,7 +3,6 @@ import { defineCE, expect, fixture, html, oneEvent, unsafeStatic } from '@open-w
import { FocusMixin } from '../src/FocusMixin.js';
describe('FocusMixin', () => {
// @ts-expect-error base constructors same return type
class Focusable extends FocusMixin(LitElement) {
render() {
return html`<slot name="input"></slot>`;

View file

@ -7,7 +7,6 @@ import { FormRegistrarMixin } from '../src/registration/FormRegistrarMixin.js';
describe('FormControlMixin', () => {
const inputSlot = '<input slot="input" />';
// @ts-expect-error base constructor same return type
class FormControlMixinClass extends FormControlMixin(LitElement) {}
const tagString = defineCE(FormControlMixinClass);
@ -213,7 +212,6 @@ describe('FormControlMixin', () => {
});
describe('Model-value-changed event propagation', () => {
// @ts-expect-error base constructor same return type
const FormControlWithRegistrarMixinClass = class extends FormControlMixin(
FormRegistrarMixin(LitElement),
) {};

View file

@ -1,10 +1,10 @@
import { LitElement, UpdatingElement } from '@lion/core';
import { LitElement } from '@lion/core';
import { html } from '@open-wc/testing';
import { runRegistrationSuite } from '../test-suites/FormRegistrationMixins.suite.js';
runRegistrationSuite({
suffix: 'with UpdatingElement',
baseElement: UpdatingElement,
suffix: 'with LitElement',
baseElement: LitElement,
});
runRegistrationSuite({

View file

@ -8,7 +8,6 @@ describe('SyncUpdatableMixin', () => {
it('initializes all properties', async () => {
let hasCalledFirstUpdated = false;
let hasCalledUpdateSync = false;
// @ts-expect-error base constructors same return type
class UpdatableImplementation extends SyncUpdatableMixin(LitElement) {
static get properties() {
return {
@ -65,7 +64,6 @@ describe('SyncUpdatableMixin', () => {
it('guarantees Member Order Independence', async () => {
let hasCalledRunPropertyEffect = false;
// @ts-expect-error base constructors same return type
class UpdatableImplementation extends SyncUpdatableMixin(LitElement) {
static get properties() {
return {
@ -136,7 +134,6 @@ describe('SyncUpdatableMixin', () => {
let propChangedCount = 0;
let propUpdateSyncCount = 0;
// @ts-expect-error the private override is on purpose
class UpdatableImplementation extends SyncUpdatableMixin(LitElement) {
static get properties() {
return {
@ -189,7 +186,6 @@ describe('SyncUpdatableMixin', () => {
describe('After firstUpdated', () => {
it('calls "updateSync" immediately when the observed property is changed (newValue !== oldValue)', async () => {
// @ts-expect-error
class UpdatableImplementation extends SyncUpdatableMixin(LitElement) {
static get properties() {
return {
@ -245,7 +241,6 @@ describe('SyncUpdatableMixin', () => {
describe('Features', () => {
// See: https://lit-element.polymer-project.org/guide/lifecycle#haschanged
it('supports "hasChanged" from UpdatingElement', async () => {
// @ts-expect-error base constructors same return type
class UpdatableImplementation extends SyncUpdatableMixin(LitElement) {
static get properties() {
return {

View file

@ -134,7 +134,7 @@ describe('Validator', () => {
it('has access to FormControl', async () => {
const lightDom = '';
// @ts-expect-error base constructors same return type
// @ts-expect-error false positive for incompatible static get properties. Lit-element merges super properties already for you.
class ValidateElement extends ValidateMixin(LitElement) {
static get properties() {
return { modelValue: String };

View file

@ -3,6 +3,7 @@ import { LitElement } from '@lion/core';
import { FormControlHost } from './FormControlMixinTypes';
export declare class FocusHost {
constructor(...args: any[]);
focused: boolean;
connectedCallback(): void;

View file

@ -36,6 +36,7 @@ declare interface HTMLElementWithValue extends HTMLElement {
}
export declare class FormControlHost {
constructor(...args: any[]);
static get styles(): CSSResultArray;
static get properties(): {
name: {

View file

@ -5,6 +5,7 @@ import { ValidateHost } from './validate/ValidateMixinTypes';
import { FormControlHost } from './FormControlMixinTypes';
export declare class FormatHost {
constructor(...args: any[]);
formattedValue: string;
serializedValue: string;
formatOn: string;

View file

@ -3,6 +3,7 @@ import { LitElement } from '@lion/core';
import { FormControlHost } from './FormControlMixinTypes';
export declare class InteractionStateHost {
constructor(...args: any[]);
prefilled: boolean;
filled: boolean;
touched: boolean;
@ -26,7 +27,7 @@ export declare function InteractionStateImplementation<T extends Constructor<Lit
superclass: T,
): T &
Constructor<InteractionStateHost> &
InteractionStateHost &
typeof InteractionStateHost &
Constructor<FormControlHost> &
typeof FormControlHost;

View file

@ -6,6 +6,7 @@ export declare class NativeTextField extends LionField {
}
export declare class NativeTextFieldHost {
constructor(...args: any[]);
get selectionStart(): number;
set selectionStart(value: number);
get selectionEnd(): number;

View file

@ -5,6 +5,7 @@ import { FormRegistrarHost } from '../registration/FormRegistrarMixinTypes';
import { InteractionStateHost } from '../InteractionStateMixinTypes';
export declare class ChoiceGroupHost {
constructor(...args: any[]);
multipleChoice: boolean;
connectedCallback(): void;

View file

@ -15,6 +15,7 @@ export interface ChoiceInputSerializedValue {
}
export declare class ChoiceInputHost {
constructor(...args: any[]);
modelValue: ChoiceInputModelValue;
serializedValue: ChoiceInputSerializedValue;

View file

@ -7,6 +7,7 @@ import { FormRegistrarHost } from '../registration/FormRegistrarMixinTypes';
import { ValidateHost } from '../validate/ValidateMixinTypes';
export declare class FormGroupHost {
constructor(...args: any[]);
protected static _addDescriptionElementIdsToField(): void;
_inputNode: HTMLElement;
submitGroup(): void;
@ -29,7 +30,7 @@ export declare function FormGroupImplementation<T extends Constructor<LitElement
superclass: T,
): T &
Constructor<FormGroupHost> &
FormGroupHost &
typeof FormGroupHost &
Constructor<FormRegistrarHost> &
typeof FormRegistrarHost &
Constructor<FormControlHost> &

View file

@ -3,6 +3,7 @@ import { FormRegistrarHost } from './FormRegistrarMixinTypes';
import { LitElement } from '@lion/core';
export declare class FormRegisteringHost {
constructor(...args: any[]);
connectedCallback(): void;
disconnectedCallback(): void;
__parentFormGroup?: FormRegistrarHost;

View file

@ -9,6 +9,7 @@ export declare class ElementWithParentFormGroup {
}
export declare class FormRegistrarHost {
constructor(...args: any[]);
_isFormOrFieldset: boolean;
formElements: FormControlsCollection & { [x: string]: any };
addFormElement(

View file

@ -2,6 +2,7 @@ import { Constructor } from '@open-wc/dedupe-mixin';
import { LitElement } from '@lion/core';
export declare class FormRegistrarPortalHost {
constructor(...args: any[]);
registrationTarget: HTMLElement;
__redispatchEventForFormRegistrarPortalMixin(ev: CustomEvent): void;
}

View file

@ -10,6 +10,7 @@ export declare interface SyncUpdatableNamespace {
}
export declare class SyncUpdatableHost {
constructor(...args: any[]);
static __syncUpdatableHasChanged(name: string, newValue: any, oldValue: any): boolean;
updateSync(name: string, oldValue: any): void;
__syncUpdatableInitialize(): void;

View file

@ -19,6 +19,7 @@ type FeedbackMessage = {
};
export declare class ValidateHost {
constructor(...args: any[]);
validators: Validator[];
hasFeedbackFor: string[];
shouldShowFeedbackFor: string[];

View file

@ -18,7 +18,7 @@ function isValidDate(date) {
*
* @customElement lion-input-date
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
// @ts-expect-error false positive for incompatible static get properties. Lit-element merges super properties already for you.
export class LionInputDate extends LocalizeMixin(LionInput) {
static get properties() {
return {

View file

@ -1,7 +1,6 @@
import { css, html, LitElement } from '@lion/core';
import { LocalizeMixin } from '@lion/localize';
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionCalendarOverlayFrame extends LocalizeMixin(LitElement) {
static get styles() {
return [

View file

@ -12,7 +12,7 @@ import { LionCalendarOverlayFrame } from './LionCalendarOverlayFrame.js';
/**
* @customElement lion-input-datepicker
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
// @ts-expect-error false positive for incompatible static get properties. Lit-element merges super properties already for you.
export class LionInputDatepicker extends ScopedElementsMixin(
ArrowMixin(OverlayMixin(LionInputDate)),
) {
@ -199,9 +199,8 @@ export class LionInputDatepicker extends ScopedElementsMixin(
__toggleInvokerDisabled() {
if (this._invokerNode) {
// @ts-expect-error even though disabled may not exist on the invoker node
// set it anyway, it doesn't harm, and is needed in case of invoker elements that do have disabled prop
this._invokerNode.disabled = this.disabled || this.readOnly;
const invokerNode = /** @type {HTMLElement & {disabled: boolean}} */ (this._invokerNode);
invokerNode.disabled = this.disabled || this.readOnly;
}
}

View file

@ -7,7 +7,6 @@ import { LocalizeMixin } from '@lion/localize';
*
* @customElement lion-input-email
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionInputEmail extends LocalizeMixin(LionInput) {
constructor() {
super();

View file

@ -8,7 +8,6 @@ import { IsIBAN } from './validators.js';
* `LionInputIban` is a class for an IBAN custom form element (`<lion-input-iban>`).
* @customElement lion-input-iban
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionInputIban extends LocalizeMixin(LionInput) {
constructor() {
super();

View file

@ -8,7 +8,6 @@ import { ListboxMixin } from './ListboxMixin.js';
* LionListbox: implements the wai-aria listbox design pattern and integrates it as a Lion
* FormControl
*/
// @ts-expect-error
export class LionListbox extends ListboxMixin(
FocusMixin(InteractionStateMixin(ValidateMixin(LitElement))),
) {}

View file

@ -13,7 +13,6 @@ import { css, DisabledMixin, html, LitElement } from '@lion/core';
* Element gets state supplied externally, reflects this to attributes,
* enabling SubClassers to style based on those states
*/
// @ts-expect-error
export class LionOption extends DisabledMixin(ChoiceInputMixin(FormRegisteringMixin(LitElement))) {
static get properties() {
return {

View file

@ -1,5 +1,6 @@
import { ChoiceGroupHost } from '@lion/form-core/types/choice-group/ChoiceGroupMixinTypes';
export declare class LionOptionHost {
constructor(...args: any[]);
private __parentFormGroup: ChoiceGroupHost;
}

View file

@ -9,6 +9,7 @@ import { LionOptions } from '../src/LionOptions.js';
import { LionOption } from '../src/LionOption.js';
export declare class ListboxHost {
constructor(...args: any[]);
/**
* When true, will synchronize activedescendant and selected element on
* arrow key navigation.

View file

@ -71,7 +71,6 @@ describe('LocalizeMixin', () => {
'child-element': loc => fakeImport(`./child-element/${loc}.js`),
};
// @ts-expect-error
class ParentElement extends LocalizeMixin(LitElement) {
static get localizeNamespaces() {
return [parentElementNs, defaultNs, ...super.localizeNamespaces];
@ -79,7 +78,6 @@ describe('LocalizeMixin', () => {
}
const tagString = defineCE(
// @ts-expect-error
class ChildElement extends LocalizeMixin(ParentElement) {
static get localizeNamespaces() {
return [childElementNs, defaultNs, ...super.localizeNamespaces];

View file

@ -56,7 +56,7 @@ interface msgOptions {
}
declare class LocalizeMixinHost {
// FIXME: return value type check doesn't seem to be `working!
constructor(...args: any[]);
static get localizeNamespaces(): StringToFunctionMap[];
static get waitForLocalizeNamespaces(): boolean;

View file

@ -507,7 +507,7 @@ export class OverlayController extends EventTargetShim {
if (this.placementMode === 'local') {
// Lazily load Popper if not done yet
if (!OverlayController.popperModule) {
// @ts-expect-error
// @ts-expect-error FIXME: for some reason createPopper is missing here
OverlayController.popperModule = preloadPopper();
}
}
@ -838,8 +838,8 @@ export class OverlayController extends EventTargetShim {
hideConfig.backdropNode.classList.remove(
`${this.placementMode}-overlays__backdrop--animation-in`,
);
/** @type {(ev:AnimationEvent) => void} */
let afterFadeOut;
/** @type {() => void} */
let afterFadeOut = () => {};
hideConfig.backdropNode.classList.add(
`${this.placementMode}-overlays__backdrop--animation-out`,
);
@ -857,7 +857,7 @@ export class OverlayController extends EventTargetShim {
resolve(undefined);
};
});
// @ts-expect-error
hideConfig.backdropNode.addEventListener('animationend', afterFadeOut);
}
}

View file

@ -5,6 +5,7 @@ import { Options as PopperOptions, State } from '@popperjs/core/lib/popper';
import { OverlayConfig } from '../types/OverlayConfig';
export declare class ArrowHost {
constructor(...args: any[]);
static get properties(): {
hasArrow: {
type: BooleanConstructor;

View file

@ -17,6 +17,7 @@ export interface DefineOverlayConfig {
}
export declare class OverlayHost {
constructor(...args: any[]);
public opened: Boolean;
public get config(): OverlayConfig;
@ -66,6 +67,6 @@ export declare class OverlayHost {
export declare function OverlayImplementation<T extends Constructor<LitElement>>(
superclass: T,
): T & Constructor<OverlayHost> & OverlayHost;
): T & Constructor<OverlayHost> & typeof OverlayHost;
export type OverlayMixin = typeof OverlayImplementation;

View file

@ -10,7 +10,6 @@ import { LocalizeMixin } from '@lion/localize';
*
* @customElement lion-pagination
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionPagination extends LocalizeMixin(LitElement) {
static get styles() {
return [

View file

@ -3,7 +3,6 @@
import { nothing, LitElement } from '@lion/core';
import { localize, LocalizeMixin } from '@lion/localize';
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionProgressIndicator extends LocalizeMixin(LitElement) {
static get localizeNamespaces() {
return [

View file

@ -4,7 +4,6 @@ import { ChoiceGroupMixin, FormGroupMixin } from '@lion/form-core';
/**
* A wrapper around multiple radios.
*/
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionRadioGroup extends ChoiceGroupMixin(FormGroupMixin(LitElement)) {
connectedCallback() {
super.connectedCallback();

View file

@ -23,7 +23,7 @@ function detectInteractionMode() {
/**
* LionSelectRich: wraps the <lion-listbox> element
*/
// @ts-expect-error
// @ts-expect-error false positive for incompatible static get properties. Lit-element merges super properties already for you.
export class LionSelectRich extends SlotMixin(ScopedElementsMixin(OverlayMixin(LionListbox))) {
static get scopedElements() {
return {
@ -88,7 +88,6 @@ export class LionSelectRich extends SlotMixin(ScopedElementsMixin(OverlayMixin(L
* @configure ListboxMixin
* @protected
*/
// @ts-ignore
get _scrollTargetNode() {
// TODO: should this be defined here or in extension layer?
// @ts-expect-error we allow the _overlayContentNode to define its own _scrollTargetNode

View file

@ -2,7 +2,6 @@ import { css, html, ScopedElementsMixin } from '@lion/core';
import { ChoiceInputMixin, LionField } from '@lion/form-core';
import { LionSwitchButton } from './LionSwitchButton.js';
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/40110
export class LionSwitch extends ScopedElementsMixin(ChoiceInputMixin(LionField)) {
static get styles() {
return [