Skip to content

v1.14.0

Choose a tag to compare

@vovkabelov vovkabelov released this 18 May 11:26
· 9 commits to main since this release

Полностью переработан baseline-check — модуль, который во время сборки и команды chef diag baseline ищет JavaScript- и CSS-фичи, не поддерживаемые целевыми браузерами.

Что было: список API ловился по хардкодному перечню staticMethods, globalApis, instanceMethodOwners — это означало, что каждое новое API проскальзывало мимо проверки, пока кто-то вручную не добавит его в список. Из-за этого RegExp.escape, Promise.try, Object.groupBy, Iterator.from и другие современные API оставались незамеченными, несмотря на устаревшие .browserslistrc-таргеты.

Что стало: проверка строится автоматически из двух источников:

  • @mdn/browser-compat-data — та же база, которой пользуется MDN для таблиц совместимости. Все статические методы, конструкторы, глобальные функции и instance-методы индексируются на старте. Различие static vs instance определяется по TC39 spec_url (формальный источник истины) с фолбэком на runtime-интроспекцию.

  • AST через @babel/parser — заменил построчное regex-сканирование. Поддерживает JS / TS / TSX / JSX / Flow, не реагирует на упоминания API в строковых литералах и комментариях, учитывает локальный shadowing (const Promise = bluebird, import { Promise } from 'bluebird' и т.д.).

  • Синтаксические фичи (?., ??, ??=, ||=, &&=, **, ...) теперь проверяются против bcd.javascript.operators через декларативный мост AST-узлов на BCD-ключи.

Дополнительно:

  • Чекер вынесен в отдельный модуль src/modules/baseline/, его используют и rollup-плагин, и команда chef diag baseline. Команда теперь принудительно включает baseline-проверку через extension.generate(), даже если в bundle.config она не включена явно.

  • Для instance-методов (например, .some() есть и у Array с ES5, и у Iterator с Chrome 122+) предупреждение появляется только когда метод не поддерживается ни одним из владельцев — иначе обычные .map() и .filter() ложно срабатывали бы в современных бандлах.

Покрытие тестами: добавлено 212 новых тестов в test/baseline/ (bcd-index, ast-walker, syntax-map, ignore, api-coverage, css-coverage, e2e). Существующие 58 тестов перенесены на новый API, добавлено 13 регрессионных кейсов. End-to-end тесты запускают chef diag baseline и chef build на временной репе, фиксируя реальное поведение для пользователя.


The baseline-check module — which detects JavaScript and CSS features unsupported by target browsers during chef build and chef diag baseline — has been completely rewritten.

Before: the API matcher relied on hardcoded lists (staticMethods, globalApis, instanceMethodOwners), so every new JavaScript API slipped past the check until someone added it to the list manually. As a result, RegExp.escape, Promise.try, Object.groupBy, Iterator.from and other modern APIs went undetected even with outdated .browserslistrc targets.

After: the check is built automatically from two sources:

  • @mdn/browser-compat-data — the same data MDN uses to render its compatibility tables. Every static method, constructor, global function, and instance method is indexed up front. Static vs instance is resolved through the TC39 spec_url (the formal source of truth) with a runtime introspection fallback.

  • AST via @babel/parser — replaces the line-based regex scan. Handles JS / TS / TSX / JSX / Flow, ignores API names inside string literals and comments, and respects local shadowing (const Promise = bluebird, import { Promise } from 'bluebird', etc.).

  • Syntax features (?., ??, ??=, ||=, &&=, **, ...) are now checked against bcd.javascript.operators via a declarative AST-node-to-BCD-key bridge.

Additionally:

  • The checker was extracted to a standalone src/modules/baseline/ module shared by the rollup plugin and the chef diag baseline command. The command now forces baseline checks via extension.generate() even when the bundle config does not opt in.

  • For instance methods (e.g. .some() exists on Array since ES5 and on Iterator since Chrome 122+), a warning is reported only when the method is unsupported on every owner — otherwise common iteration methods like .map() and .filter() would falsely trigger on modern bundles.

Test coverage: 212 new tests added under test/baseline/ (bcd-index, ast-walker, syntax-map, ignore, api-coverage, css-coverage, e2e). The existing 58 tests were migrated to the new module API and 13 regression cases were added. End-to-end tests spawn chef diag baseline and chef build against a fresh fixture repo to lock down the actual user-facing behaviour.