Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Фронт: Добавить offset в SugarSS

Для новичков, задача на пару дней

PostCSS был переведен c line/column на offset.

Теперь надо такую же задачу сделать для [SugarSS], парсера альтернативного синтаксиса для PostCSS. Этот синтаксис строится на отступах — как Sass в SCSS. Поэтому он имеет другой парсер.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить поддержку focusgroup в KeyUX

Для новичков, задача на пару дней

KeyUX — JS-библиотека, которая добавляет хороший UX работы с клавиатуры на сайт.

Один из паттерном — группы фокуса, когда :focus внутри какой-то группы (например, вкладок или меню) перемещается стрелками, а не Tab.

KeyUX добавялет такое поведение смотря на свойство role, но эти роли ограничены и не подходят для всех сценариев. В веб-сообществе есть идея добавить свойство focusgroup в спецификацию HTML для таких вещей.

Задача — добавить ограниченную поддержку focusgroup в дополнение к role.

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Выводить время с последнего обновления caniuse-lite

Для новичков, задача на пару дней

Browserslist предупреждает, когда caniuse-lite (с базой браузеров) давно не обновляли.

Надо в это предупреждение добавить время с последнего обновления caniuse-lite. За время последнего обновления можно взять время последнего релиза браузера в базе данных.

Browserslist: caniuse-lite is 15 month old. Time to run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Польза: строка в резюме с PR в популярный проект.

Фронт: Выводить только часть строки в ошибке PostCSS

Для новичков, задача на пару дней

PostCSS, в случае синтаксической ошибки, показывает строку, где она произошла.

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

В таком случае надо выводить лишь 20 символов до начала ошибки и 20 символов после конца.

Польза: строка в резюме с PR в популярный проект.

Фронт: Попробовать перевести цветовой миксер OKLCH на @texel/color

Для новичков, задача на пару дней

Вышла новая библиотека для работы с цветов в JS.

Нужно попробовать перевести рендер графиков в цветовом миксере OKLCH на неё.

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить видео-пример в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

У нас есть набор функций, но нет видео, которое бы показывало их в действии.

Нужно помочь сделать запись экрана.

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить историю в OKLCH Color Picker

Для новичков, задача на пару дней

Нужно добавить поддержку ⌘+Z и ⌘+Shift+Z в OKLCH Color Picker. Пользователь должен иметь возможность отменить и повторить последние изменение цвета.

Польза: строка в резюме с PR в популярный проект, которая показывает знание JS.

Фронт: Добавить поддержку Bun в Browserslist

Для новичков, задача на пару дней

Bun — альтернатива Node.js и npm. В том числе, она может устанавливать JS-зависимости, создавая свой собственный bun.lockb файл.

В Browserslist есть скрипт update-browserslist-db, который обновляет caniuse-lite в проекте, чтобы использовалась свежая база данных браузеров.

Сейчас update-browserslist-db поддерживает только npm, pnpm, yarn. Нужно добавить поддержку Bun.

Польза: строка в резюме с PR в популярный проект, которая показывает знание Node.js.

Фронт: Перевести Nano ID на Tinybench

Для новичков, задача на пару дней

Tinybench — минималистичная система бенчмарков для Node.js. Она отлично вписывается в философию Nano ID, так как имеет мало зависимостей.

Нужно попробовать перевести бенчмарк Nano ID с benchmark на tinybench.

Польза: строка в резюме с PR в популярный проект, которая показывает знание Node.js.

Фронт: Добавить поддержку большего количества элементов с role в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

Например, он добавляет для списков с role="menu" (табы, меню навигации) навигацию стрелочками. Так, вместо огромного списка для Tab-навигации, у нас выделяются изолированные блоки, между которыми мы перемещаемся Tab-ом, а внутри — стрелочками.

Но такая навигация нужна не только role="menu", но и многим другим role (но у каждой немного отличается поведение, будьте внимательны).

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить горячий клавиши для списка в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

Например, KeyUX автоматически находит, какую кнопку нужно нажать при нажатии горячий клавиши, в зависимости от aria-keyshortcuts у кнопок.

Сейчас KeyUX ищет самую первую кнопку с нужным aria-keyshortcuts, но это не работает для списка, где у каждого элемента своя кнопка с одной и той же горячей клавишей.

<li tabindex="0">
  Item 1
  <button aria-keyshortcuts="v">Validate</button>
</li>
<li tabindex="1">
  Item 1
  <button aria-keyshortcuts="v">Validate</button>
</li>

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить поиск элемента в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

Например, он добавляет для списков с role="menu" (табы, меню навигации) навигацию стрелочками. Так вместо огромного списка для Tab-навигации у нас получается такие изолированные блоки — между которыми мы перемещаемся Tab-ом, а внутри стрелочками.

Но сейчас у нас нет одной удобной функции, которая требуется для role="menu".

Нужно чтобы, когда пользователь начал вводить первые буквы элемента списка, фокус переместился на этот элемент. Примерно, как работает <select> или Ariakit.

Польза: строка в резюме, которая показывает знание технологий доступности.

Фронт: Добавить в postcss-dark-theme-class поддержку light-dark()

Для новичков, задача на пару дней

postcss-dark-theme-class позволяет переключать тему сайта через установку HTML-класса в JS и описывать в CSS темную тему в @media (prefers-color-scheme: dark).

В CSS скоро добавится новый способ указывать варианты для светлой и темной темы через light-dark():

a {
  color: light-dark(black, white);
}

Нужно добавить в плагин поддержку этой новой функции, чтобы плагин генерировал CSS вида:

:where(html.is-dark) a {
  color: black;
}
:where(html.is-dark) a {
  color: white;
}

Польза: строка в резюме с PR в популярный проект.

Фронт: Переписать Size Limit на Vitest и ESM

Для новичков, задача на пару недель

Size Limit — это CLI-приложение для Node.js.

Сейчас оно использует CommonJS с require(). Нужно переписать его на ES-модули с import. Поскольку Jest плохо работает с ESM, нужно будет еще переписать тесты на Vitest.

Польза: строка в резюме, которая показывает знание Node.js.

Фронт: Добавить авто-исправление для ESLint-правила uvu/prefer-is-for-primitives

Для новичков, задача на пару дней

uvu — минималистичная система юнит-тестов для Node.js.

Для нее есть плагин для ESLint — eslint-plugin-uvu/. В этом плагине есть правило uvu/prefer-is-for-primitives; ему нужно добавить возможность авто-исправления кода при запуске eslint --fix.

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Добавить в eslint-plugin-uvu правило обнаружения забытого test.only

