Код 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
  1. Определи, карта это подпутей или условия: смотри, начинаются ли ключи с точки.
  2. Условия перебирай по Object.entries(target), а не по массиву conditions.
  3. Среди шаблонов выбирай с самым длинным префиксом.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме