FAQ по типовым ошибкам кастомных виджетов

Ниже список часто встречающихся ошибок компиляции и выполнения виджетов.

Как читать код ошибки

  • Большинство ошибок компиляции формируются в widget-runtime и возвращаются сразу при сохранении / предпросмотре.
  • Ошибки выполнения (phase: EVALUATE) появляются только при рендере конкретного блока.
  • По коду ошибки можно быстро понять блокировку:
    • compile — ошибка синтаксиса/валидации/ограничений языка,
    • evaluate — ошибка во время исполнения IR.

1) Чаще всего видишь в редакторе: compile-ошибки

Шаблон проверки

  • откройте сообщение ошибки в лог/панели ошибок виджета;
  • скопируйте код/кусок строки из Widget();
  • исправьте причину из таблицы ниже;
  • пересоберите / пересохраните.
Код Что означает Как исправить
PARSE_ERROR Невалидный JS/JSX Проверьте скобки, запятые, синтаксис function Widget() { ... }.
INVALID_PROGRAM_SHAPE Не ровно одна верхнеуровневая function Widget() Должна быть ровно одна функция Widget() без других top-level блоков.
INVALID_WIDGET_PARAMETERS Widget() объявил аргументы Удалите параметры функции: function Widget().
MULTIPLE_USE_PARAMS useParams вызван >1 раза Оставьте только один useParams в Widget().
INVALID_USE_PARAMS Неправильный вызов useParams Первый аргумент только объект, максимум два аргумента; второй — массив строк.
DUPLICATE_PARAMETER Параметр повторяется Имена параметров в useParams уникальны.
UNKNOWN_PARAMETER_FIELD Неподдерживаемое поле в параметре Оставьте только допустимые поля (type, default, min, ... v1ParamName и т.д.).
INVALID_PARAMETER_TYPE Неподдерживаемый type параметра Используйте типы из документации; список в разделе API и хуков.
INVALID_PARAMETER_DEFINITION Неверное описание параметра Параметр должен быть объектом с статическими полями.
INVALID_PARAMETER_ACTION onClick не функция Для type: "button" onClick — только функция.
DYNAMIC_PARAMETER_FIELD Значение поля нельзя посчитать статически Поля параметра должны быть статическими литералами/выражениями.
INVALID_PARAMETER_FIELD Динамическое поле в описании параметра Аналогично: уберите переменные/вызовы из useParams.
UNSUPPORTED_VAR Использован var Используйте const / let.
UNSUPPORTED_STATEMENT Оператор/конструкция запрещена Например, слишком сложные statement для песочницы; замените на поддерживаемые.
UNSUPPORTED_EXPRESSION Выражение не поддерживается Упростите выражение; используйте допустимые узлы языка v2.
FORBIDDEN_IDENTIFIER Запрещённое имя глобала Не используйте window, document, eval, fetch, Worker, localStorage, XMLHttpRequest и т.д.
FORBIDDEN_CONSTRUCT Запрещённый синтаксис Обычно new, this, import, некоторые выражения/операторы.
FORBIDDEN_JSX_TAG Тег не из whitelist Допустимые теги перечислены в разделе API; используйте их только.
UNSUPPORTED_JSX_TAG / UNSUPPORTED_JSX_ATTRIBUTE JSX или атрибут не поддерживается Замените тег/атрибут на разрешённый список.
UNSUPPORTED_JSX_SPREAD Spread в JSX атрибутах/массивах Не используйте {...props} и spread в JSX-атрибутах.
FORBIDDEN_STYLE_PROPERTY Стили запрещённого свойства Проверяйте allowlist style в разделе API.
UNSUPPORTED_JSX_CHILD Неподдерживаемый дочерний узел JSX Дочерние узлы должны быть допустимыми значениями (строка/число/массив/нодa/вызов).
UNSUPPORTED_LITERAL Неверный литерал Разрешены только string/number/boolean/null в этом контексте.
INVALID_ASSIGNMENT_TARGET Крайний левый операнд присваивания некорректен Присваивайте только локальным переменным/свойствам.
UNSUPPORTED_ASSIGNMENT_OPERATOR / UNSUPPORTED_UPDATE_OPERATOR Недоступный оператор Остаются базовые = += -= *= /= %=, а инкременты только ++/--.
ANONYMOUS_FUNCTION_DECLARATION Локальная функция без имени Называйте function declaration явно.
INVALID_TRACKED_PROPERTIES Неверный второй аргумент useParams Только массив литералов строк.
INVALID_INTRINSIC_SCOPE useParams/useBlockMemo/... вне Widget() Все intrinsics (useParams, useBlockMemo, useControlPoints, useStableId) только на верхнем уровне Widget().
INVALID_INTRINSIC_CALL Неверная сигнатура useStableId/useBlockMemo/... Проверьте число аргументов и типы: useStableId("id"), useBlockMemo(key, fn, deps), useControlPoints() без аргументов.
SOURCE_LIMIT_EXCEEDED Код слишком длинный Разбейте логику на более простой шаблон/уменьшите код.
AST_LIMIT_EXCEEDED / NESTING_LIMIT_EXCEEDED Слишком сложный AST или вложенность Упростите дерево условий/циклов и разносите логику в меньше вложенные блоки.