Для новичков, задача на пару дней

uvu — минималистичная система юнит-тестов для Node.js. Самый простой тест в ней выглядит так:

import { test } from 'uvu'

test('something', () => {})

test('another', () => {})

test.run()

Можно заставить uvu выполнять только один тест (например, для целей отладки), заменив test() на test.only(). Но легко потом забыть заменить test.only() на test() обратно.

Надо написать правило в eslint-plugin-uvu, которое будет предупреждать пользователя о забытом test.only(). Правило не надо делать auto-fixable, иначе во время отладки тестов test.only() будет убираться по сохранению файла.

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Добавить в eslint-plugin-uvu правило, которое будет обнаруживать забытый test.run()

Для новичков, задача на пару дней

uvu — минималистичная система юнит-тестов для Node.js. Самый простой тест в ней выглядит так:

import { test } from 'uvu'

test('something', () => {})

test('another', () => {})

test.run()

В конце каждого файла с тестами нужно писать test.run(), чтобы каждый файл теста был само-исполняемым файлом (node index.test.js). Но test.run() легко забыть.

Надо написать правило в eslint-plugin-uvu, которое будет предупреждать пользователя о забытом test.run().

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Сделать минималистичный плагин для ESLint для префикса node: в импортах

Для новичков, задача на пару дней

В Node.js можно добавлять node:-префикс, чтобы показать, что мы имеем в виду встроенный в Node.js модуль, а не npm-пакет.

import { writeFileSync } from 'node:fs'

Но при разработке легко забыть добавить этот префикс. Хочется иметь правило в ESLint, которое будет гарантировать, что префикс есть во всех нужных местах.

Такое правило есть в eslint-plugin-unicorn, но этот плагин идет с множеством лишних подзависимостей. Хочется иметь какое-то минималистичное решение.

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Добавить preferred-color-scheme: light в postcss-dark-theme-class

Для новичков, задача на пару дней

PostCSS-плагин postcss-dark-theme-class позволяет сделать темную и светлую тему для сайта полностью на CSS.

Для этого он копирует содержимое @media (preferred-color-scheme: dark) в html.is-dark.

Нужно добавить поддержку @media (preferred-color-scheme: light).

Польза: строка в резюме с PR в популярный проект.

Фронт: Ускорить OkColor

Для новичков, задача на неделю

OkColor — это Figma-плагин для работы с OKLCH.

Но этот color picker не использует оптимизации color picker’а Марсиан, поэтому работает медленно. В итоге автору пришлось снизить разрешение <canvas>, что заметно.

Нужно перенести оптимизации из color picker’а Марсиан и поднять разрешение.

Польза: строка в резюме, которая покажет знание API Figma и сложных JS-задач.

Фронт: Добавить поддержку BFcache в Nano Stores Persistent

Для уверенных в себе, задача на день

Nano Stores Persistent — умный стор, который синхронизирует данные с localStorage.

В современных браузерах есть Back-Forward Cache, который позволяет восстанавливать страницу из кэша при нажатии кнопок Назад/Вперед. Он сохраняет на диск снимок памяти страницы и при нажатии Назад мгновенно показывает страницу из кэша.

Но если на следующей странице пользователь изменил что-то в localStorage, то при нажатии Назад страница восстановится из кэша, но данные в умном сторе останутся старыми. Нужно добавить среду для тестирования и событие pageshow, которое будет доставать обновление из localStorage.

Польза: строка в резюме, которая доказывает знание продвинутых инструментов TypeScript.

Фронт: Добавить автовыведение типов в Nano Stores I18n

Для уверенных в себе, задача на неделю

Nano Stores I18n имеет функцию param() для создания строк перевода, в которых есть параметры:

export const messages = i18n('post', {
  published: params<{ at: string }>('Was published at {at}')
})

Сейчас нужно явно указывать (через <{ at: string }>), какие параметры есть в строке перевода.

Но новый TypeScript умеет парсить строки и выводить типы из них.

Польза: строка в резюме, которая доказывает знание продвинутых инструментов TypeScript.

Фронт: Починить параллельное выполнение скриптов в pnpm

Для уверенных в себе, задача на неделю

pnpm умеет выполнять скрипты параллельно (и даже дает крутой UI для объединения вывода):

❯ pnpm test
> pnpm run --recursive --include-workspace-root /^test:/

Scope: all 2 workspace projects
. test:js$ eslint .
└─ Running...
. test:styles$ stylelint **/*.css **/*.svelte
└─ Done in 640ms
. test:types$ tsc --noEmit
└─ Done in 72ms
. test:audit$ pnpm audit --prod
│ No known vulnerabilities found
└─ Done in 3s1s
web test:run$ c8 pnpm unit
└─ Done in 3.6s
│ • • • •   (4 / 4)
└─ Done in 3.1s
web test:check$ svelte-check
│ svelte-check found 0 errors and 0 warnings
└─ Done in 1.7s

Этот инструмент создавался в основном с прицелом на запуск одной и той же задачи в нескольких проектах монорепозитория (аргумент --recursive). Однако, его можно использовать и в одном проекте (--parallel), запуская задачи через регулярные выражения (/^test:/).

Не работают две вещи:

Польза: строка в резюме с PR в популярный проект.

Фронт: Обновить генерацию API для postcss.org

Для уверенных в себе, задача на неделю

Сайт PostCSS имеет страницу с API всех классов.

Мы генерируем эту страницу с помощью скрипта из AST TypeDoc. Но, недавно, генерация сломалась после того, как:

  1. Мы перешли на хитрый экспорт типов, чтобы починить TypeScript без breaking change.
  2. В новой версии TypeDoc немного поменялся AST.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить линии на месте срезов на 3D-модель в цветовой миксер OKLCH

Для уверенных в себе, задача на неделю

Цветовой миксер OKLCH показывает отдельно 3D-модель цветового пространства и 3 среза. Хотелось бы соединить срезы с 3D-моделью.

Например, можно нарисовать тонкую линию на 3D-модели — там, где находятся текущие срезы.

Польза: строка в резюме с PR в популярный проект.

Фронт: Вернуть OffscreenCanvas в цветовой миксер OKLCH

Для уверенных в себе, задача на неделю

В цветовом миксере OKLCH самая долгая операция — рисование на <canvas>. Сейчас это происходит в том же потоке, в котором работает браузер, поэтому пользователь может видеть «фризы».

