В январе автор colors и faker сломал оба пакета намеренно. faker 6.6.6 вышел без кода, а colors начал бесконечно печатать “LIBERTY LIBERTY LIBERTY”. Это задело всех, у кого установка подтянула новую версию. Ещё в ноябре 2020 года он написал на GitHub, что бесплатной работы от него больше не будет. В тредах, которые я прочитал, спорили в основном о том, имел ли он на это право. У меня был другой вопрос и ответа на него не было. Кто поддерживает пакеты в моей папке node_modules и платит ли им кто-нибудь?
С версии 6.13 в 2019 году npm после установки печатает “N packages are looking for funding”. Я всегда пролистывал эту строку. Поэтому решил посчитать, пока год не кончился.
Что я взял
Список я взял из npm-high-impact 1.1.0 от ноября 2022 года. Его автор собрал пакеты, которые подходят под определение high impact из npm. Я взял из него часть с миллионом скачиваний в неделю и больше, это 4366 пакетов. Для каждого взял самую новую стабильную версию, опубликованную до 28 декабря 2022 года. Из этой версии я взял аккаунты npm с правом её публиковать и README из её тарбола. Так что README показывает то, что авторы писали в этом году. Скачивания я брал из API npm за период с 1 января по 27 декабря 2022 года. Для 4 пакетов с именами из 2 букв (yn, pn, rx, is) API отдаёт ноль. Осталось 4362, вместе у них 2,0 триллиона скачиваний.
До первого числа я записал, чего жду. Больше половины скачиваний дают пакеты с 1 или 2 мейнтейнерами. Меньше трети пакетов просят денег. А на Open Collective, где деньги, полученные проектом, видны публично, выходит меньше 1 доллара на миллион скачиваний.
Кто их держит
У медианного пакета в списке 2 мейнтейнера. Ровно 1 мейнтейнер у 2086 пакетов, это 48% списка. На них приходится 47% всех скачиваний. Пакеты с 1 или 2 мейнтейнерами дают 65% скачиваний, так что первое ожидание подтвердилось.
Потом я считал аккаунты, а не пакеты. Выбирал их жадно: сначала аккаунт, пакеты которого дают больше всего скачиваний, потом тот, который добавляет больше всего новых скачиваний и так далее. Пакет считается покрытым, когда выбран хотя бы один из его мейнтейнеров. 3 аккаунта покрывают четверть всех скачиваний, а 12 аккаунтов хватает на половину. Один аккаунт, sindresorhus, числится мейнтейнером у 274 пакетов с 14% всех скачиваний. На 222 из них он единственный. Среди них has-flag и find-up.
Аккаунт npm это не человек. 170 пакетов с 1 мейнтейнером принадлежат “types”, боту, который публикует DefinitelyTyped. “fb” публикует пакеты React и Jest. Медианному пакету с 1 мейнтейнером 7 лет. 1579 таких пакетов старше 5 лет. Как минимум у 460 из этих старых пакетов в этом году вышла новая версия.
Что они пишут
У 731 пакета в package.json есть поле funding. Именно его читают npm fund и строка после установки. Вместе со ссылками на спонсорство в README выходит 812 пакетов, 19% списка и 26% скачиваний. Второе ожидание подтвердилось. Чаще всего ссылаются на GitHub Sponsors, это 478 пакетов, на Open Collective 302. Ещё 205 README упоминают подписку Tidelift. Tidelift продаёт компаниям подписку, поэтому просьбой о деньгах я её не считал.
Я искал в README слова о людях, которые стоят за кодом: volunteers, free time, spare time, hobby project, not backed by a company. Мой список слов нашёл 13 пакетов из 4362. Когда я прочитал другие README, увидел, что список часть пропускает. ioredis, например, пишет, что открытый код это тяжело и отнимает много времени. Так что их не меньше 13 из 4362. Вот некоторые.
core-js, 2,1 миллиарда скачиваний в этом году, один мейнтейнер. Над текстом стоит заголовок “As advertising: the author is looking for a good job”, а дальше:
core-jsisn’t backed by a company, so the future of this project depends on you.
webpack:
Most of the core team members, webpack contributors and contributors in the ecosystem do this open source work in their free time.
msw, созданный в 2018 году, 61 миллион скачиваний:
Despite that, this library remains a hobby project maintained in spare time
В том же предложении сказано, что проект не может оплатить даже одному контрибьютору работу на полную ставку.
У core-js есть ещё скрипт postinstall, который печатает ту же просьбу в терминал. Я поставил пакет через npm 6.14 и просьба появилась. Через npm 8.19 её не было, потому что npm 7 и новее прячут вывод скриптов установки. Строку про funding напечатали оба.
Сколько денег видно
Open Collective публикует бухгалтерию каждого коллектива. Я спросил у его API, сколько получил в 2022 году каждый коллектив, на который ссылаются эти пакеты.
Первая сумма вышла почти в 2 миллиона долларов и выглядела слишком хорошо. Потом я увидел в списке airbnb с 200 000 и salesforce с 44 000. Это фонды, которые дают деньги. Их логотипы стоят в списке спонсоров в README eslint, а моя регулярка брала любую ссылку на Open Collective. Я оставил только аккаунты с типом COLLECTIVE и убрал 3 ссылки, которые указывают на чужой проект в примере. После этого вышло 1,65 миллиона долларов на 75 коллективов. На них ссылаются 286 пакетов с 5% всех скачиваний.
Это 16 долларов на миллион скачиваний. Я ждал меньше 1, так что здесь ошибся больше чем в 10 раз.
5 крупнейших коллективов (babel, eslint, socketio, webpack, nest) получили 53% денег. 38 самых маленьких вместе получили 23 824 доллара за весь год, а 25 коллективов получили меньше 1000 долларов каждый. Коллектив core-js получил 11 377 долларов. На него ссылаются 3 пакета, у которых вместе 3,8 миллиарда скачиваний. Это около 3 долларов на миллион.
Пакетов с 1 мейнтейнером на этой картине почти нет. Только 3% их скачиваний приходится на пакеты, которые ссылаются хоть на какой-то коллектив. Денег вообще просят 481 из 2086, из них 386 через GitHub Sponsors. GitHub Sponsors суммы не публикует, поэтому для этих пакетов числа у меня нет.
Что я не проверял
Деньги от работодателей. Некоторым мейнтейнерам за эту работу платит работодатель. Например, команда npm CLI в GitHub: её аккаунты darcyclarke и nlf тоже есть в списке. npm такие деньги не показывает, а в README упоминаний о них я не искал.
Суммы на GitHub Sponsors и Patreon не публичны, я считал только ссылки. Скачивания включают CI и зеркала, это не люди. Деньги коллектива идут на весь проект. Я делил их только на скачивания пакетов из моего списка, которые на него ссылаются, поэтому доллары на скачивание скорее завышены. MUI в сумму не попал: его README ссылается на адрес, который API не распознал.