├── .jest
└── setup.js
├── .prettierrc
├── generators
├── templates
│ ├── hook
│ │ ├── index.js.hbs
│ │ ├── hook.js.hbs
│ │ └── test.js.hbs
│ └── component
│ │ ├── index.js.hbs
│ │ ├── component.jsx.hbs
│ │ └── test.jsx.hbs
├── plopfile.cjs
├── hook.generator.cjs
└── component.generator.cjs
├── jsconfig.json
├── src
├── App.jsx
└── main.jsx
├── vite.config.js
├── .editorconfig
├── babel.config.cjs
├── jest.config.cjs
├── .gitignore
├── index.html
├── .eslintrc.json
├── public
└── vite.svg
├── package.json
└── README.md
/.jest/setup.js:
--------------------------------------------------------------------------------
1 | import "@testing-library/jest-dom";
2 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "trailingComma": "none",
3 | "semi": false,
4 | "singleQuote": true
5 | }
6 |
--------------------------------------------------------------------------------
/generators/templates/hook/index.js.hbs:
--------------------------------------------------------------------------------
1 | export { default as {{camelCase name}} } from './{{camelCase name}}'
2 |
--------------------------------------------------------------------------------
/generators/templates/component/index.js.hbs:
--------------------------------------------------------------------------------
1 | export { default as {{pascalCase name}} } from './{{pascalCase name}}'
2 |
--------------------------------------------------------------------------------
/generators/templates/hook/hook.js.hbs:
--------------------------------------------------------------------------------
1 | function {{camelCase name}}() {
2 | return true
3 | }
4 |
5 | export default {{camelCase name}}
6 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "jsx": "react-jsx",
4 | "types": ["node", "jest", "@testing-library/jest-dom"],
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/src/App.jsx:
--------------------------------------------------------------------------------
1 | function App() {
2 | return (
3 |
4 | React JavaScript boilerplate
5 |
6 | )
7 | }
8 |
9 | export default App
10 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()]
7 | })
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
--------------------------------------------------------------------------------
/babel.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | ['@babel/preset-env', { modules: 'auto' }],
4 | [
5 | '@babel/preset-react',
6 | {
7 | runtime: 'automatic'
8 | }
9 | ]
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App'
4 |
5 | ReactDOM.createRoot(document.getElementById('root')).render(
6 |
7 |
8 |
9 | )
10 |
--------------------------------------------------------------------------------
/generators/plopfile.cjs:
--------------------------------------------------------------------------------
1 | const componentGenerator = require('./component.generator.cjs')
2 | const hookGenerator = require('./hook.generator.cjs')
3 |
4 | module.exports = function generator(plop) {
5 | plop.setGenerator('component', componentGenerator)
6 | plop.setGenerator('hook', hookGenerator)
7 | }
8 |
--------------------------------------------------------------------------------
/generators/templates/component/component.jsx.hbs:
--------------------------------------------------------------------------------
1 | import PropTypes from 'prop-types'
2 |
3 | function {{pascalCase name}}(props) {
4 | const { children } = props
5 |
6 | return {children}
7 | }
8 |
9 | {{pascalCase name}}.propTypes = {
10 | children: PropTypes.node
11 | }
12 |
13 | export default {{pascalCase name}}
14 |
--------------------------------------------------------------------------------
/generators/templates/hook/test.js.hbs:
--------------------------------------------------------------------------------
1 | import { renderHook } from '@testing-library/react'
2 | import {{camelCase name}} from './{{camelCase name}}'
3 |
4 | describe('{{camelCase name}}', () => {
5 | it('...', () => {
6 | const { result } = renderHook(() => {{camelCase name}}())
7 |
8 | expect(result.current).toBe(true)
9 | })
10 | })
11 |
--------------------------------------------------------------------------------
/jest.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | testEnvironment: 'jsdom',
3 | testPathIgnorePatterns: ['/dist/', '/node_modules/', '/public/'],
4 | collectCoverageFrom: ['src/**/*.js(x)?', '!src/**/index.js', '!src/main.jsx'],
5 | modulePaths: ['/src/'],
6 | setupFilesAfterEnv: ['/.jest/setup.js'],
7 | transform: {
8 | '^.+\\.jsx?$': 'babel-jest'
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | # jest
27 | coverage
28 |
--------------------------------------------------------------------------------
/generators/templates/component/test.jsx.hbs:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react'
2 | import {{pascalCase name}} from './{{pascalCase name}}'
3 |
4 | describe('{{pascalCase name}}', () => {
5 | it('...', () => {
6 | render(<{{pascalCase name}}>{{pascalCase name}}{{pascalCase name}}>)
7 |
8 | expect(screen.getByText('{{pascalCase name}}')).toBeInTheDocument()
9 | })
10 | })
11 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | React JavaScript boilerplate
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true,
5 | "node": true,
6 | "jest": true
7 | },
8 | "settings": {
9 | "react": {
10 | "version": "detect"
11 | }
12 | },
13 | "extends": [
14 | "eslint:recommended",
15 | "plugin:react/recommended",
16 | "plugin:prettier/recommended"
17 | ],
18 | "overrides": [
19 | ],
20 | "parserOptions": {
21 | "ecmaVersion": "latest",
22 | "sourceType": "module"
23 | },
24 | "plugins": [
25 | "react",
26 | "react-hooks"
27 | ],
28 | "rules": {
29 | "react-hooks/rules-of-hooks": "error",
30 | "react-hooks/exhaustive-deps": "warn",
31 | "react/react-in-jsx-scope": "off"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/generators/hook.generator.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | description: 'application hook',
3 | prompts: [
4 | {
5 | type: 'input',
6 | name: 'name',
7 | message:
8 | 'Qual o nome do hook? Se o hook possuir mais de uma palavra insira um espaço entre elas.'
9 | }
10 | ],
11 | actions: [
12 | {
13 | type: 'add',
14 | path: '../src/hooks/{{camelCase name}}/index.js',
15 | templateFile: './templates/hook/index.js.hbs'
16 | },
17 | {
18 | type: 'add',
19 | path: '../src/hooks/{{camelCase name}}/{{camelCase name}}.js',
20 | templateFile: './templates/hook/hook.js.hbs'
21 | },
22 | {
23 | type: 'add',
24 | path: '../src/hooks/{{camelCase name}}/{{camelCase name}}.test.js',
25 | templateFile: './templates/hook/test.js.hbs'
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/generators/component.generator.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | description: 'application component',
3 | prompts: [
4 | {
5 | type: 'input',
6 | name: 'name',
7 | message:
8 | 'Qual o nome do componente? Se o componente possuir mais de uma palavra insira um espaço entre elas.'
9 | }
10 | ],
11 | actions: [
12 | {
13 | type: 'add',
14 | path: '../src/components/{{pascalCase name}}/index.js',
15 | templateFile: './templates/component/index.js.hbs'
16 | },
17 | {
18 | type: 'add',
19 | path: '../src/components/{{pascalCase name}}/{{pascalCase name}}.jsx',
20 | templateFile: './templates/component/component.jsx.hbs'
21 | },
22 | {
23 | type: 'add',
24 | path: '../src/components/{{pascalCase name}}/{{pascalCase name}}.test.jsx',
25 | templateFile: './templates/component/test.jsx.hbs'
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-javascript-boilerplate",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview",
10 | "lint": "eslint 'src/**/*.{js,jsx}'",
11 | "lint:fix": "npm run lint -- --fix",
12 | "test": "jest",
13 | "test:watch": "jest --watch",
14 | "coverage-test": "jest --coverage",
15 | "coverage-test:watch": "jest --coverage --watch",
16 | "generate:component": "plop component --plopfile ./generators/plopfile.cjs",
17 | "generate:hook": "plop hook --plopfile ./generators/plopfile.cjs"
18 | },
19 | "dependencies": {
20 | "prop-types": "^15.8.1",
21 | "react": "^18.2.0",
22 | "react-dom": "^18.2.0"
23 | },
24 | "devDependencies": {
25 | "@babel/preset-env": "^7.19.1",
26 | "@babel/preset-react": "^7.18.6",
27 | "@testing-library/jest-dom": "^5.16.5",
28 | "@testing-library/react": "^13.4.0",
29 | "@types/react": "^18.0.17",
30 | "@types/react-dom": "^18.0.6",
31 | "@vitejs/plugin-react": "^2.1.0",
32 | "eslint": "^8.23.1",
33 | "eslint-config-prettier": "^8.5.0",
34 | "eslint-plugin-prettier": "^4.2.1",
35 | "eslint-plugin-react": "^7.31.8",
36 | "eslint-plugin-react-hooks": "^4.6.0",
37 | "jest": "^29.0.3",
38 | "jest-environment-jsdom": "^29.0.3",
39 | "plop": "^3.1.1",
40 | "prettier": "^2.7.1",
41 | "vite": "^3.1.0"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # React JavaScript Boilerplate
2 |
3 | ## O que foi utilizado?
4 |
5 | - [Vite](https://vitejs.dev)
6 | - [EditorConfig](https://editorconfig.org)
7 | - [ESLint](https://eslint.org)
8 | - [Prettier](https://prettier.io)
9 | - [Jest](https://jestjs.io)
10 | - [React Testing Library](https://testing-library.com/docs/react-testing-library/intro)
11 | - [Plop js](https://plopjs.com)
12 |
13 | ## Começando
14 |
15 | Primeiro, execute o servidor em modo de desenvolvimento:
16 |
17 | ```bash
18 | npm run dev
19 | # or
20 | yarn dev
21 | ```
22 |
23 | Abra a URL [http://localhost:5173](http://localhost:5173) no seu navegador.
24 |
25 | ## Scripts
26 |
27 | - `dev`: inicia a aplicação em modo de desenvolvimento;
28 | - `build`: cria a versão de produção;
29 | - `preview`: inicializa um servidor web estático local que serve os arquivos do diretório `dist` (é uma maneira fácil de verificar se a compilação de produção está funcionando corretamente);
30 | - `lint`: executa o linter em todos os arquivos que estão na regra de configuração;
31 | - `lint:fix`: executa o linter e corrige todos os arquivos que estão na regra de configuração;
32 | - `test`: executa os testes unitários e de integração;
33 | - `test:watch`: executa os testes unitários e de integração em modo escuta;
34 | - `coverage-test`: executa os testes unitários e de integração e gera um relatório de cobertura de código;
35 | - `coverage-test:watch`: executa os testes unitários e de integração e gera um relatório de cobertura de código em modo escuta;
36 | - `generate:component`: cria estrutura básica de um componente;
37 | - `generate:hook`: cria estrutura básica de um hook.
38 |
39 |
--------------------------------------------------------------------------------