Никита Прокопов негодует (как обычно). Обновил npm на минор и вылез ворнинг





(node:45421) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use node --trace-warnings ... to show where the warning was created)





Я мимо пройти не мог и решил разобраться. Первопричина понятна — node 23 включил экспериментальную поддержку синхронного require() для ESM-модулей. Зачем нужен ворнинг? Потому что поддержка неполноценная и если прилетит ESM c top level await то всё полетит к чертям (и это очень опасный момент с которым пока непонятно как жить).



Ладно, ясно-понятно, экспериментальная версия node.js споткнулась. Завтра починят. Вроде бы ничего такого. Получается, Никита не прав, у нас всё относительно хорошо? Ну, не совсем.



Интересен другой момент — почему это случилось на миноре npm и как оно работает в обычной node без реквайра? А разгадка простая:



Во-первых supports-color апнули на мажор. Это модуль от Синдре. Ну вы понимаете. Синдре опять переписал всё на pure ESM



Второй момент, как же оно работает сейчас? А никак не работает. Там внутри в debug/src/node.js — try catch





try {

require('supports-color')

} catch (error) {

// Swallow - we only care if `supports-color` is available; it doesn't have to be.

}





И вот это уже печально. Апнули на сломанную версию, ошибок нет (они заглушены).



https://github.com/npm/cli/issues/7857