2) Runtime-ошибки при рендере

Код Что означает Что делать
INVALID_PERSISTED_PROGRAM Блок содержит повреждённую сохранённую программу Переcompile виджета из исходника; проверьте, что widgetProgram и jsx не повреждены.
UNSUPPORTED_PROGRAM_VERSION Не совпадает версия схемы Обновите runtime/пересоберите проектный пакет с актуальным движком.
INVALID_SOURCE_HASH Неконсистентный хэш исходника/IR Не редактируйте widgetProgram вручную; пересоберите через редактор.
STEP_LIMIT_EXCEEDED Превышен бюджет шагов Оптимизируйте вычисления, удалите тяжёлые циклы/бесконечные рекурсии.
CALL_DEPTH_EXCEEDED Слишком глубокий стек вызовов Проверьте рекурсивные/self-call цепочки, циклы по callback.
LOOP_LIMIT_EXCEEDED Цикл выполнился слишком много раз Ограничьте количество итераций, уберите зависимость от внешнего состояния без break.
OUTPUT_LIMIT_EXCEEDED Слишком много выходных VNode Уменьшите число узлов в рендере (например, path, polyline/circle вместо чрезмерного разбиения).
ARRAY_LIMIT_EXCEEDED Массив стал слишком длинным / индекс за пределами Ограничьте длины массивов в IR/данных.
STRING_LIMIT_EXCEEDED Строка слишком длинная Срежьте текстовые/динамические строки до приемлемого размера.
UNSAFE_HOST_VALUE / CYCLIC_HOST_VALUE Неподходящий тип или цикл в данных Не передавайте function/symbol/bigint, и избегайте циклических объектов.
FORBIDDEN_MEMBER, FORBIDDEN_MEMBER_CALL Блокирован доступ к опасным/неразрешённым методам Используйте только разрешённые методы, в т.ч. массивы только push, map (с callback виджета).
NULL_MEMBER_ACCESS / INVALID_MEMBER_ACCESS / INVALID_MEMBER_ASSIGNMENT / INVALID_PROPERTY_KEY / INVALID_ARRAY_PROPERTY Неверный доступ к . / [] Проверяйте null и корректность индексов/типов объектов.
CONST_ASSIGNMENT, TEMPORAL_DEAD_ZONE Изменение const/использование до инициализации Инициализируйте перед чтением, не меняйте const.
NOT_CALLABLE, INVALID_CALLBACK, UNKNOWN_BINDING Вызов не того значения как функции Проверьте, что вы вызываете только capability/function, а не plain-data/undefined.
INVALID_PLATFORM_ELEMENT Неверный платформенный элемент/данные Например, externalvideo только с поддерживаемым провайдером.
URL_FORBIDDEN, STYLE_URL_FORBIDDEN Небезопасный URL Проверьте протокол и политику isUrlAllowed (http/https/mailto + allowlist).
INVALID_JSX_CHILD, FUNCTION_PROP_FORBIDDEN, INVALID_STYLE, SVG_REFERENCE_FORBIDDEN Неправильный JSX-вывод Возвращайте корректные children/properties; не отдавайте функции в props.

3) Что важно помнить

  • Любые ошибки в evaluate обычно связаны с данными/ограничениями, а не с «разметкой».
  • Если появляется новая кодовая ошибка, ищите её сначала в widget-runtime — там источник правды для сообщений.
  • После фикса всегда делайте один прогон: save → render → resize → смена параметров → save.

4) Быстрый диагностический чек-лист

  1. Проверить версию языка и блок — widgetLanguageVersion = 2.
  2. Проверить useParams:
    • один вызов,
    • только статические поля,
    • корректные типы.
  3. Проверить теги/атрибуты/style на allowlist.
  4. Упростить тяжелые циклы/вычисления.
  5. Прогнать тестовый блок с изменением параметров и повторной компиляцией.