Задача состоит в том, чтобы добавить Web Worker и перенести рисование по <canvas> в OffscreenCanvas. Сложность в том, что браузер Safari до сих пор не поддерживает OffscreenCanvas: для него нужно будет сохранить старый подход с главным потоком.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить паралелльный рендеринг в цветовой миксер OKLCH

Для уверенных в себе, задача на неделю

В цветовом миксере OKLCH самая долгая операция — рисование на <canvas>. Есть идея, как ее ускорить: несколько веб-воркеров будут генерировать ImageBitmap для своей части графика.

Польза: строка в резюме с PR в популярный проект.

Фронт: Решить проблему ромбовидных зависимостей в Nano Stores

Для уверенных в себе, задача на неделю

«Diamond problem», или проблема ромбовых зависимостей — это непредсказуемое поведение реактивных сторов, у которых зависимости строятся так:

┏━▶ C ━┓
┃      ▼
A      D
┃      ▲
┗━▶ B ━┛

В «правильных» системах, при изменении стора A, сначала пересчитываются сторы B и C, и только потом D.

В Nano Stores обнаружена проблема с тем, что при некоторых ситуациях пересчет идет непредсказуемо. Нужно разобраться и придумать решение.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить 3D-версию пространства OKLCH

Для уверенных в себе, задача на неделю

В нашем цветом миксере OKLCH мы показываем цветовое пространство OKLCH в виде 3-х срезов. Но само пространство трехмерное. Хочется добавить 3D-отображение с возможностью покрутить его мышкой.

Польза: строка в резюме с PR в популярный проект.

Бэк: Альтернативная реализация gRPC сервера для AnyCable (PoC)

Для продвинутых, задача на пару дней

AnyCable использует gRPC для коммуникации между сервером веб-сокетов и Ruby приложением. Официальная библиотека для работы с gRPC в Ruby является сложной оберткой над библиотекой на C и имеет проблемы с поддержкой (отставание от версий Ruby, баги, которые медленно закрываются, регрессии производительности).

Компания Cookpad разрабатывает альтернативный SDK для работы с gRPC в Ruby: grpc_kit.

Задача — попробовать переписать RPC сервер AnyCable на grpc_kit.

Польза: познакомиться с AnyCable и gRPC, принести пользу сообществу.

Бэк: Добавить интеграцию с Doppler в Anyway Config

Для новичков, задача на неделю

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).

Doppler — это сервис для управления секретами, который позволяет командам держать конфигурационные данные в едином (и безопасном) месте.

Задача — добавить возможность загружать данные из Doppler в Anyway Config.

Польза: познакомиться с Anyway Config и Doppler, принести пользу сообществу.

Бэк: Поддержка партиционированных таблиц в Logidze

Для продвинутых, задача на пару дней

Logidze позволяет работать с версиями объектов Active Record моделей и историей их изменений, хранящейся в виде инкрементального лога в отдельной колонке таблицы БД.

Лог изменений генерируется автоматически с помощью триггеров в БД, а конкретно, с помощью BEFORE триггеров. К сожалению, данный тип триггеров не работает для партиционнированных таблиц.

Необходимо добавить альтернативный режим работы Logidze — через AFTER триггеры.

Польза: познакомиться с Logidze, погрузиться в PostgreSQL, принести пользу сообществу.

Бэк: Ruby Next: возможность перезаписывать оригинальный файл

Для новичков, задача на пару дней

Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции языка в совместимые со старыми версиями Ruby и альтерантивными имплементациями.

Один из режимов работы Ruby Next — это создание новых, транспилированных, файлов из исходных кодов с помощью CLI. Например:

$ ruby-next nextify lib/anycable/config.rb --single-version -o tmp/transpiled.rb -V
RubyNext core strategy: refine
RubyNext transpile mode: rewrite
Generated: tmp/transpiled.rb

В некоторых случаях удобнее не создавать новую копию файла, а переписывать оригинал. Необходимо добавить такую возможность.

Польза: познакомиться с Ruby Next, попрактивоваться в написании и тестировании CLI, принести пользу Ruby-сообществу.

Бэк: Добавить интеграцию с ejson в Anyway Config

Для новичков, задача на неделю

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).

EJSON — это библиотека для хранения конфигурации в зашифрованном виде прямо в репозитории, разрабатываемая Shopify. Функционал похож на Rails Credentials, но имеет важные отличия:

  • библиотека языко-независимая (используется CLI);
  • шифруются только значения, но не ключи; таким образом, уменьшается риск merge конфликтов и повышается читаемость.

Задача — добавить возможность загружать данные из ejson-файла в Anyway Config.

Польза: познакомиться с Anyway Config и EJSON, принести пользу сообществу.

Фронт: Добавить исправление проблем в Browserslist Lint

Для новичков, задача на неделю

Browserslist Lint — инструмент проверки конфига Browserslist на популярные ошибки.

Было бы хорошо добавить автоматическое исправление ошибок в JS API и использовать его на сайте Browserslist.

Как исправлять каждое правило:

  • missedNotDead: добавить not dead в конец запроса.
  • countryWasIgnored: добавить >0.3% в начало (или заменить другой запрос >x%).
  • limitedBrowsers: добавить в конец 2 versions, not dead.
  • alreadyDead: убрать найденные мёртвые браузеры.

Польза: строка в резюме с PR в популярный проект.

Фронт: Скрипт, который находит все указания цвета в CSS и переводит их на oklch()

Для новичков, задача на неделю

Нужно выпустить npm-пакет, который можно будет запустить через npx.

После запуска он будет проходить по всем переданным файлам, искать в них цвета в форматах типа #cc0000, rgb(255, 255, 255), hsl(0 10 10 / 0.2), и заменять их на цвет в формате oklch().

