Adicione eslint, mais bonito, env ao aplicativo.
É uma pena que o Angular, por padrão, não gere tudo isso sozinho. Alterar esquemas pode melhorar a qualidade de vários milhares de projetos Angular.
Conectar eslint:
yarn ng add @angular-eslint/schematics
Três pacotes foram adicionados ao package.json:
{ "devDependencies": { …, "angular-eslint": "18.0.1", "eslint": "^9.3.0", "typescript-eslint": "8.0.0-alpha.20" } }
E no alvo em angular.json:
{ "projects": { "buy-and-fly": { "architect": { …, "lint": { "builder": "@angular-eslint/builder:lint", "options": { "lintFilePatterns": [ "src/**/*.ts", "src/**/*.html" ] } } } } }, "cli": { "schematicCollections": [ "@angular-eslint/schematics" ] } }
O arquivo eslint.config.js também foi criado:
// @ts-check const eslint = require("@eslint/js"); const tseslint = require("typescript-eslint"); const angular = require("angular-eslint"); module.exports = tseslint.config( { files: ["**/*.ts"], extends: [ eslint.configs.recommended, ...tseslint.configs.recommended, ...tseslint.configs.stylistic, ...angular.configs.tsRecommended, ], processor: angular.processInlineTemplates, rules: { "@angular-eslint/directive-selector": [ "error", { type: "attribute", prefix: "app", style: "camelCase", }, ], "@angular-eslint/component-selector": [ "error", { type: "element", prefix: "app", style: "kebab-case", }, ], }, }, { files: ["**/*.html"], extends: [ ...angular.configs.templateRecommended, ...angular.configs.templateAccessibility, ], rules: {}, } );
Linters básicos são bons, mas você pode torná-los melhores!
Adicionar um plug-in:
yarn add -D eslint-plugin-simple-import-sort
Vamos incluir várias regras:
// @ts-check const eslint = require('@eslint/js'); const tseslint = require('typescript-eslint'); const angular = require('angular-eslint'); const simpleImportSort = require('eslint-plugin-simple-import-sort'); module.exports = tseslint.config( { files: ['**/*.ts'], extends: [ eslint.configs.recommended, ...tseslint.configs.recommended, ...tseslint.configs.stylistic, ...angular.configs.tsRecommended, { plugins: { 'simple-import-sort': simpleImportSort, }, rules: { 'simple-import-sort/imports': [ 'error', { groups: [['^\\u0000'], ['^@?(?!baf)\\w'], ['^@baf?\\w'], ['^\\w'], ['^[^.]'], ['^\\.']], }, ], 'simple-import-sort/exports': 'error', }, }, ], processor: angular.processInlineTemplates, rules: { '@angular-eslint/directive-selector': [ 'error', { type: 'attribute', prefix: 'baf', style: 'camelCase', }, ], '@angular-eslint/component-selector': [ 'error', { type: 'element', prefix: 'baf', style: 'kebab-case', }, ], '@typescript-eslint/naming-convention': [ 'error', { selector: 'default', format: ['camelCase'], leadingUnderscore: 'allow', trailingUnderscore: 'allow', filter: { regex: '^(ts-jest|\\^.*)$', match: false, }, }, { selector: 'default', format: ['camelCase'], leadingUnderscore: 'allow', trailingUnderscore: 'allow', }, { selector: 'variable', format: ['camelCase', 'UPPER_CASE'], leadingUnderscore: 'allow', trailingUnderscore: 'allow', }, { selector: 'typeLike', format: ['PascalCase'], }, { selector: 'enumMember', format: ['PascalCase'], }, { selector: 'property', format: null, filter: { regex: '^(host)$', match: false, }, }, ], complexity: 'error', 'max-len': [ 'error', { code: 140, }, ], 'no-new-wrappers': 'error', 'no-throw-literal': 'error', '@typescript-eslint/consistent-type-definitions': 'error', 'no-shadow': 'off', '@typescript-eslint/no-shadow': 'error', 'no-invalid-this': 'off', '@typescript-eslint/no-invalid-this': ['warn'], '@angular-eslint/no-host-metadata-property': 'off', }, }, { files: ['**/*.html'], extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], rules: {}, }, )'], ['^\\.']], }, ], 'simple-import-sort/exportações': 'erro', }, }, ], processador: angular.processInlineTemplates, regras: { '@angular-eslint/seletor de diretiva': [ 'erro', { tipo: 'atributo', prefixo: 'baf', estilo: 'camelCase', }, ], '@angular-eslint/seletor de componente': [ 'erro', { tipo: 'elemento', prefixo: 'baf', estilo: 'caso de kebab', }, ], '@typescript-eslint/convenção de nomenclatura': [ 'erro', { seletor: 'padrão', formato: ['camelCase'], sublinhado principal: 'permitir', sublinhado à direita: 'permitir', filtro: { regex: '^(ts-jest|\\^.*)$', correspondência: falso, }, }, { seletor: 'padrão', formato: ['camelCase'], sublinhado principal: 'permitir', sublinhado à direita: 'permitir', }, { seletor: 'variável', formato: ['camelCase', 'UPPER_CASE'], sublinhado principal: 'permitir', sublinhado à direita: 'permitir', }, { seletor: 'typeLike', formato: ['PascalCase'], }, { seletor: 'enumMember', formato: ['PascalCase'], }, { seletor: 'propriedade', formato: nulo, filtro: { regex: '^(host)$', correspondência: falso, }, }, ], complexidade: 'erro', 'max-len': [ 'erro', { código: 140, }, ], 'sem novos wrappers': 'erro', 'no-throw-literal': 'erro', '@typescript-eslint/consistent-type-definitions': 'erro', 'sem sombra': 'desligado', '@typescript-eslint/no-shadow': 'erro', 'não-inválido-isso': 'desligado', '@typescript-eslint/no-invalid-this': ['avisar'], '@angular-eslint/no-host-metadata-property': 'desligado', }, }, { arquivos: ['**/*.html'], estende: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], regras: {}, }, )
Altere o prefixo do aplicativo em angular.json de app para baf.
Observe que o plug-in eslint-plugin-import não é compatível com eslint 9.
Há uma discussão acalorada no github - github.com/import-js/eslint-plugin-import/issues/2948
Adicionar mais bonito:
yarn add -D prettierfio adicionar -D mais bonito
Vamos definir as regras em .prettierrc.json:
yarn add -D prettier{ "bracketSpacing": verdadeiro, "largura de impressão": 140, "semi": verdadeiro, "singleQuote": verdadeiro, "largura da guia": 2, "useTabs": falso }
Exclua tudo que não deve ser formatado em .prettierignore:
yarn add -D prettier# Adicione arquivos aqui para ignorá-los e obter uma formatação mais bonita /dist /cobertura /tmp /node_modules /nginx /.vscode /.ideia pacote-lock.json pacote.json fio.lock .angular /junit junit.xml /.nx/cache
No IDE nas configurações mais bonitas - **/*.{js,ts,jsx,tsx,vue,astro,scss,css,html,json}.
Todas as fontes estão no github, no repositório - github.com/Fafnur/buy-and-fly
A demonstração pode ser vista aqui - buy-and-fly.fafn.ru/
Meus grupos: telegram, medium, vk, x.com, linkedin, site
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3