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

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

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

Фронт: Добавить в 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-сообществу.

Бэк: RuboCop RSpec: поддержка сторонних расширений DSL

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

‎RuboCop RSpec — Ruby gem, проверяющий каноничность и соответствие стилю код тестов, написанных с использованием фреймворка RSpec. Многие проверки ориентируются на стандартные методы из RSpec DSL (например, it, context и т.д.). Этого недостаточно, если пользователь определяет псевдонимы (aliases) или использует сторонние гемы, расширяющие базовый функционал RSpec.

Например, если пределить псевдоним к it, story, то RuboCop RSpec может ошибочно определить группу примеров (example group) как не содержащую ни одного теста.

Необходимо добавить возможность расширять набор распознаваемых RuboCop RSpec методов через YML конфигурацию и обновить существующие копы.

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

Бэк: Добавить поддержку полиморфных типов в Ruby gem StoreModel

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

StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord модели.

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

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

Бэк: Lefthook: добавить сегментированный вывод

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

Lefthook — менеджер Git-хуков для проектов на любых языках.

Требуется добавить возможность управлять логом вывода.

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

output:
  - meta
  - failures
  - success
  - summary

Польза: попрактиковаться с Go, познакомиться с git hooks.

Инструкции по выполнению

  1. Ознакомиться с более подробным обсуждением задачи или предложенной реализацией.
  2. Задать вопросы или попросить уточнения в issue на GitHub.
  3. Форкнуть проект Lefthook на GitHub.
  4. Реализовать необходимый функционал.
  5. Сделать Pull Request.

Бэк: Logidze: создание «слепка» текущего состояния записи вручную

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

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

Лог изменений генерируется автоматически (с помощью триггеров в БД), и, как правило, разработчики в приложении используют его только для чтения. Однако, в некоторых случаях может возникнуть необходимость зафиксировать текущее состояние записи вручную: например, при массовом обновлении или вставке удобно отключать встроенный трекинг (Logidze.without_logging { ... }), что может привести к неконсистентности лога и текущего состояния записей.

Для решения данной проблемы предлагается добавить специальный метод model.fixup_log_data!, который будет добавлять запись в лог, актуализируя его состояние.

Польза: возможность поработать с базой данных на более низком уровне, принести пользу Rails сообществу.

Бэк: Ruby Next: поддержка явного списка преобразований в CLI

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

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

Один из возможных способов сделать это — воспользоваться ruby-next CLI. Текущая версия CLI позволяет указывать версию Ruby, для которой необходимо сгенерировать код (ruby-next nextify --min-version=2.5), что отлично работает для CRuby и совместимых реализаций, но не всегда подходит для таких платформ как mruby, Opal и других.

Требуется расширить функционал CLI и добавить возможность указывать список преобразований явно: ruby-next nextify --rewrite=pattern-matching --rewrite=endless-method.

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

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

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

Сейчас Logux Server использует Bunyan для записи лога. pino совместим на 90% с Bunyan API, но гораздо быстрее.

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

Бэк: Добавить протокол 3 в Logux Rack (Ruby/Rails)

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

Нужно перевести Ruby gem logux-rack на новую версию протокола общения с Logux-сервером. Изменения:

  1. Сейчас logux-rack, в случае ошибки, всегда возвращает ["error", stack]. В новой версии логика сложнее. Если ошибка произошла в момент обработки конкреного action или подписки, сервер должен ответить ["error", meta.id, stack]. В остальных случаях сервер должен ответь HTTP-кодом 500 с текстом ошибки в теле ответа (прекратив обработку остальных команд).
  2. Нужно изменить password на secret в теле запросов от Logux-сервера и запросов к Logux-серверу.
  3. Нужно обновить версию протокола в коде logux-rack.

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Добавить resend в Logux Rails

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

У Logux есть WebSocket-сервер, который посылает новые сообщения в Rails-приложение. Сейчас новое сообщение проходит 2 стадии — проверку прав доступа и сохранение данных в БД. Нужно добавить третий шаг — определение того, в какие каналы нужно переслать сообщение.

Обработка сообщений от Logux идет в Logux::ActionController:

module Actions
  class Comment < Logux::ActionController
    def add
      respond :processed
    end
  end
end

Нужно добавить метод resend, который будет принимать хэш:

    def add
      resend channel: 'users'
      respond :processed
    end

Этот метод будет писать в ответ Logux-серверу:

["resend", @meta.id, { "channel": "users" }]

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Добавить send_back в Logux Rails

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

У Logux есть WebSocket-сервер, который посылает новые сообщения в Rails-приложение. Обработка всех сообщений от Logux идет в Logux::BaseController (который расширяется в Logux::ActionController и Logux::ChannelController):

module Actions
  class Comment < Logux::ActionController
    def add
      respond :processed
    end
  end
end

Нужно добавить метод send_back(action, meta), который будет ставить meta.clients = [meta.client_id] и вызывать Logux.add(action, meta):

    def add
      send_back(type: 'added')
      respond :processed
    end

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Фронт: Добавить size-limit --watch

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

Нужно добавить новый аргумент: size-limit --watch, который будет следить за изменением файлов и заново запускать Size Limit.

Можно следить только за изменением JS-файлов, package.json и конфига Size Limit, игнорируя node_modules.

Польза: опыт работы с JavaScript в большом опенсорс-проекте.

Фронт: Добавить browserslist --update-db для обновления caniuse-lite

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

Browserslist берет данные Can I Use из пакета caniuse-lite. Многие команды его не обновляют и данные last 2 version становятся устаревшими. Сейчас Browserslist определяет, что данные устарели и выводит предупреждение.

К сожалению, npm и Yarn не дают готовые инструменты для обновления версий в глубине дерева зависимостей.

Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.

Фронт: Перевести токенайзер PostCSS с line, column на offset

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

Сейчас PostCSS сохраняет строку и колонку каждого токена. Но команде Sass для совместимости нужна позиция в CSS-строке (offset) вместо строки и колонки. Можно перевести токенайзер на offset, а строку/колонку вычислять. Это упростит токенайзер и уменьшит расход памяти.

Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.

Фронт: Добавить print-snapshots --watch

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

Инструмент print-snapshots печает Jest snapshots.

Нужно добавить два параметра, --update и --watch, для обновления snapshots и запуска обновления snapshots при изменении JS-файлов в проекте.

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