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

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

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

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

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

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

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

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

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

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

Фронт: Добавить исправление проблем в 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.io на Vite

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

Сейчас logux.io использует 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.

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

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

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

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

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

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

Бэк: 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 опенсорс-проекте, опыт работы с инструментами тестирования.

Фронт: Улучшить генерацию префиксов у Autoprefixer внутри @-moz-document

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

Надо сделать Autoprefixer умнее и генерировать только -moz- внутри выражения @-moz-document.

  body {
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none;
  }

  @-moz-document domain('example.com') {
    body {
-    -webkit-appearance: none;
        -moz-appearance: none;
             appearance: none;
    }
  }

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

Фронт: Добавить скрипты в clean-publish

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

clean-publish — CLI-инструмент по очистке npm-пакета от лишних конфигов перед публикацией.

Он берет текущий проект, копирует во временную папку, чистит и вызывает npm publish на очищенную временную папку.

Нужно добавить опцию beforeScript, которая перед вызовом npm publish вызовет какой-то другой скрипт, передав туда путь ко временной папке как аргумент.

"clean-publish": {
  "beforeScript": "esm-compiler"
}

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

Фронт: Уменьшить Gitter Sidecar

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

Gitter Sidecar — виджет чата для open source-проектов. Его использует PostCSS и Logux.

В виджете оказалось много лишнего кода. 17 KB кода, скорее всего, можно ужать до 5-10 KB.

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

Бэк: Реализовать обработку неизвестных атрибутов внутри array-типов StoreModel

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

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

Ранее в StoreModel был добавлен метод #unknown_attributes, возвращающий Hash с атрибутами, присутствующими в колонке БД, но не объявленными в модели (подробнее — в в документации). Однако, он не работает с array-типами:

class Config
  include StoreModel::Model

  attribute :model, :string
end

data = { name: "Apple iPhone" }
config = Config.to_type.cast_value(data)
config.unknown_attributes
# => { name: "Apple iPhone" }

Config.to_array_type.cast_value([data])
# => ActiveModel::UnknownAttributeError

Необходимо дополнить реализацию модуля StoreModel::Types::ArrayType таким образом, чтобы он собирал все неизвестные атрибуты в #unknown_attributes для каждого из объектов списка:

data = { name: "Apple iPhone" }
configs = Config.to_array_type.cast_value([data])
configs.first.unknown_attributes
# => { name: "Apple iPhone" }

Более подробно проблема описана в задаче.

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

Бэк: Добавить ссылку на модель-родитель в StoreModel

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

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

Необходимо добавить в StoreModel возможность установить связь между объектом-оберткой и его родителем — объектом класса ActiveRecord. В результате, у классов, включающих в себя StoreModel::Model, должен появиться метод #parent.

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

Фронт: Исправить поиск Chrome в estimo

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

Estimo запускает JS-файл в Puppeteer (Chrome без UI) и сообщает, сколько потребовалось времени на компиляцию и запуск файла. Size Limit использует его для оценки времени выполнения JS-бандла.

Puppeteer очень долго скачивает сборку Chrome. В 1.0 Estimo перешел на Puppeteer Core и самм начал искать и скачивать Chrome. В итоге, если у пользователя уже установлен браузер Chrome, Estimo может использовать его.

Однако, код поиска и скачивания Chrome работает плохо, особенно на Travis CI. Нужно переписать код и исправить ошибки.

Польза: получить глубокий опыт в работе Puppeteer.

Бэк: Store Attribute: поддержка значений по умолчанию

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

Gem store_attribute добавляет возможность приведения типов для атрибутов Active Record моделей, созданных с помощью store_accessor.

Данный gem предоставляет интерфейс (и использует «под капотом») Attributes API, за исключением возможности указания значений по умолчанию.

Необходимо добавить данный функционал в gem.

Польза: узнать, как устроен Attributes API в Active Record, принести пользу Rails сообществу.

Фронт: Добавить в Size Limit опцию --save-bundle

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

Size Limit собирает JavaScript-библиотеку с помощью webpack, чтобы потом проверить результирующий размер.

Иногда непонятно, почему получился именно такой размер — хотелось бы посмотреть содержимое сборки. Для этого можно добавить аргумент --save-bundle ./dir в CLI.