npx convert-to-oklch **/*.css

Польза: получить опыт работы с Node.js.

Фронт: Перевести postcss-load-config на uvu

Для новичков, задача на неделю

postcss-load-config использует Jest для юнит-тестов. Но из-за слабой поддержки ESM в Jest, проект не может добавить поддержку ESM-конфигов.

Нужно перевести проект на uvu.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить правило для проверки цветового пространства в Stylelint

Для уверенных в себе, задача на пару недель

В новом CSS для указания цвета есть функции lch(), lab(), oklch() и oklab(). Проблема в том, что в этих функциях можно указать цвет, который не будет виден для глаза или для конкретного монитора. В Stylelint (линтер для CSS) надо добавить новое правило, чтобы предупреждать, что цвет вышел за пределы.

Цвета можно разделить на:

  1. Видимые на sRGB-мониторах (старые обычные цвета).
  2. Видимые на P3-мониторах. Таких мониторах сейчас очень мало. Правила с такими цвета надо оборачивать в @media (color-gamut: p3).
  3. Видимые на Rec2020-мониторах. Таких мониторов пока нет на рынке. Но на будущее их можно указать, обернув правила в @media (color-gamut: rec2020).
  4. Цвета, не видимые глазом человека.

Если цвет в невидимом спектре или вне sRGB, но не обернут в медиа-выражение — правило должно возвращать предупреждение.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить automerge в CI node-build

Для новичков, задача на пару недель

node-build — скрипт для сборки версий Node.js. Он используется в разных менеджерах контроля версий Node.js, например, в asdf.

Когда выходит новая версия Node.js, бот nodenv-bot присылает PR в node-build с файлами новой версии. Есть пример такого PR. К сожалению, у мейнтейнеров может ути несколько дней, чтобы вмержить его.

Можно добавить скрипт в GitHub Action CI, который будет автоматически мержить PR от nodenv-bot после прохождения тестов.

Польза: получить опыт работы с CI.

Фронт: Добавить типы в culori

Для уверенных в себе, задача на пару недель

Нужно добавить типы в culori, библиотеку для работы с цветом.

Автор библиотеки хотел бы добавить типы не через .d.ts-файлы, а через JSDoc-комментарии в JS-файлах.

Польза: получить опыт работы с TypeScript.

Помогли
Alexander Baygeldin
 Alexander Baygeldin
Igor Platonov
 Igor Platonov
Maksim Shendrik
 Maksim Shendrik

Бэк: Создать Ruby gem для обнаружения потенциальных распуханий памяти

Для уверенных в себе, задача на неделю

Необходимо написать инструмент для Ruby-стека, который будет обнаруживать участки кода, способные вызвать memory bloat.

Польза: разобраться с тем, как Rails работает с I/O; написать инструмент, которым будет активно пользоваться Ruby-сообщество.

Фронт: Перевести logux.org на Vite

Для уверенных в себе, задача на пару недель

Сейчас logux.org использует Parcel для сборки сайта — он генерирует HTML-шаблон и ассеты, которые потом наполняет другой скрипт.

Нужно перевести проект на Vite — чтобы увеличить скорость сборки и уменьшить размер node_modules.

Польза: получить open source портфолио на Node.js.

Фронт: Перевести postcss.org на Vite

Для уверенных в себе, задача на пару недель

Сейчас postcss.org использует Parcel для сборки сайта — он генерирует HTML-шаблон и ассеты, которые потом наполняет другой скрипт.

Нужно перевести проект на Vite — чтобы увеличить скорость сборки и уменьшить размер node_modules.

Польза: получить open source портфолио на Node.js.

Фронт: Сократить количество зависимостей в Astroturf

Для новичков, задача на неделю

Astroturf страдает от большого количества зависимостей. В node_modules он занимает 18 МБ и загружает под сотню подзависимостей.

Кажется, что их не должно быть сложно почистить.

Польза: получить open source портфолио на Node.js.

Бэк: Поддержка окружений в Anyway Config

Для новичков, задача на пару дней

Альтернативное решение от @deflexor.

Гем anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).

Сейчас в геме есть поддержка окружений (development, production) только для Rails приложений (и только для загрузки данных из YAML файлов).

Однако понятие «окружения» имеет смысл не только в контексте Rails или даже других веб-фреймворков.

Предлагается добавить поддержку окружений в основную часть (а не только в Rails расширение).

Польза: познакомиться с Anyway Config, попробовать поработать с RBS (проект покрыт типами), принести пользу Ruby сообществу.

Бэк: GraphQL RuboCop: добавить коп для обнаружения неиспользуемых аргументов

Для новичков, задача на пару дней

rubocop-graphql — Ruby gem, проверяющий соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп UnusedArgument, предотвращающий объявление полей, не используемых в resolve.

Польза: научиться писать копы для rubocop, принести пользу Ruby-сообществу.

Фронт: Перевести Logux Server на pino 7

Для уверенных в себе, задача на пару недель

Нужно обновить pino в Logux Server. Главная проблема в том, что нужно переписать humanFormatter на Pino Transports.

Польза: получить open source портфолио на Node.js.

Фронт: Сделать минималистичный аналог lint-staged

Для новичков, задача на неделю

lint-staged позволяет запускать тесты/форматеры на измененных файлах в pre-commit-хуке.

Это отличный инструмент, но 7 МБ много для ее простой утилитарной функции. Хочется иметь минималистичный аналог, пусть и ценой потери функционала.

Что аналог должен уметь:

  1. Ваш инструмент будет запускать, например, simple-git-hooks.
  2. Инструмент находит, какие файлы изменены в коммите.
  3. Инструмент берет конфиг и получает список команд для паттерна файлов вида "*.js": ["eslint", "prettier"].
  4. Запускает указанные команды.

Чем можно пожертвовать:

  1. Поиском конфига. Пусть путь к конфигу будет указываться в конфиге simple-git-hooks вида "pre-commit": "./node_modules/.bin/nano-staged ./package.json".
  2. Поддержкой частично добавленных файлов, когда коммитят только несколько строк через git add -p — для них можно не запускать скрипты (предупредив об этом в документации и в выводе в консоль при коммите).
  3. Вывод в терминал можно сделать сильно проще.
  4. Можно даже просить пользователя указать прямой путь к исполняемому файла обработчика: "*.js": "./node_modules/.bin/prettier".

Задача — создать новый проект минималистичного аналога lint-staged.

Польза: получить open source портфолио на JS.

Фронт: Добавить частичную загрузку переводов Nano Stores I18n

Для новичков, задача на неделю

Сейчас Nano Stores I18n загружает все переводы для выбранного языка сразу. Разработчик должен передать функцию вида:

get (locale) {
   return fetch(`/translations/${locale}.json`)
}

Но было бы круто иметь тут опциональный аналог tree-shaking, чтобы грузить переводы блоками — только те блоки, который нужны для используемых на странице компонентов.

Например, разработчик может ввести правило давать имена компонентам (которые используются в функции перевода) вида main/post или settings/user. Переводы он тоже будет хранить блоками, объединяя компоненты с одинаковым префиксом: translations/ru/main.json или translations/settings/ru.json.

В get I18n будет передавать имена всех компонентов, для которых не хватает перевода. Тогда разработчик может передать такую функцию:

get (locale, components) {
   return Promise.all(
    components
      .map(name => name.split('/')[0])
      .unique()
      .map(chunk => fetch(`/translations/${locale}/${chunk}.json`))
  )
}

Польза: получить open source портфолио на JS.

Фронт: Добавить прeпроцессоры в Nano Stores I18n

Для новичков, задача на неделю

Nano Stores I18n — библиотека для перевода приложений.

Есть интересная идея: добавить процессоры в переводы. Например, на базе этих препроцессоров можно сделать смену перевода при смене ширины экрана.

// stores/i18n.js
import { atom, onMount } from 'nanostores'
import { createI18n, sizePreprocessor } from '@nanostores/i18n'

const screenSize = atom('big')
onMount(screenSize, () => {
  let media = window.matchMedia('(min-width: 600px)')
  function check () {
    screenSize.set(media.matches ? 'big' : 'small')
  }
  media.addEventListener('change', check)
  () => {
    media.removeEventListener('change', check)
  }
})

size.setSource(screenSize)

export const i18n = createI18n(locale, {
  get:,
  preprocessors: [
    sizePreprocessor
  ]
})

Надо отправить PR в Nano Stores I18n с реализацией препроцессоров.

Польза: получить open source портфолио на JS.

Фронт: Перевести Browserslist с Jest на uvu

Для новичков, задача на неделю

Я медленно начал переводить свои проекты на фреймворк тестов uvu. Предлагается помочь с переходом репозитория Browserslist на uvu.

Польза: строка в резюме с PR в популярный проект.

Фронт: Перевести PostCSS с Jest на uvu

Для новичков, задача на неделю

Я медленно начал переводить свои проекты на фреймворк тестов uvu. Предлагается помочь с переходом репозитория PostCSS на uvu.

Польза: строка в резюме с PR в популярный проект.

Бэк: Поддержка Action Policy для гема ckeditor

Для новичков, задача на пару дней

Гем ckeditor позволяет легко и просто интегрировать популярный WYSIWYG текстовый редактор CKEditor в Ruby on Rails приложения.

Данная интеграция в том числе позволяет прикреплять картинки и произвольные файлы к тексту, что требует установки защиты на стороне сервера — авторизации.

Сейчас гем ckeditor предлагает из коробки интеграции с такими библиотеками, как Pundit и CanCanCan. Помимо них в мире Ruby есть ещё один инструмент для авторизации, который набирает популярность, — Action Policy.

Предлагается добавить поддержку Action Policy в гем ckeditor.

Польза: познакомиться с CKEditor и Action Policy, принести пользу Ruby сообществу.

Фронт: Добавить плагин @size-limit/esbuild

Для новичков, задача на неделю

Когда Size Limit проверяет размер библиотеки, он собирает ее с помощью webpack, чтобы оценить влияние добавления библиотеки на webpack-проект.

Но esbuild становится все популярнее. К тому же, он весит меньше, работает быстрее и позволяет получить оценку размера, которая все равно будет применима и для webpack-проекта (с небольшой погрешностью).

Нужно создать плагин для Size Limit, который будет использовать esbuild вместо webpack.

Польза: строка в резюме с PR в популярный проект.

Фронт: Уменьшить размер @size-limit/webpack

Для новичков, задача на неделю

Сейчас @size-limit/webpack весил 70 МБ. Большая часть размера идет от функций, которые очень редко нужны — опции --why и поддержки CSS.

Нужно вынести их в отдельные плагины @size-limit/webpack-why и @size-limit/webpack-css.

Польза: строка в резюме с PR в популярный проект.

Фронт: Не парсить CSS при «холостом» запуске PostCSS

Для новичков, задача на неделю

Разработчики часто допускают ошибку в настройке сборки и запускают PostCSS без плагинов или опции parser и stringifier. В этом случае PostCSS ничего полезного не делает, но потребляет ресурсы на ненужный парсинг CSS.

Сейчас в таком случае мы предупреждаем разработчиков о ненужной работе. Но они жалуются, что часто ошибку в настройке допустили авторы инструментов, а сами уже не могут ничего исправить.

Мы можем убрать это предупреждение, если ничего не будем делать в этом случае.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить цветовое кодирование случайных ID в логах Logux Server

Для новичков, задача на неделю

В логах Logux Server есть много длинных полуслучайных кодов, которые надо между собой сравнивать:

  • ID клиента вида 10:FnXaqDxY.
  • Action ID вида 1487805099387 10:FnXaqDxY 0 (в середине содержит ID клиента).
  • action.id у action с type logux/processed и logux/undo.

Нужно добавить цветовой код (например, 3 цвета на ID клиента и 5 цветов на Action ID), чтобы можно было быстро искать связанные записи в логе.

Задача требует дизайн-похода: не просто реализовать код, а попробовать разные варианты, чтобы найти самый полезный.

Польза: получить open source портфолио на Node.js.

Фронт: Добавить очереди в Logux Server

Для уверенных в себе, задача на пару недель

Logux Server по WebSocket получает набор операций от клиента, и для каждой операции вызывает callback, переданный разработчиком.

Сейчас обработка всех операций идет паралелльно. Но часто операции связаны: например, сначала может быть операция создания пользователя, а потом — операция смены прав у этого же пользователя. При паралелльной обработке операция смены прав может не найти пользователя, так как операция его создания идет паралелльно.

Нужно добавить последовательную обработку операций в виде очереди.

Задача сложная — требует изменить несколько проектов и хорошо продумать все необычные сценарии.

Польза: получить open source портфолио на Node.js.

Фронт: Уменьшить количество зависимостей в yaspeller

Для новичков, задача на неделю

Yaspeller позволяет проверить орфографию в документации проекта через сервисы Яндекса.

Он занимает в node_modules 3,6 МБ, что много для такого простого инструмента.

Кажется, что можно легко уменьшить размер раза в 2, проанализировав зависимости.

Польза: получить open source портфолио на Node.js.

Бэк: k6 jslib: хелперы для Rails

Для новичков, задача на пару дней

k6 – это современный инструмент для нагрузочного тестирования, написанный на Go и использующий JavaScript для описания тестовых сценариев. Из коробки k6 позволяет работать с WebSocket’ами, однако, тестирование Action Cable и AnyCable сценариев получается очень многословным. Для решения этой проблемы было написано расширение xk6-cable.

Однако, далеко не всю функциональность имеет смысл портировать в Go, иногда для тестирования Rails-приложений могут понадобиться простые хелперы. Для распространения JavaScript-хелперов, разработчики k6 используют jslib.k6.io. Мы предлагаем добавить новый пакет с хелперами для jslib.k6.io.

Польза: разобраться в том, как устроен k6 и его экосистема расширений, принести пользу Rails сообществу.

Бэк: xk6-cable: поддержка асинхронных проверок

Для новичков, задача на пару дней

k6 – это современный инструмент для нагрузочного тестирования, написанный на Go и использующий JavaScript для описания тестовых сценариев. Из коробки k6 позволяет работать с WebSocket’ами, однако, тестирование Action Cable и AnyCable сценариев получается очень многословным. Для решения этой проблемы было написано расширение xk6-cable.

Сейчас xk6-cable поддерживает только синхронное тестирование, но иногда асинхронность все же может понадобиться (например для дополнительной проверки сообщений из соседних каналов). Мы предлагаем добавить метод channel.on_message(callback), который добавит callback для асинхронной проверки всех приходящих в канал сообщений.

Польза: получить опыт работы с Go, разобраться в том, как устроен k6 и его экосистема расширений, принести пользу Rails сообществу.

Бэк: Добавить поддержку desc сортировки в Ruby gem graphql-connections

Для новичков, задача на несколько дней

graphql-connections — Ruby gem, расширяющий стандартные имплементации пагинаций GraphQL Ruby.

В текущей версии для пагинации Stable поддерживается только :asc сортировка в режиме :primary_key. Необходимо добавить поддержку :desc сортировки.

Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.

Фронт: Исследовать причину двойной загрузки настроек Tailwind с PostCSS

Для новичков, задача на неделю

Если в конфиге PostCSS написать tailwindcss() вместо tailwindcss, то плагин будет инициироваться много раз, что плохо влияет на производительность.

Надо исследовать причину такого поведения и предложить решение.

Польза: строка в резюме с PR в популярный проект.

Бэк: wsdirector: поддержка JSON сценариев

Для новичков, задача на пару дней

WebSocket Director — это инструмент для выполнения сценариев взаимодействия WebSocket-клиентов с сервером.

Сейчас он поддерживает сценарии в только формате YAML, что удобно для работы с небольшими сценариями и при их ручном написании.

Однако YAML имеет несколько недостатков:

  • Автоматическая генерация, как правило, требует использования дополнительных библиотек.
  • Формат плохо подходит для передачи контента в командной строке.

С обеими этими проблемами с лёгкостью справляется JSON.

Предлагается добавить поддержку сценариев в формате JSON, передаваемых как в качестве файлов, так и через опцию CLI.

Польза: поэкспериментировать с вебсокетами и CLI-утилитами, принести пользу Ruby сообществу.

Фронт: AnyCable JS: поддержка тестирования

Для новичков, задача на пару дней

Недавно выпущенная библиотека AnyCable JS является альтернативой стандартному пакету из Rails (@rails/actioncable). Она предоставляет более современный API и новые возможности для написания WebSocket-приложений, использующих Action Cable или AnyCable.

В AnyCable JS понятие канала абстрагировано от транспортного слоя (сокетов), что позволяет рассматривать классы каналов как обычные JS-классы. В свою очередь, это открывает возможности для создания инструментов unit-тестирования каналов — это мы и предлагаем попробовать реализовать.

Польза: получить опыт работы с JS/TS, разобраться в том, как устроены клиентские библиотеки для работы с Action Cable, принести пользу Rails-сообществу.

Бэк: AnyCable Rack: поддержка Protobuf

Для новичков, задача на неделю

AnyCable Rack Server — это реализация AnyCable WebSocket-сервера на Ruby, предназначенная для использования в локальном или тестовом окружении.

Одна из целей создания этого проекта — упростить проведение экспериментов с новым функционалом для AnyCable (так как не требует инфраструктурных изменений и вмешательства в код библиотек на других языках).

Сейчас AnyCable предоставляет большое количество функций помимо стандартного набора из Action Cable. В частности, поддержку бинарных протоколов: Msgpack и Protobuf.

Данные форматы уже поддерживаются [AnyCable Client][] из коробки, однако в AnyCable Rack Server есть только поддержка Msgpack. Требуется добавить поддержку Protobuf.

Польза: получить опыт работы с Google Protocol Buffers в Ruby, узнать получше, как работает AnyCable, принести пользу Ruby сообществу.

Бэк: Ruby Next: поддержка IRB/Pry

Для новичков, задача на неделю

Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции в совместимые со старыми версиями Ruby и альтерантивными имплементациями.

Сейчас Ruby Next позволяет транспилировать синтаксис в двух режимах: в рантайме и используя прекомпилированные файлы. Однако, есть один вариант выполнения Ruby кода, который сейчас не поддерживается — внутри интерактивной консоли (IRB или Pry).

Требуется добавить расширения для IRB и Pry, которые позволят использовать Next синтаксис при выполнении кода внутри консоли.

Польза: узнать, как работают IRB и Pry, познакомиться с миром транспайлеров, принести пользу Ruby-сообществу.

Бэк: wsdirector: поддержка циклов

Для новичков, задача на пару дней

WebSocket Director — это инструмент для выполнения сценариев взаимодействия WebSocket-клиентов с сервером. Он позволяет описывать последовательность действий и ожиданий в текстовом формате (YML), создавать сразу несколько соединений и следить за результатами выполнения. Используется для blackbox-тестирования и в качестве вспомогательного инструмента при разработке.

Зачастую сценарии содержат повторяющиеся шаги: отправить сообщение, получить ответ, отправить еще раз и т.д.

Предлагается добавить новую директиву loop для оптимизации подобных последовательностей.

Польза: поэкспериментировать с вебсокетами и CLI-утилитами, принести пользу Ruby сообществу.

Фронт: Создать проект nanocolors-template

Для новичков, задача на неделю

Надо сделать npm-пакет, который расширяет Nano Colors парсером строки с особым языком для указания цвета:

import { colorize } from "nanocolors-template";

colorize`
CPU: {red ${cpu.totalPercent}%}
RAM: {green ${(ram.used / ram.total) * 100}%}
DISK: {yellow.bold ${(disk.used / disk.total) * 100}%}
`;

Польза: получить open source портфолио на Node.js.

Фронт: Добавить поддержку Yarn 3 в Browserslist

Для новичков, задача на неделю

С Browserslist можно использовать команду команду npx browserslist --update-db, чтобы обновить версию caniuse-lite в текущем проекте. Эта команда не поддерживала Yarn 2.

В Yarn 3 добавили команду yarn up -R caniuse-lite, которая сама может обновить все вложенные зависимости.

Польза: строка в резюме с PR в популярный проект.

Фронт: Починить ::file-selector-button в Autoprefixer

Для новичков, задача на неделю

Autoprefixer неправильно обрабатывает ::file-selector-button. На входящий CSS:

input::file-selector-button {
  color: black;
}

input:hover::file-selector-button {
  color: white;
}

Autoprefixer выдает:

input:hover::-webkit-file-upload-button {
  color: white;
}

input:hover::file-selector-button {
  color: white;
}

input:hover::file-selector-button {
  color: white;
}

Хотя должен:

input::-webkit-file-upload-button {
  color: black;
}

input::file-selector-button {
  color: black;
}

input:hover::file-selector-button {
  color: white;
}

input:hover::file-selector-button {
  color: white;
}

Польза: строка в резюме с PR в популярный проект.

Фронт: Расследовать странную ошибку в PostCSS

Для новичков, задача на неделю

PostCSS 8.1 неправильно обрабатывает CSS:

.stuff {
  .foo {
    svg {
      display: none;
    }
    .bar {
      display: inline;
    }
  }
}

Получается:

.stuff .foo .stuff svg {
  display: none;
}
.stuff .foo .stuff .bar {
  display: inline;
}

А должно:

.stuff .foo svg {
  display: none;
}
.stuff .foo .bar {
  display: inline;
}

Польза: строка в резюме с PR в популярный проект.

Фронт: Уменьшить количество вложенных зависимостей Size Limit

Для новичков, задача на неделю

У Size Limit используется больше 100 под-зависимостей. Согласно npm.anvaka.com, большинство под-зависимостей идут от read-pkg-up и ora, которые не настолько полезны, чтобы мириться с таким их количеством.

Нужно заменить их на аналоги.

Польза: получить open source портфолио на Node.js.

Фронт: Стабилизировать тесты в Nano ID

Для новичков, задача на неделю

Nano ID генерирует случайные ID, поэтому случайность влияет на тесты. В итоге, иногда не вызывается строка 50 в async/index.js, и тесты падают из-за недостаточного покрытия.

Не хочется снижать критерий на покрытие тестами. Лучше подобрать такие параметры длины алфавита, чтобы строка вызывалась чаще.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Исправить глубокую вложенность в postcss-nested

Для новичков, задача на неделю

postcss-nested неправильно работает с 3-м уровнем вложенности:

.text {
  &:hover {
    border-color: red;
    &:before {
      color: red;
    }
  }
}

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Добавить dir-dependency в postcss-mixins

Для новичков, задача на неделю

Сообщение dir-dependency используется PostCSS-плагинами, чтобы сообщить сборщику о том, что нужно следить за добавлением файлов в папке. Например, потому что плагин читает из папки список миксинов.

result.messages.push({
  type: "dir-dependency",
  plugin: "postcss-import",
  dir: "/imported",
  glob: "**/*.css",
  parent: result.opts.from,
});

