Код Senior Модули и npm обновлено
Разрешение поля exports в package.json
Условие
Напиши resolveExports(exportsField, subpath, conditions), упрощённый алгоритм Node для поля exports:
subpathэто'.'или'./что-то';conditionsмассив активных условий, например['node', 'import', 'default'].- Если
exportsFieldстрока, она отвечает только за'.'. - Если это объект, ключи которого начинаются с
., это карта подпутей; иначе весь объект это условия для'.'. - Цель подпути: строка (путь), объект условий или
null(подпуть явно закрыт). - Объект условий обходится в порядке ключей объекта, берётся первый ключ, который есть в
conditions; его значение разрешается рекурсивно (может снова быть объектом условий). Если ни один не подошёл, результата нет. - Шаблон
'./features/*'с целью'./src/features/*.js': звёздочка подставляется. Точное совпадение важнее шаблона.
Верни строку-путь или null, если подпуть не экспортирован.
Примеры
resolveExports("./index.js", ".", ["node", "import"]) // "./index.js"
resolveExports("./index.js", "./utils", ["node"]) // null
resolveExports({"import":"./esm/index.mjs","require":"./cjs/index.cjs"}, ".", ["node", "require", "default"]) // "./cjs/index.cjs"
Как подойти
Подсказки: 3
- Определи, карта это подпутей или условия: смотри, начинаются ли ключи с точки.
- Условия перебирай по
Object.entries(target), а не по массивуconditions. - Среди шаблонов выбирай с самым длинным префиксом.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Порядок инициализации модулей и поиск цикла
Следующий вопрос
semver: проверка ^ и ~ диапазонов