-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(refactoring): adding codeway rules + semgrep
- Loading branch information
Showing
10 changed files
with
474 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
rules: | ||
- id: use-fastimage-instead-of-image | ||
languages: [javascript, typescript] | ||
message: 'Sempre use o módulo FastImage no lugar de styled.Image para melhorar a performance no carregamento de imagens.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "styled\\.Image" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'O FastImage oferece melhor desempenho no carregamento de imagens em comparação com o Image padrão do React Native. Use FastImage para garantir uma experiência de usuário mais fluida e eficiente.' | ||
tags: ['styles', 'image', 'performance', 'fastimage'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
rules: | ||
- id: avoid-console-logs | ||
languages: [javascript, typescript] | ||
message: 'Parece que um console.log() ou similar foi esquecido. Remova para evitar exposição de informações.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "(console\\.log|console\\.warn|console\\.table|console\\.assert|console\\.count|console\\.dir|console\\.error|console\\.group|console\\.info)" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- 'src/bootstrap.tsx' | ||
- '*.stories.tsx' | ||
- 'src/components/FormError/index.tsx' | ||
metadata: | ||
description: 'Esta regra captura o uso de funções do console, como log ou warn, que podem ter sido deixadas acidentalmente. É importante remover esses logs em produção para evitar a exposição de informações sensíveis ou desnecessárias.' | ||
tags: ['console', 'logs', 'debugging'] | ||
|
||
- id: avoid-console-tron-in-production | ||
languages: [javascript, typescript] | ||
message: 'Evite usar console.tron em builds de produção. Pode causar crashes silenciosos e dificultar o debugging.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "(console\\.tron\\.log|console\\.tron\\.warn|console\\.tron\\.table|console\\.tron\\.assert|console\\.tron\\.count|console\\.tron\\.dir|console\\.tron\\.error|console\\.tron\\.group|console\\.tron\\.info)" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Esta regra detecta o uso de console.tron (Reactotron) em builds de produção, o que pode causar crashes silenciosos. Deve ser removido para evitar problemas graves no ambiente de produção.' | ||
tags: ['reactotron', 'logs', 'debugging', 'production'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
rules: | ||
- id: no-class-in-components | ||
languages: [javascript, typescript] | ||
message: 'Evite usar classes em componentes. Use funções ou hooks.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "class\\s?\\w+\\sextends" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- 'src/components/PinInput/lib/react-native-smooth-pincode-input/index.d.ts' | ||
metadata: | ||
description: 'Essa regra evita o uso de classes em componentes React. A abordagem funcional com hooks é recomendada para garantir código mais simples e fácil de manter.' | ||
tags: ['classes', 'componentes', 'react'] | ||
|
||
- id: use-enum-instead-of-string-comparisons | ||
languages: [javascript, typescript] | ||
message: 'Use ENUM para comparações em vez de strings. Comparar strings diretamente torna o código menos escalável e mais suscetível a erros.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: '(("|'').+("|'') (===|!==|>=|<=|>|<|=>|=<))|(===|!==|>=|<=|>|<|=>|=<) ("|'').+("|'')' | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- '*.test.tsx' | ||
- '**/**/svg/*' | ||
- 'src/components/FormError/index.tsx' | ||
- 'src/components/Image/index.tsx' | ||
metadata: | ||
description: 'Esta regra sugere o uso de ENUMs em vez de comparações diretas por string. O uso de ENUMs torna o código mais escalável e reduz a chance de erros em comparações lógicas.' | ||
tags: ['comparações', 'enum', 'strings'] | ||
|
||
- id: use-specific-response-type-instead-of-axiosresponse | ||
languages: [javascript, typescript] | ||
message: 'Indique o tipo de dado retornado em vez de utilizar `AxiosResponse` diretamente. Isso ajuda a prever o formato dos dados e garante maior segurança de tipos.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "\\s?(Promise<AxiosResponse>|AxiosResponse)" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- 'src/api/interceptors/*' | ||
metadata: | ||
description: 'Esta regra sugere o uso de tipos de dados específicos no lugar de `AxiosResponse` ao trabalhar com Axios. Usar tipos claros ajuda a melhorar a previsibilidade e a segurança dos dados retornados.' | ||
tags: ['axios', 'tipagem', 'promises'] | ||
|
||
- id: return-only-request-data | ||
languages: [javascript, typescript] | ||
message: 'Sempre retorne diretamente o data da requisição: `const { data } = await request`. Isso simplifica o manuseio de respostas.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "return\\s+await\\s+request\\.[\\w]+\\(" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Ao retornar respostas de requisições, sempre extraia e retorne o `data` diretamente, garantindo que o código seja mais simples e focado nos dados retornados pela requisição.' | ||
tags: ['request', 'axios', 'data', 'async', 'await'] | ||
|
||
- id: prefer-type-for-simple-types | ||
languages: [javascript, typescript] | ||
message: 'Prefira o uso de Type para definição de tipos simples e união de tipos. Use Interface para objetos ou quando precisar de extensão.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "interface\\s+\\w+\\s+{\\s*[^extends].*Props.*" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Recomenda-se o uso de Type para criação de tipos simples ou união de tipos em TypeScript. Interface ainda pode ser usada para definir a estrutura de objetos ou quando é necessária extensão.' | ||
tags: ['typescript', 'types', 'interface', 'props', 'type'] | ||
|
||
- id: use-custom-touchable-component | ||
languages: [javascript, typescript] | ||
message: 'Sempre utilize o componente personalizado Touchable em vez de TouchableOpacity, TouchableHighlight ou Pressable diretamente.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "styled\\.(TouchableOpacity|TouchableHighlight|Pressable)" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Para garantir consistência de comportamento e estilos, utilize o componente customizado Touchable no lugar dos componentes nativos TouchableOpacity, TouchableHighlight ou Pressable.' | ||
tags: ['styles', 'touchable', 'components', 'custom-components'] | ||
|
||
- id: use-array-syntax-instead-of-array-generic | ||
languages: [javascript, typescript] | ||
message: "Utilize '[]' em vez de 'Array<>' para definir tipos de arrays." | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: 'Array<.*>' | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: "Prefira a notação '[]' para definir tipos de arrays em TypeScript, em vez da sintaxe genérica 'Array<>'. A notação de array é mais legível e comum." | ||
tags: ['types', 'array', 'typescript'] | ||
|
||
- id: use-await-instead-of-then | ||
languages: [javascript, typescript] | ||
message: "Utilize 'await' em vez de '.then()' para lidar com Promises. Isso torna o código mais conciso e legível." | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: ".*\\.then\\(.*\\).*" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- '*.spec.ts' | ||
- '*.spec.js' | ||
- '*.cy.ts' | ||
metadata: | ||
description: "Prefira usar 'await' em vez de '.then()' ao lidar com Promises, tornando o código mais simples e fácil de ler. Async/await é a abordagem mais moderna e recomendada." | ||
tags: ['async', 'await', 'promises'] | ||
|
||
- id: api-call-only-in-stores | ||
languages: [javascript, typescript] | ||
message: 'Todas as chamadas de API devem ser feitas a partir do diretório /api e consumidas nas Stores para simplificar o fluxo de dados, facilitar o debug e promover a reutilização de dados no state.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-either: | ||
- pattern-regex: "import\\s?{.*}\\s?from\\s?['\"]~\\/api['\"];" | ||
- pattern-regex: "\\.\\s*(get|post|put|delete)\\s*\\(\\s*[`'\"].*\\/.*[`'\"].*\\)" | ||
- pattern-regex: "Api\\." | ||
paths: | ||
exclude: | ||
- '*.store.ts' | ||
- '*.api.ts' | ||
- '*.mock.ts' | ||
- '*.test.ts' | ||
- '*.spec.ts' | ||
|
||
metadata: | ||
description: 'As chamadas de API devem ser feitas no diretório /api e consumidas exclusivamente dentro das Stores. Isso proporciona simplificação do fluxo de dados, facilidade de debug e reutilização eficiente de dados no state. Além disso, essa abordagem melhora a organização e a escalabilidade do código.' | ||
tags: ['api', 'store', 'architecture', 'import', 'post', 'get'] | ||
|
||
- id: avoid-long-functions | ||
languages: [javascript, typescript] | ||
message: 'Funções com mais de 50 linhas devem ser refatoradas para melhorar a legibilidade e modularidade.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "function\\s+\\w+\\(.*\\)\\s*{((?:[^}]*\\n){50,})" | ||
metadata: | ||
description: 'Funções muito longas podem ser difíceis de entender e manter. Recomendado refatorar funções com mais de 50 linhas.' | ||
tags: ['function', 'modularity', 'readability'] | ||
|
||
- id: avoid-global-variables | ||
languages: [javascript, typescript] | ||
message: 'Evite variáveis globais. Prefira escopo local ou modularização.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "var\\s+\\w+\\s*=\\s*.*;" | ||
paths: | ||
exclude: | ||
- '*.module.ts' | ||
metadata: | ||
description: 'Variáveis globais podem causar conflitos em grandes aplicações. Prefira usar escopo local ou módulos.' | ||
tags: ['variables', 'global', 'modularity'] | ||
|
||
- id: avoid-too-many-parameters | ||
languages: [javascript, typescript] | ||
message: 'Funções com mais de 3 parâmetros devem ser simplificadas. Prefira passar um objeto com as propriedades.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "function\\s+\\w+\\([^,]{4,}\\)" | ||
paths: | ||
exclude: | ||
- '*/navigation/*' | ||
metadata: | ||
description: 'Funções com muitos parâmetros são difíceis de ler e manter. Prefira passar um objeto para maior clareza.' | ||
tags: ['function', 'parameters', 'modularity'] | ||
|
||
- id: avoid-single-letter-variables | ||
languages: [javascript, typescript] | ||
message: 'Evite usar nomes de variáveis de uma única letra. Prefira nomes mais descritivos.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "(var|let|const)\\s+[a-zA-Z]\\s?=.*;" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- '*.test.*' | ||
- '*.spec.*' | ||
metadata: | ||
description: 'Nomes de variáveis de uma única letra reduzem a legibilidade. Use nomes mais descritivos, exceto em loops simples.' | ||
tags: ['variables', 'naming', 'readability'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
rules: | ||
- id: avoid-scale-functions-react-native | ||
languages: [javascript, typescript] | ||
message: 'Evite usar funções como scale ou moderateScale para definir width ou height. O React Native já faz o scaling nativamente.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "(moderateScale|scale)\\(\\d+\\)" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Esta regra sugere evitar o uso de funções como scale ou moderateScale, já que o React Native já faz o scaling de forma nativa, tornando o código mais simples e performático.' | ||
tags: ['width', 'height', 'responsividade', 'react-native'] | ||
|
||
- id: avoid-stylesheet-use-styled-components | ||
languages: [javascript, typescript] | ||
message: 'Evite usar StyleSheet.create. Utilize styled-components para definir estilos.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "StyleSheet\\.create" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- 'src/components/PinInput/lib/react-native-smooth-pincode-input/SmoothPinCodeInput.js' | ||
metadata: | ||
description: 'Esta regra proíbe o uso de StyleSheet.create no React Native e recomenda a utilização de styled-components para definir estilos, promovendo uma abordagem mais moderna e flexível.' | ||
tags: ['styles', 'react-native', 'styled-components'] | ||
|
||
- id: avoid-direct-theme-import | ||
languages: [javascript, typescript] | ||
message: 'Importação direta do tema não é permitida. Utilize um módulo intermediário para gerenciar temas.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "import\\s?{.*}\\s?from\\s?'~\/theme'" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: "Esta regra impede a importação direta do tema da aplicação ('~/theme'). É recomendada a utilização de módulos intermediários para gerenciar e manter a modularidade do tema no código." | ||
tags: ['theme', 'import', 'modularidade'] | ||
|
||
- id: prefer-hairlinewidth-over-1px | ||
languages: [javascript, typescript] | ||
message: 'O ideal seria usar StyleSheet.hairlineWidth em vez de utilizar 1px ou 1 diretamente. Isso garante consistência de design em múltiplas resoluções.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "height:\\s?(\\${moderateScale\\(1\\)}|\\${scale\\(1\\)\\}|1;|1\\s|1px)" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Esta regra sugere o uso de StyleSheet.hairlineWidth ao invés de definir height como 1 ou 1px diretamente, garantindo melhor consistência e adaptabilidade do design entre diferentes resoluções de tela.' | ||
tags: ['styles', 'height', 'hairlineWidth'] | ||
|
||
- id: avoid-scale-or-moderatescale-in-fontsize | ||
languages: [javascript, typescript] | ||
message: 'Evite usar moderateScale ou scale no fontSize. O React Native já faz o escalonamento de fontes de forma nativa.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "(fontSize:\\s?\\${moderateScale\\(\\d+\\)}|fontSize:\\s?\\${scale\\(\\d+\\)})" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Essa regra proíbe o uso de moderateScale ou scale para definir o tamanho de fonte. O React Native já realiza o escalonamento de fontes de forma nativa, garantindo consistência entre dispositivos.' | ||
tags: ['styles', 'fontsize', 'scale', 'moderatescale'] | ||
|
||
- id: avoid-styled-text-use-typography | ||
languages: [javascript, typescript] | ||
message: 'Evite usar styled.Text. Use o componente Typography, que contém lógica de renderização e sizing de fontes.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "styled\\.Text`" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'O componente Typography deve ser utilizado no lugar de styled.Text, pois ele já contém a lógica de renderização e sizing de fontes, garantindo consistência e eficiência no código.' | ||
tags: ['styled-components', 'typography', 'fonts'] | ||
|
||
- id: prefer-font-weight-bold | ||
languages: [javascript, typescript] | ||
message: 'Recomenda-se usar font-weight: bold; para evitar problemas de renderização no Android.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "font-weight:\\s?600" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Evite usar font-weight: 600 em estilos, pois pode causar problemas de renderização em dispositivos Android. Use font-weight: bold para garantir uma exibição consistente.' | ||
tags: ['styles', 'font-weight', 'android', 'bold'] | ||
|
||
- id: prefer-correct-border-radius-from-theme | ||
languages: [javascript, typescript] | ||
message: "Recomenda-se usar valores de border-radius obtidos corretamente do tema, por meio de getTheme('borderRadius')." | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "const\\s+\\w+\\s?=\\s?getTheme\\('border\\w+'\\);" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: "Garanta que os valores de border-radius sejam obtidos do tema corretamente utilizando getTheme('borderRadius'). Isso assegura consistência no design." | ||
tags: ['styles', 'border-radius', 'theme'] | ||
|
||
- id: prefer-theme-colors | ||
languages: [javascript, typescript] | ||
message: 'Sempre utilize cores definidas no tema. Evite o uso de códigos hexadecimais hardcoded.' | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: ".*?:\\s?#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'As cores devem ser obtidas a partir do tema da aplicação, garantindo consistência e facilitando a manutenção. Evite usar códigos hexadecimais diretamente.' | ||
tags: ['styles', 'colors', 'theme'] | ||
|
||
- id: use-theme-spacing | ||
languages: [javascript, typescript] | ||
message: "Utilize valores de spacing vindos do tema corretamente, como 'padding: ${smallSpacing}px'." | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: "(padding|margin)(-?)(left|right|top|bottom|vertical|horizontal)?:\\s?(\\d+px);" | ||
paths: | ||
exclude: | ||
- '*.json' | ||
metadata: | ||
description: 'Os valores de padding e margin devem ser obtidos diretamente do tema da aplicação, garantindo consistência no espaçamento entre os elementos. Evite usar valores fixos em pixels.' | ||
tags: ['styles', 'spacing', 'theme', 'padding', 'margin'] | ||
|
||
- id: use-variant-instead-of-fontsize | ||
languages: [javascript, typescript] | ||
message: "Utilize a prop 'variant' do componente Typography em vez de definir 'font-size' manualmente." | ||
severity: WARNING | ||
patterns: | ||
- pattern-regex: 'font-size' | ||
paths: | ||
exclude: | ||
- '*.json' | ||
- 'src/components/Avatar/styles.ts' | ||
- 'src/components/Typography/styles.ts' | ||
metadata: | ||
description: "Para garantir consistência tipográfica e centralizar a lógica de estilos de fonte, utilize a prop 'variant' no componente Typography em vez de definir 'font-size' manualmente." | ||
tags: ['styles', 'typography', 'variant', 'font-size'] |
Oops, something went wrong.