Плагин postcss-mixins использует только сообщение depenency для использованных файлов, но не dir-dependency для папок, где он ищет файлы с миксинов.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Создать webpack-плагин для Web Manifest

Для новичков, задача на неделю

Web Manifest — это JSON-файл, который описывает иконки и настройки для интеграции веб-приложения в браузер и ОС.

Из-за ссылок на иконки, нельзя взять просто статичный JSON-файл — ссылки на иконки надо взять из webpack, чтобы они содержали cache buster и прошли через loader’ы.

Польза: получить open source портфолио на Node.js.

Фронт: Уменьшить размер зависимостей в lint-staged

Для новичков, задача на неделю

lint-staged со всеми зависимостями занимает 21 МБ на диске:

$ mkdir test && cd test
$ yarn add lint-staged
$ du -sh node_modules
21M	node_modules

Главная причина — огромное, глубокое дерево зависимостей.

Задача — заменить зависимости с кучей подзависимостей на минималистичные альтернативы. Совсем простые зависимости реализовать заново в проекте.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Проверять наличие прямой зависимости postcss в postcss-loader

Для новичков, задача на неделю

В старых версиях postcss-loader, postcss была в зависимостях пакета. Теперь она в peerDependencies — пользователь должен поставить postcss сам в свой проект паралелльно с postcss-loader.

