JSON

Monorepo allowScripts Merger

Слить allowScripts из нескольких package.json воркспейса в корневой без дублей.

Как это работает

В монорепозитории с npm workspaces у каждого пакета может быть свой package.json с собственными зависимостями, требующими install-скриптов, но под npm v12 итоговый allowScripts действует централизованно на уровне корневого package.json воркспейса, а не разрознен по пакетам. Monorepo allowScripts Merger online собирает allowScripts из нескольких package.json пакетов в один корневой блок без дублей.

Практическая проблема при миграции монорепозитория на npm v12 в том, что зависимости с install-скриптами (sharp, bcrypt, esbuild) могут повторяться в нескольких пакетах воркспейса с одной и той же версией, и вручную сверять, что корневой allowScripts не потерял ни одной нужной записи и не задублировал существующие, утомительно при количестве пакетов больше пяти-шести.

Инструмент принимает несколько блоков allowScripts (или целых package.json, из которых он их извлечёт) и объединяет их в один корневой объект, автоматически убирая точные дубликаты записей — если одна и та же пара пакет-версия встречается в нескольких пакетах воркспейса, в результате она попадёт один раз.

Частые вопросы

Почему allowScripts действует централизованно, а не по каждому пакету отдельно в монорепозитории?

npm v12 применяет allowScripts на уровне корневого package.json воркспейса при выполнении install-скриптов для всего дерева зависимостей, отдельные пакеты воркспейса не имеют собственного независимого allowlist.

Что если одна и та же зависимость указана с разными версиями в разных пакетах воркспейса?

Это разные записи в allowScripts (пакет с разными версиями пиннингуется отдельно для каждой), инструмент сохранит обе версии как независимые записи, а не сольёт их в одну, потому что approval версионно-специфичен по дизайну npm v12.

Нужно ли удалять allowScripts из package.json отдельных пакетов после слияния в корневой?

Практика зависит от структуры вашего workspace-менеджера, но обычно да — единственный источник истины должен быть в корне, чтобы не создавать путаницу, откуда реально берётся разрешение при установке.

Можно ли слить allowScripts сразу из десятка пакетов монорепозитория за одну операцию?

Да, ограничений по количеству входных блоков нет, кроме удобства работы с текстом ввода, для действительно большого монорепозитория стоит просто вставить все package.json подряд, разделяя пустой строкой.