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

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

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

Фронт: Обновить генерацию 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.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.

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

Фронт: Улучшить генерацию префиксов у 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 библиотеку, вдохновленную функциональным программированием.