Многие пользователи пропустили это в списке изменений postcss-loader. Из-за особенностей работы npm, у них может устанавливаться postcss неожиданных версий. Часто это оказывается старая PostCSS 7, которая отказывается работать с новыми плагинами и путает пользователей.

Можно улучшить опыт разработчиков с помощью дополнительной проверки:

  1. Если версия postcss().version 7, то пытаемся найти package.json.
  2. package.json можно искать только в текущей папке (process.cwd()).
  3. Если в package.json нет postcss в dependencies или devDependencies, то выводим ошибку, требуя явно установить postcss.
  4. Если postcss в прямых зависимостях есть, то ставим глобальный флаг, чтобы не запускать проверку снова.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Сгруппировать классы и функции в Logux API по блокам

Для новичков, задача на неделю

На сайте Logux есть раздел с API веб-клиента и node-сервера. Сейчас боковое меню разбито на категории: классы, функции, переменные.

API-страницы можно сделать удобнее для изучения Logux, если сгруппировать классы и функции по смыслу. Например:

  • Node API: Server, Tests, Core, Others.
  • Web API: State, React, Vue, Client, Tests, Core, Others.

Польза: получить open source портфолио на Node.js.

Фронт: Минималистичный npm-пакет для установки precommit-хука

Для новичков, задача на неделю

