Wb-rules ошибка find, findIndex, includes и тд

Занимаюсь наполнением правил. Написал правило на TypeScript, скомпилировал его в es5, залил в контроллер, все прошло без ошибок.
При срабатывании правила ошибки в рантайме:

2021-01-21 16:26:40ECMAScript error: TypeError: call target not an object
duk_js_executor.c:2761
anon /etc/wb-rules/rules.js:113 preventsyield
apply native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:179 preventsyield

Посмотрел по скомпилированному коду, падает при попытке поиска в массиве через find или findIndex, тоже самое при использовании includes
Я подозреваю, что это не единственные функции, которые уронят движок правил.

Временно заменил на обход массива через “for” цикл. Можно как-то поправить это поведение? и в целом добавить поддержку es6 или, что даже лучше, TypeScript?

Добрый день!

Поможет, если вы подготовите минимальный пример кода, который воспроизводит проблему.

var fruits = [
    { name: "apple" },
    { name: "orange" },
    { name: "lemon" },
    { name: "peach" },
];
defineRule("bug_repro", {
    whenChanged: "wb-gpio/A1_OUT",
    then: function (newValue, devName, cellName) {
        var orange = fruits.find(function (v) { return v === "orange"; });
        log(orange);
    },
});

ну и через devices дернуть A1

Судя по всему, эти методы пришли к нам в es6 только… придется использовать полифилы

Очень интересно завершение этой истории
:popcorn:

Я в итоге стал писать скрипты на typescript и компилировать в таргет es5, там все ок, полифиллы имеются для недостающих функций. Ну или вручную полифиллы найти и подсунуть в скрипт

Попробуйте заменить на

return v.name === "orange";

конкретно в том примере ошибка с фильтрацией по свойству, да, но сути проблемы это не меняет, суть в том, что в WB в скриптах используется версия es5 в которой у массивов нет метода find и других, перечисленных в теме

Зато есть другие методы, например задачу поиска уникального объекта можно решить вот так:

var a = [ {name: "a"}, {name: "b"}, {name: "c"}];
log(a.filter(function(a){return a.name==="a"})[0].name);

в итоге получим

26-03-2024 11:19:58.217 [wb-rules]	INFO: [rule info] a