Skip to content

Commit

Permalink
chore(refactoring): adding codeway rules + semgrep
Browse files Browse the repository at this point in the history
  • Loading branch information
ammichael committed Nov 9, 2024
1 parent 9b5709c commit 08879dd
Show file tree
Hide file tree
Showing 10 changed files with 474 additions and 10 deletions.
13 changes: 13 additions & 0 deletions codeway/rules/performance.yml
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']
29 changes: 29 additions & 0 deletions codeway/rules/security.yml
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']
185 changes: 185 additions & 0 deletions codeway/rules/structure.yml
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']
146 changes: 146 additions & 0 deletions codeway/rules/theme.yml
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']
Loading

0 comments on commit 08879dd

Please sign in to comment.