В сообществе разработчиков есть много инструментов для установки Git-хуков. Хуже и лучше, медленнее и быстрее, некоторые с существенными ограничениями. Например, марсиане создали быстрый и фичастый Lefthook, который мы используем в коммерческих проектах, больших и маленьких.

Возникла идея создать альтернативу средству с максимальными возможностями: микро-менеджер Git-хуков, для «легких» frontend open source проектов. Под капотом — лишь запуск lint-staged. Без парсинга конфигов в рантайме, с минимумом или совсем без зависимостей и лишь парой дополнительных строк в package.json:

  "simple-pre-commit": "npx lint-staged",

Польза: внести вклад в дело уменьшения коллективного размера node_modules. Получить open source портфолио на Node.js.

Фронт: Убрать Yargs из Logux Server

Для новичков, задача на неделю

Сейчас Logux Server использует Yargs, чтобы работать с CLI-аргументами и выводить --help.

Но у Yargs некрасивый вывод --help — хочется, как минимум, разделить блоки цветом.

Кроме CLI-аргументов, Logux Server получает настройки через переменные среды и опции JS API. Хочется упростить код, совместив обработку всех элементов.

Польза: получить open source портфолио на Node.js.

Бэк: Добавить поддержку кэширования AST запроса в Ruby gem graphql-ruby-persisted_queries

