Не получается нормально импортировать соседний пакет из ESM-части монорепозитория.
У @repo/ui в package.json нет поля "type", а exports устроен так. "types": "./dist/index.d.ts", "import": "./dist/index.mjs", "require": "./dist/index.cjs". У пакета-потребителя "type": "module", а moduleResolution выставлен в nodenext.
Ладно, пишу import ui from '@repo/ui' и набираю ui(. Редактор говорит, что это значение нельзя вызвать. Набираю ui., и автодополнение предлагает default. (На этом месте уже смешно.) Меняю на ui.default(), проверка типов проходит, а при запуске Node выбирает условие import и загружает настоящий ESM-файл, где такого свойства нет.
Перечитываю справочник по модулям в TypeScript Handbook. Там сказано, что .d.ts считается CommonJS, если в ближайшем package.json нет "type": "module". Выходит, типы описывают CJS-модуль, а во время выполнения загружается ESM. Default import CJS-модуля из ESM отдаёт весь module.exports, отсюда и лишний слой default.
Как это починить аккуратнее всего? Выбираю между отдельным файлом объявлений для каждого условия и простым переводом пакета на ESM.