{"id":20468623,"url":"https://github.com/faridzeynalov2000/full_project","last_synced_at":"2026-04-09T13:56:09.702Z","repository":{"id":213574042,"uuid":"734373625","full_name":"faridzeynalov2000/full_project","owner":"faridzeynalov2000","description":"Consistent development of a large production project in React, including setting up the entire infrastructure, test environment, working with the server/data, etc. As a result, we get a large and technically complex project with a large number of commits per git.","archived":false,"fork":false,"pushed_at":"2024-06-23T09:43:16.000Z","size":1943,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-16T01:45:19.144Z","etag":null,"topics":["babel","cypress","eslint","husky","loki","prettier","react","reactjs","storybook","stylelint","typescript","vite","webpack","yarn"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/faridzeynalov2000.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-21T14:18:43.000Z","updated_at":"2024-06-23T09:56:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"fd886f56-5e0c-4368-9597-864254b923ea","html_url":"https://github.com/faridzeynalov2000/full_project","commit_stats":null,"previous_names":["faridzeynalov2000/full_project"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/faridzeynalov2000%2Ffull_project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/faridzeynalov2000%2Ffull_project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/faridzeynalov2000%2Ffull_project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/faridzeynalov2000%2Ffull_project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/faridzeynalov2000","download_url":"https://codeload.github.com/faridzeynalov2000/full_project/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242031452,"owners_count":20060586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["babel","cypress","eslint","husky","loki","prettier","react","reactjs","storybook","stylelint","typescript","vite","webpack","yarn"],"created_at":"2024-11-15T14:06:15.961Z","updated_at":"2025-12-30T19:54:07.019Z","avatar_url":"https://github.com/faridzeynalov2000.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Project Startup\n\n```\nnpm install - Install dependencies\nnpm run start:dev or npm run start:dev:vite - Start the server + frontend project in dev mode\n```\n\n---\n\n## Scripts\n\n-   `npm run start` - Start the frontend project on webpack dev server\n-   `npm run start:vite` - Start the frontend project on vite\n-   `npm run start:dev` - Start the frontend project on webpack dev server + backend\n-   `npm run start:dev:vite` - Start the frontend project on vite + backend\n-   `npm run start:dev:server` - Start the backend server\n-   `npm run build:prod` - Build in prod mode\n-   `npm run build:dev` - Build in dev mode (not minified)\n-   `npm run lint:ts` - Lint TS files\n-   `npm run lint:ts:fix` - Fix TS files with linter\n-   `npm run lint:scss` - Lint SCSS files with the style linter\n-   `npm run lint:scss:fix` - Fix SCSS files with the style linter\n-   `npm run test:unit` - Start unit tests with Jest\n-   `npm run test:ui` - Start screenshot tests with Loki\n-   `npm run test:ui:ok` - Confirm new screenshots\n-   `npm run test:ui:ci` - Run screenshot tests in CI\n-   `npm run test:ui:report` - Generate a full report for screenshot tests\n-   `npm run test:ui:json` - Generate a JSON report for screenshot tests\n-   `npm run test:ui:html` - Generate an HTML report for screenshot tests\n-   `npm run storybook` - Start Storybook\n-   `npm run storybook:build` - Build Storybook build\n-   `npm run prepare` - Pre-commit hooks\n-   `npm run generate:slice` - Script for generating FSD slices\n\n---\n\n## Project Architecture\n\nThe project is written in accordance with the Feature Sliced Design methodology.\n\nLink to the documentation - [feature sliced design](https://feature-sliced.design/docs/get-started/tutorial)\n\n---\n\n## Working with Translations\n\nThe project uses the i18next library for translations.\nTranslation files are stored in public/locales.\n\nFor comfortable work, we recommend installing a plugin for WebStorm/VSCode.\n\nDocumentation for i18next - [https://react.i18next.com/](https://react.i18next.com/)\n\n---\n\n## Testing\n\nThe project uses the following 4 types of tests:\n\n1. Regular unit tests with Jest - `npm run test:unit`\n2. Component tests with React Testing Library - `npm run test:unit`\n3. Screenshot testing with Loki - `npm run test:ui`\n4. e2e testing with Cypress - `npm run test:e2e`\n\nMore about tests - [testing documentation](/docs/tests.md)\n\n---\n\n## Linting\n\nThe project uses ESLint for TypeScript code checks and Stylelint for style file checks.\n\nTo strictly control the main architectural principles, the custom ESLint plugin _eslint-plugin-ulbi-tv-plugin_ is used, containing 3 rules:\n\n1. path-checker - forbids the use of absolute imports within a single module\n2. layer-imports - checks the correctness of layer usage from the perspective of FSD (for example, widgets cannot be used in features and entities)\n3. public-api-imports - allows imports from other modules only from the public API. Has auto-fix.\n\n##### Running Linters\n\n-   `npm run lint:ts` - Lint ts files\n-   `npm run lint:ts:fix` - Fix ts files with linter\n-   `npm run lint:scss` - Lint scss files with the style linter\n-   `npm run lint:scss:fix` - Fix scss files with the style linter\n\n---\n\n## Storybook\n\nEach component in the project has story cases described.\nServer requests are mocked using storybook-addon-mock.\n\nThe file with story cases is created next to the component with the .stories.tsx extension.\n\nTo launch Storybook, use the command:\n\n-   `npm run storybook`\n\nMore about [Storybook](/docs/storybook.md)\n\nExample:\n\n```typescript jsx\nimport React from 'react';\nimport { ComponentStory, ComponentMeta } from '@storybook/react';\n\nimport { ThemeDecorator } from 'shared/config/storybook/ThemeDecorator/ThemeDecorator';\nimport { Button, ButtonSize, ButtonTheme } from './Button';\nimport { Theme } from 'shared/const/theme';\n\nexport default {\n    title: 'shared/Button',\n    component: Button,\n    argTypes: {\n        backgroundColor: { control: 'color' },\n    },\n} as ComponentMeta\u003ctypeof Button\u003e;\n\nconst Template: ComponentStory\u003ctypeof Button\u003e = (args) =\u003e \u003cButton {...args} /\u003e;\n\nexport the Primary = Template.bind({});\nPrimary.args = {\n    children: 'Text',\n};\n\nexport the Clear = Template.bind({});\nClear.args = {\n    children: 'Text',\n    theme: ButtonTheme.CLEAR,\n};\n```\n\n---\n\n## Project Configuration\n\nThe project contains two configurations for development:\n\n1. Webpack - ./config/build\n2. Vite - vite.config.ts\n\nBoth builders are adapted to the main features of the application.\n\nAll configuration is stored in /config:\n\n-   /config/babel - babel configuration\n-   /config/build - webpack configuration\n-   /config/jest - test environment configuration\n-   /config/storybook - Storybook configuration\n\nThe `scripts` folder contains various scripts for refactoring, simplifying writing code, generating reports, etc.\n\n---\n\n## CI Pipeline and Pre-commit Hooks\n\nGitHub Actions configuration is found in /.github/workflows.\nIn CI, all types of tests are run, as well as project and Storybook builds and linting.\n\nPre-commit hooks check the project with linters, configuration in /.husky\n\n---\n\n### Working with Data\n\nData interaction is performed using the Redux Toolkit.\nWhenever possible, reusable entities should be normalized using EntityAdapter.\n\nServer requests are sent through [RTK query](/src/shared/api/rtkApi.ts).\n\nFor asynchronous connection of reducers (to avoid pulling them into the global bundle), [DynamicModuleLoader](/src/shared/lib/components/DynamicModuleLoader/DynamicModuleLoader.tsx) is used.\n\n---\n\n### Working with Feature Flags\n\nThe use of feature flags is only allowed using the toggleFeatures helper.\n\nAn object with the following options is passed to it:\n\n{\n    name: name of the feature flag,\n    on: a function that will work after turning on the feature,\n    off: a function that will work after turning off the feature\n}\n\nTo automatically remove a feature, use the remove-feature.ts script,\nwhich accepts two arguments:\n\n1. The name of the feature flag to be removed\n2. The state (on/off)\n\n---\n\n## Entities\n\n-   [Article](/src/entities/Article)\n-   [Comment](/src/entities/Comment)\n-   [Counter](/src/entities/Counter)\n-   [Country](/src/entities/Country)\n-   [Currency](/src/entities/Currency)\n-   [Notification](/src/entities/Notification)\n-   [Profile](/src/entities/Profile)\n-   [Rating](/src/entities/Rating)\n-   [User](/src/entities/User)\n\n## Features\n\n-   [addCommentForm](/src/features/addCommentForm)\n-   [articleEditForm](/src/features/articleEditForm)\n-   [articleRating](/src/features/articleRating)\n-   [articleRecommendationsList](/src/features/articleRecommendationsList)\n-   [AuthByUsername](/src/features/AuthByUsername)\n-   [avatarDropdown](/src/features/avatarDropdown)\n-   [editableProfileCard](/src/features/editableProfileCard)\n-   [LangSwitcher](/src/features/LangSwitcher)\n-   [notificationButton](/src/features/notificationButton)\n-   [profileRating](/src/features/profileRating)\n-   [ThemeSwitcher](/src/features/ThemeSwitcher)\n-   [UI](/src/features/UI)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffaridzeynalov2000%2Ffull_project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffaridzeynalov2000%2Ffull_project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffaridzeynalov2000%2Ffull_project/lists"}