Для новичков, задача на несколько дней

graphql-ruby-persisted_queries — реализация механизма persisted queries для graphql-ruby, которая позволяет клиенту отправлять хэш GraphQL запроса вместо его полного текста.

В текущей реализации библиотека кэширует только текст запроса. Необходимо добавить возможность кэширования результата разбора запроса и придумать, как заставить среду исполнения пропустить шаг разбора.

Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.

Бэк: Добавить поддержку #read_multi в Ruby gem graphql-ruby-fragment_cache

Для уверенных в себе, задача на неделю

graphql-ruby-fragment_cache — Ruby gem, позволяющий кэшировать части ответа на GraphQL запрос.

В текущей реализации библиотеки чтение из кэша происходит в момент разрешения закэшированного поля. Такой подход не является оптимальным в случаях, когда для выполнения запроса необходимо произвести несколько обращений к кэшу. Вместо этого, стоит объединять все обращения в один запрос.

Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.

Фронт: Добавить подсветку .browserslistrc в GitHub

Для новичков, задача на неделю

У Browserslist есть свой конфиг, в файлах  .browserslistrc или browserslist.

Нужно добавить подсветку синтаксиса для этого конфига в GitHub.

# Comment
defaults

# Not keyword
not dead

# Market share with %
> 10%
< 1.5% in US
>= .5%

# Rare queries
maintained node versions
supports es6-module

# Extend keyword
extend @company/browserslist-config

# Direct versions
Chrome 50
Firefox ESR
Safari TP
OperaMini all

# Block header
[production]
# and keyword
Edge > 40 and Edge < 43
# or/, keywords
IE 11 or IE 10, ie 9

Польза: добавить строку в резюме с PR в популярный проект.

Фронт: Добавить подсветку .browserslistrc в VS Code

Для новичков, задача на неделю

У Browserslist есть свой конфиг, в файлах  .browserslistrc или browserslist:

# Comment
defaults

# Not keyword
not dead

# Market share with %
> 10%
< 1.5% in US
>= .5%

# Rare queries
maintained node versions
supports es6-module

# Extend keyword
extend @company/browserslist-config

# Direct versions
Chrome 50
Firefox ESR
Safari TP
OperaMini all

# Block header
[production]
# and keyword
Edge > 40 and Edge < 43
# or/, keywords
IE 11 or IE 10, ie 9

Нужно добавить подсветку синтаксиса для этого конфига для Visual Studio Code. Как минимум, нужно подсветить:

  1. Комментарии (начинаются с #).
  2. Номера версий (включая all, esr и tp).
  3. Проценты (50%, 0.5%, .5%).
  4. Ключевые слова (not, and, or, extends и ,).
  5. Имена браузеров.
  6. Заголовки ([production]).

Задача «творческая»: дополнения к этому списку или другие подходы к подсветке приветствуются.

Польза: получить опыт разработки для VS Code, добавить строку в резюме с инструментом для популярного проекта.

Фронт: Добавить поддержку process.env.NODE_ENV в dual-publish

Для новичков, задача на неделю

Многие JavaScript-библиотеки используют process.env.NODE_ENV, чтобы включать инструменты разработчика или дополнительные проверки на этапе разработки:

if (process.env.NODE_ENV !== "production") {
  heavyArgsCheck(args);
}

Webpack и другие сборщики умеют вырезать такие конструкции в фронтенд-библиотеках. Но новые сборщики созданные с прицелом на ES-модулей полагаются на package.exports.production вместо process.env.NODE_ENV.

Нужно добавить в dual-publish конвертацию process.env.NODE_ENV в package.exports.production.

Польза: расширить open source портфолио в Node.js.

Фронт: Выводить изменения в списке браузеров после browserslist --update-db

Для новичков, задача на неделю

Browserslist использует caniuse-lite как базу данных актуальных браузеров. Эту базу данных надо регулярно обновлять; есть команда npx browserslist --update-db, которая сама обновляет версию базы данных в lock-файле.

Но многие пользователи волнуются о том, как обновление может повлиять на поддержку браузеров. Хочется добавить сравнение «было/стало»:

Current version: 1.0.30001148
New version: 1.0.30001154
Removing old caniuse-lite from lock file
Installing new caniuse-lite version
$ yarn install
caniuse-lite has been successfully updated

Target browser changes:
- chrome 67
+ chrome 80

Польза: расширить open source портфолио в Node.js, добавить строку в резюме с PR в популярный проект.

Фронт: Сохранять порядок правил в postcss-nested

Для новичков, задача на неделю

В экосистеме PostCSS есть плагин postcss-nested для добавления в CSS синтакса вложенных правил (в духе SCSS).

Сейчас postcss-nested некорретно работает, если другие свойства идут после вложенного правила.

.foo {
  a: 1;
  &bar {
    b: 2;
  }
  b: 1;
}
.foo {
  a: 1;
  b: 1;
}
.foobar {
  b: 2;
}

В этом примере b: 1 из .foo после компиляции оказалось выше b: 2 из .foobar.

Правильный результат:

.foo {
  a: 1;
}
.foobar {
  b: 2;
}
.foo {
  b: 1;
}

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Бэк: GraphQL RuboCop: добавить коп для проверки заполнения описаний типов

Для новичков, задача на пару дней

rubocop-graphql — Ruby gem, проверяющий на соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп ObjectDescription, проверяющий, что для всех типов (включая мутации, подписки, резолверы) заполнено описание (метод description).

Польза: научиться писать копы для rubocop, принести пользу Ruby–сообществу.

Бэк: GraphQL RuboCop: добавить коп для проверки использования :hash_key

Для новичков, задача на пару дней

rubocop-graphql — Ruby gem, проверяющий на соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп FieldHashKey, проверяющий, что при объявлении поля везде, где возможно, используется опция :hash_key.

Польза: научиться писать копы для rubocop, принести пользу Ruby–сообществу.

Бэк: GraphQL RuboCop: добавить коп для обнаружения полей, которые можно вынести в отдельный тип

Для новичков, задача на неделю

rubocop-graphql — Ruby gem, проверяющий соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп ExtractType, предлагающий вынести поля с одинаковым префиксом в отдельный тип.

Польза: научиться писать копы для rubocop, принести пользу Ruby-сообществу.