Польза: получить опыт в open source проекте и новых синтаксисах JavaScript.

Фронт: Доделать тему documentation-theme-light для Documentation.js

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

Documentation.js — прекрасная замена мертвому JSDoc. Но все темы для него довольно плохие.

Самое грустное, что для проекта сделали отличную тему documentation-theme-light, но она не закончена.

Нужно добавить JS-скрипты генерации HTML и, опционально, чуть отполировать тему.

Польза: задача идеальна для CSS-разработчиков, которые хотят прокачаться в JavaScript.

Фронт: Добавить JSON-вывод в Size Limit

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

В CLI Size Limit нужно добавить опцию size-limit --json, которая будет менять формат вывода на JSON:

[
  {
    "name": "index.js",
    "passed": true,
    "size": 1024,
    "loading": 0.05,
    "running": 0.1
  }
]

Польза: получить опыт в open source проекте и новых синтаксисах JavaScript.

Бэк: Создание библиотеки Refinement Types на Go (для построения контрактов)

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

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Go.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

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

Бэк: Создание библиотеки Refinement Types на Node.js (для построения контрактов)

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

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Node.js.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

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

Фронт: Исправить парсинг Custom Properties в PostCSS

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

PostCSS парсит значения CSS Custom Properties как обычные значения в CSS-свойствах. Оказалось, что по спецификации там могут быть { и другие символы.

/* Валидный CSS */
html {
  --bracket-block: {1, 2, 3};
  --JSON: [1, "2", {"three": 3}, [4]];
  --javascript: function(rule) { console.log(rule) };
}

Нужно изменить парсер, чтобы правильно обрабатывать CSS Custom Properties.

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

Фронт: Переписать Logux Server с Promise на async/wait

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

В Logux Server надо провести рефакторинг, переведя код на новый синтаксис JavaScript. Поскольку мы теперь требуем Node.js >= 10, Promise можно заменить на async/await.

Польза: получить опыт в open source проекте и новом синтаксисе JavaScript.

Фронт: Добавить поддержку mask-composite в Autoprefixer

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

В Autoprefixer нужно добавить поддержку нового свойства — mask-composite.

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

Бэк: Поддержка ассоциаций belongs_to в Ruby gem Clowne

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

Clowne — это Ruby gem для гибкого клонирования моделей, поддерживающий несколько ORM адаптеров.

На данный момент ActiveRecord адаптер реализует клонирование следующих ассоциаций: has_one, has_many, has_and_belongs_to_many. В первой версии это было сделано специально, чтобы избежать возможных избыточных клонирований и неверного результата в конечном итоге.

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

Для покрытия подобного рода кейсов нужно добавить в gem поддерку belongs_to связей (только для ActiveRecord адаптера).

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

Бэк: gem Clowne: коллбек after_clone для обработки собранной модели

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

Clowne — это Ruby gem для гибкого клонирования моделей.

Начиная с версии 1.0, Clowne поддерживает два коллбека для обработки клонируемой записи:

  • finalize вызывается до сохранения записи в процессе формирования результата клонирования.
  • after_persist вызывается после сохранения записи для уже сформированной записи.

Однако, существуют промежуточные ситуации, когда необходимо обработать собранную, но еще не сохраненную запись.

К примеру, чтобы избежать использования after_persist и дополнительных операций c базой:

class UserCloner < Clowne::Cloner
  # клонируем пользователя и его посты, которые являются черновиками
  include_association :posts, scope: :draft

  after_clone do |_origin, clone, mapper:, **|
    # актуализируем значение атрибута пользователя
    clone.draft_count = clone.posts.count
  end
end

Альтернативным примером использования может послужить проверка собранной записи по некоторой бизнес-логике:

class UserCloner < Clowne::Cloner
  include_association :posts, scope: :draft

  after_clone do |origin, clone, errors:, **|
    errors.unshift("user clone of #{origin.cache_key} is invalid") if clone.posts.empty?
  end
end

errors = []
operation = UserCloner.call(user, errors: errors)

raise errors.join('; ') if errors.any?

Для покрытия подобного рода кейсов мы можно реализовать after_clone коллбек.

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

Бэк: AnyCable: Rack-совместимый сервер

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

AnyCable позволяет использовать сторонние WebSocket-сервера, более производительные и конкурентно-способные, вместе с Action Cable.

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

И хотя AnyCable предполагает использование стандартного Action Cable сервера при разработке и тестировании, многие разработчики (см. например, статью From Action to Any) предпочитают запускать полноценную конфигурацию локально.

Чтобы упростить локальную разработку, мы предлагаем написать AnyCable-совместимый вебсокет-сервер на Ruby с Rack интерфейсом.

Польза: познакомиться с AnyCable, получить опыт написания конкуретных приложений на Ruby.

Бэк: Yabeda: адаптер для DataDog

Для новичков, задача на два-три дня

Фреймворк yabeda позволяет легко объявлять и собирать метрики о работе Ruby-приложения — и с помощью адаптеров экспортировать их в системы мониторинга. Сейчас есть адаптеры для Prometheus (yabeda-prometheus) и NewRelic (yabeda-newrelic), но это далеко не полный список систем, которых мы хотели бы поддерживать.

Необходимо написать адаптер (Ruby gem) для yabeda, который позволит отправлять кастомные метрики в DataDog.

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

Решение: победителем признана реализация Дмитрия Швецова на основе Dogstatsd сделанная в соавторстве с Николаем Малининым. Николай начинал решать задачу отдельно, но решил объединить усилия с Дмитрием.

Бэк: GraphQL Ruby: поддержка «внешних» схем

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

Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.

Одним из преимуществ GraphQL часто называют возможность агрегировать данные из разных источников в одном запросе и прозрачно для клиента.

Отдельно рассматривают случай, когда один провайдер GraphQL API агрегирует данные из других GraphQL API. Этот сценарий носит название schema stitching.

К сожалению, на сегодняшний день поддержка объединения (или сшивания) схем отсутвует в реализации на Ruby.

Необходимо написать плагин (gem) для graphql-ruby, который позволит создавать «внешние» поля в локальную схему.

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

Бэк: GraphQL Ruby: «умная» выборка полей из БД

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

Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.

Одной из ключевых особенностей GraphQL является возможность запросить клиентом только те данные, которые ему нужны (а не все те, которые предлагает API).

Однако, запросы к БД, которые выполняются при работе, например, с Active Record, не являются оптимальными: используется "SELECT * ..." вместо выборки лишь тех полей, которые необходимы для формирования ответа клиенту.

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

Необходимо написать плагин (gem) для graphql-ruby, который позволит «помочь» делать более эффективные запросы.

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

Бэк: TestProf: добавить улучшенную поддержку сэмплирования тестов

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

Gem test-prof включает в себя инструмент для запуска случайного набора тестов (документация).

Текущая реализация имеет ряд ограничений:

  • можно запускать только случайный набор файлов, а не отдельных тестов (из-за этого количество тестов в сэмплах может значительно отличаться);
  • не поддерживает фильтрацию тестов в RSpec (например, по тэгам или по описанию).

Необходимо усовершенстовать поддержку сэмплирования в TestProf.

Польза: узнать, как работают изнутри популярные библиотеки для тестирования в Ruby (RSpec и Minitest), принести пользу сообществу.

Бэк: Добавить интеграцию с OptionParse в anyway_config

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

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложения из разных источников данных (YAML файлы, переменные окружения), позволяя без лишних усилий следовать принципам Twelve-Factor App методологии.

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

Для этого предполагется добавить интеграцию стандартной Ruby библиотеки OptionParse в anyway_config.

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

Бэк: Добавить API для поддержки различных адаптеров в Ruby gem jwt_sessions

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

Альтернативное решение от Леонида Батижевского.

Gem jwt_sessions предоставляет базовый инструментарий для использования JWT для аутентификации пользователей.

Для хранения токенов сейчас используется Redis, и нет простой (то есть, без monkeypatching) возможности использовать другие хранилища — такие, например, как база данных, или память приложения (что может быть полезно в тестовом окружении).

Необходимо в рамках gem’а реализовать интерфейс для написания сторонних адаптеров, реализовать через него существующий Redis адаптер, а также добавить из коробки in-memory адаптер.

Польза: познакомиться поближе c JWT, применить навыки рефакторинга в Ruby, принести пользу сообществу.

Помощь запрашивал