![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Учебный проект. Визуализация работы некоторых алгоритмов и структур данных. Я постарался организовать проект максимально близко к продакшену. Код покрыт тестами, настроены линтеры и CI.
Дизайн макет, но я изменил цветовую схему на более строгую.
Сайт корректно отображается на всех размерах экранов.
Проект собирается с помощью vite, потому что CRA уже не рекомендовался для создания нового
проекта React. Запуск с помощью докера
-
Использовал относительо новую, но набирающую популярность, методологию FSD для организации кода фронтенда.
-
Использую новый
React Router v6и ленивую загрузку роутов.
ESLintиStylelintпроверяютTS/SCSSstaged файлы.Prettierавтоматически форматирует код.- Запускаются все тесты
jest Commitlintпроверяет коммит на соответствие Conventional Commits. Можно пошагово создать корректное сообщение коммита с помощь clicommitizen: скриптyarn cz
Если любой из этапов не проходит, коздание коммита отменяется. Это минизирует попадание ошибочного кода в коммит и унифицирует сообщения коммитов.
Код покрыт тестами:
- юнит-тесты
jestдля проверки работы алгоритмов. - e2e тесты
cypressдля проверки правильной визуализации всех страниц. - тесты компонентов React с помощью
Cypress Component Testing. Отностиельно новый инструмент для разработки и тестирования компонентов.
Настроена интеграция с cypress cloud для визуализации и мониторинга результатов тестирования.
- Настроил
github workflowдля запуска всех тестов при пуше в любую ветку, кромеmain. Разделил стадию билда от тестов, чтобы оптимизировать прогон тестов.
- Защитил ветку
mainот прямого пуша. Обновить веткуmainможно только через PR. Причём должны обязательно успешно завершиться всеactionsпо тестированию в рабочей ветке. Таким образом нерабочий код не может (но это не точно) попасть вmain. - Настроил автоматическую публикацию сайта на
gh-pagesпри вливании PR вmain.
- React with TS
- SCSS
- Vite bundler
- Jest
- Cypress
git clone git@github.com:gvozdenkov/algoschool.git
cd algoschool
docker compose -f compose.dev.yaml up
# or use Makefile
make run-dev
# open http://localhost:3010
# create new branch and work in it. Merge to main only via PR
use node 18 and above
git clone git@github.com:gvozdenkov/algoschool.git
cd algoschool
yarn
# or npm install
yarn dev
# or npm run dev
# open http://localhost:5173| script | Description |
|---|---|
dev |
Запускает vite dev server без cypress |
dev-ct |
Запускает vite dev server и cypress open --component для разработки и тестирования компонентов |
dev-e2e |
Запускает vite dev server и cypress open --e2e для e2e тестирования |
build |
билд проекта |
lint |
проверки eslint |
typecheck |
проверка typescript компилятором tsc |
prettier:write |
исправляет ошибки форматирования |
prettier:check |
проверяет ошибки форматирования (используется в CI перед тестами cypress.yaml) |
stylelint:fix |
stylelint исправляет .scss стили |
test:cy |
запуск всех тестов cypress |
test:jest |
запуск всех тестов jest |
cz |
cli утилита для созадния коммита по рекомендациям Conventional Commits |
- Добавить линтер для методологии FSD
- Перевезти проект на Remix.run фреймворк. Лучше CEO, быстрее индексация.
- Внедрить
Storybookдля разработки и тестирования компонентов в изоляции. Уже добавлены зависимости и скрипты запуска. Но пока там пусто.
Workflow setup details
Used husky & lint-staged packages to lint & format staged files only
# .husky/_/pre-commit
yarn lint-staged && yarn test:jest -o
.lintstagedrc.json setup sequential running commands for .js|ts|jsx|tsx files in order of array
items
{
"*.(js|ts|jsx|tsx)": ["yarn prettier:write", "yarn lint"],
"*.md": "yarn prettier:write"
}This project is Commitizen friendly. So you can easy create commits in a step by step guide by run:
If you are mannually create commit message it will be linted with commitlint to lint commit
messages acording with Conventional Commits.
yarn cz
# or
npm run czCommitizen & commitlint setup:
- Used ligthweight
cz-gitadapter forcommitizento generate cli interface foryarn cz - Setup
cz-gitwith.czrcfile - Setup
commitlintwithcommitlint.config.ts
"devDependencies": {
"@commitlint/cli": "^18.4.3",
"@commitlint/config-conventional": "^18.4.3",
"@commitlint/format": "^18.4.3",
"commitizen": "^4.3.0",
"cz-git": "^1.8.0",
}Used Prettier (exact 2.8.7 version) for formatting and Eslint for linting only. So setup
"devDependencies": {
"eslint": "^8.53.0",
"prettier": "2.8.7",
"eslint-plugin-prettier": "4.2.1",
"eslint-config-prettier": "^9.0.0",
}Settup eslint to highlight style errors with prettier:
// .eslintrc.cjs
module.exports = {
// ...
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended-type-checked',
// ...
// prettier must be the last in extends
'prettier',
],
// ...
plugins: ['prettier'],
rules: {
'prettier/prettier': ['error'],
// ...
},
};Setup CI to check code formating
# cypress.yaml
- run: yarn lint
# only check format, not write
- run: yarn prettier:checkImport order sorting:
Used prettier-plugin-sort-imports package for prettier to format order of imports
//https://chriscoyier.net/2022/08/09/javascript-import-sorting/
// .prettierrc
"importOrder": [
"react",
"<THIRD_PARTY_MODULES>",
"^(#shared/(config|constants|types|hooks|lib)).*$",
"^(#shared/ui).*$",
// Any local imports that AREN'T styles.
"^(\\.|\\.\\.)/(.(?!.(css|scss)))*$",
// Styles
".(css|scss)$"
],
"importOrderSeparation": true,
"importOrderSortSpecifiers": true,
"importOrderCaseInsensitive": true,- Install:
yarn add -D stylelint stylelint-config-standard-scss stylelint-config-prettier-scss stylelint-config-clean-order- Setup stylelint
.stylelintrc.json:
{
"extends": [
"stylelint-config-standard-scss",
"stylelint-config-clean-order/error",
"stylelint-config-prettier-scss"
],
"rules": {
"selector-class-pattern": "^(?:[a-z][a-z0-9]*)(?:(__|_|-)[a-z0-9]+)*$",
"scss/at-extend-no-missing-placeholder": null
}
}selector-class-pattern to check BEM style names
- Add script in
package.jsonto lint and autofix fixable issues
+ "stylelint:fix": "stylelint '**/*.scss' --fix",- Edit
.lintstagedrc.jsonto automatic fix all fixable style issues in pre-commit acion
{
"*.(js|ts|jsx|tsx)": ["yarn prettier:write", "yarn lint"],
"*.md": "yarn prettier:write"
# suddenly `yarn stylelint:fix` don't work:( it crash lint-staged with empty-commit error
+ "*.{css,scss}": "stylelint '**/*.scss' --fix",
}- Setup VS Code
settings.jsonto autofix stylelint issues on save
Install official Stylelint extenstion!
+ "editor.codeActionsOnSave": {
+ "source.fixAll.stylelint": true
+ },
+ "css.validate": false,
+ "scss.validate": false,
+ "less.validate": false,
+ "stylelint.validate": ["css", "less", "postcss", "scss"],
+ "stylelint.config": null, //use settings from .stylelintrc.json





