Версия 1.7 — Что нового
Основной пакет (@yamato-daiwa/es-extensions)
Новая функциональность
Работа с массивами
Критические изменения
Работа с массивами
Изменение 3-его параметра в getArrayElementSatisfiesThePredicateIfSuchElementIsExactlyOne и getIndexOfArrayElementSatisfiesThePredicateIfSuchElementIsExactlyOne
В 3-ем параметре типа «объект», свойство mustThrowErrorIfElementNotFoundOrMoreThan1 было переименовано в mustThrowErrorIfElementNotFoundOrMatchesAreMultiple.
- Причина
- Прежнее имя вводит в заблуждение: «or more than1» можно ошибочно интерпретировать как то, что в исходном массиве не должно быть более одного элемента. Теперь же «or matches are multiple» («... или совпадений несколько») однозначно передаёт, что элементов не должно быть более одного именно среди удовлетворяющих предикату.
- Потребуются редактирование Вашего исходного кода, если
- В Вашем коде при вызове функций
getArrayElementSatisfiesThePredicateIfSuchElementIsExactlyOneилиgetIndexOfArrayElementSatisfiesThePredicateIfSuchElementIsExactlyOneиспользуется 3-ий параметр. - Миграция
- Используя соответствующую функциональность редактора кода или интегрированной среды разработки, замените
mustThrowErrorIfElementNotFoundOrMoreThan1наmustThrowErrorIfElementNotFoundOrMatchesAreMultipleво всех файлах проекта.
Класс «RawObjectDataProcessor»
Переименование объекта локализации
В соответствии с обновлёнными соглашениями по именованию, объект локализации RawObjectDataProcessorLocalization__English был переименован в rawObjectDataProcessorLocalization__english. Аналогичные изменения были применены и к другим объектам локализациям.
Браузерный JavaScript (@yamato-daiwa/es-extensions-browserjs)
Критические изменения
Работа с DOM
Изменения параметров и условий бросания ошибок в функциях getExpectedToBeSingleDOM_Element и getExpectedToBeSingleChildOfTemplateElement
Прежде, единственный параметр типа «объект» имел полиморфное опциональное свойство context, которое, если было определено, должно было иметь тип Element, Document, или производный от одного из них. Теперь это свойство было заменено на contextElement, которое также полиморфное, но теперь имеет тип ParentNode | Readonly<{ selector: string; }>, благодаря чему стало возможно в качестве контекста указать не только контекстный элемент, но и его селектор. Однако, когда указан селектор контекстного элемента, ему должен соответствовать ровно один элемент, иначе будет брошена ошибка ( DOM_ElementRetrievingFailedError если контекстный элемент не найден или UnexpectedEventError, если найдено два или более элементов). Поскольку и Element, и Document унаследованы от ParentNode, то тип нового свойства совместим со старым.
- Причина
- Унификация API указания контекстного элемента — свойство
contextElementтипаParentNode | Readonly<{ selector: string; }>теперь используется в параметрах нескольких функций и даже за пределами библиотеки YDEE (например, в библиотеке для фронтенд-разработки Yamato Daiwa Frontend. - Потребуются редактирование Вашего исходного кода, если
- Вы пользовались свойством
contextпараметра функцийgetExpectedToBeSingleDOM_ElementилиgetExpectedToBeSingleChildOfTemplateElement. - Миграция
- Переименуйте свойство
contextвcontextElementво всех файлах проекта. Если Вам будет удобнее указать селектор контекстного элемента вместо самого контекстного элемента, то теперь Вы можете выполнить соответствующий рефакторинг с использованием нового API, при этом селектору контекстного элемента должен соответствовать ровно один элемент, в противном случае будет брошена ошибка.
Обработка событий
Изменение параметра функции addLeftClickEventHandler
Как и ранее, функция имеет единственный параметр типа «объект», однако его свойства изменились:
- Удаление
targetElementSelector - Удалено взамен на превращение свойства
targetElementв полиморфное. Теперь селектор целевого элемента должен быть указан через строковое свойствоselectorобъектаtargetElement. При этом как и раньше, если целевой элемент указан с помощью селектора, то необходимо через одно из свойствmustApplyToAllMatchingsWithSelector,mustIgnoreSubsequentMatchingsWithSelectorиmustExpectExactlyOneMatchingWithSelectorуказать, как функция должна себя вести в случае, когда указанному селектору соответствует более одного элемента. - Добавление
contextElement - Если указано свойство
targetElementSelector, то можно дополнительно через новое свойствоcontextElementуказать контекстный элемент, внутри которого будет осуществляться поиск целевого элемента. Сделать это можно, как в случае сtargetElementSelector, либо указав экземпляр элемента, либо селектор конкретного элемента, однако во втором случае селектор должен ссылаться на ровно один элемент, в противном случае будет брошена ошибка. - Замена
mustInvokeBeforeChildren_sHandlersнаeventPropagation - Благодаря новому полиморфному свойству
eventPropagationможно не только указывать тип распространения события, но и вовсе прервать это распространение. Хотя элементы перечисленияeventPropagationа именноEventPropagationTypes.capturingиeventPropagation: EventPropagationTypes.bubblingмогут показаться менее понятными, «capturing» (движение вниз по DOM-древу) и «bubbling» (движение вверх по DOM-древу) являются каноническими терминами, а использование канонической терминологи не является признаком низкокачественного API. - Причины
- Частичная унификация API с другими функциями
- Потребность в возможности указывать селектор целевого элемента внутри конкретного родительского элемента
- Потребность в более гибком управлении распространением события
- Потребуются редактирование Вашего исходного кода, если
Используется одно или более свойств единственного параметра среди нижеследующих:
targetElementSelectormustInvokeBeforeChildren_sHandlers
- Миграция
- Переименуйте свойство
targetElementSelectorвtargetElement, а строковый литерал с селектором либо переменную с этим литералом поместите в дочерний объект со свойствомselector. Например,targetElementSelector: ".Card-SavingButton"превратится вtargetElement: { selector: ".Card-SavingButton"}. - Если у Вас указано
mustInvokeBeforeChildren_sHandlers: true, то замените это наeventPropagation: EventPropagationTypes.capturing. - Если у Вас указано
mustInvokeBeforeChildren_sHandlers: false, то замените это наeventPropagation: EventPropagationTypes.bubbling.
- Переименуйте свойство