Agregue eslint, prettier, env a la aplicación.
Es una pena que Angular, de forma predeterminada, no genere todo esto por sí mismo. Cambiar los esquemas puede mejorar la calidad de varios miles de proyectos de Angular.
Conectar eslint:
yarn ng add @angular-eslint/schematics
Se han agregado tres paquetes a package.json:
{ "devDependencies": { …, "angular-eslint": "18.0.1", "eslint": "^9.3.0", "typescript-eslint": "8.0.0-alpha.20" } }
Y en el objetivo en angular.json:
{ "projects": { "buy-and-fly": { "architect": { …, "lint": { "builder": "@angular-eslint/builder:lint", "options": { "lintFilePatterns": [ "src/**/*.ts", "src/**/*.html" ] } } } } }, "cli": { "schematicCollections": [ "@angular-eslint/schematics" ] } }
También se creó el archivo eslint.config.js:
// @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: {}, } );
Los linters básicos son buenos, ¡pero puedes mejorarlos!
Agregar un complemento:
yarn add -D eslint-plugin-simple-import-sort
Incluyamos varias reglas:
// @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-importación-ordenación/exportaciones': 'error', }, }, ], procesador: angular.processInlineTemplates, normas: { '@angular-eslint/selector-directiva': [ 'error', { tipo: 'atributo', prefijo: 'baf', estilo: 'camelCase', }, ], '@angular-eslint/selector-de-componentes': [ 'error', { tipo: 'elemento', prefijo: 'baf', estilo: 'kebab-case', }, ], '@typescript-eslint/convención de nombres': [ 'error', { selector: 'predeterminado', formato: ['camelCase'], guión bajo líder: 'permitir', guión bajo final: 'permitir', filtro: { expresión regular: '^(ts-jest|\\^.*)$', coincidencia: falso, }, }, { selector: 'predeterminado', formato: ['camelCase'], guión bajo líder: 'permitir', guión bajo final: 'permitir', }, { selector: 'variable', formato: ['camelCase', 'UPPER_CASE'], guión bajo líder: 'permitir', guión bajo final: 'permitir', }, { selector: 'tipoComo', formato: ['PascalCase'], }, { selector: 'enumMember', formato: ['PascalCase'], }, { selector: 'propiedad', formato: nulo, filtro: { expresión regular: '^(host)$', coincidencia: falso, }, }, ], complejidad: 'error', 'max-len': [ 'error', { código: 140, }, ], 'no-new-wrappers': 'error', 'literal-sin-tiro': 'error', '@typescript-eslint/consistent-type-definitions': 'error', 'sin sombra': 'apagado', '@typescript-eslint/no-shadow': 'error', 'no-inválido-esto': 'apagado', '@typescript-eslint/no-invalid-this': ['advertir'], '@angular-eslint/no-host-metadata-property': 'apagado', }, }, { archivos: ['**/*.html'], extiende: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], normas: {}, }, )
Cambie el prefijo de la aplicación en angular.json de app a baf.
Tenga en cuenta que el complemento eslint-plugin-import no es compatible con eslint 9.
Hay una acalorada discusión en github: github.com/import-js/eslint-plugin-import/issues/2948
Agregar más bonito:
yarn add -D prettierañadir hilo -D más bonito
Definamos las reglas en .prettierrc.json:
yarn add -D prettier{ "bracketSpacing": verdadero, "ancho de impresión": 140, "semi": cierto, "cita única": verdadero, "ancho de pestaña": 2, "useTabs": falso }
Excluir todo lo que no deba formatearse en .prettierignore:
yarn add -D prettier# Agregue archivos aquí para ignorarlos desde un formato más bonito /distrito /cobertura /tmp /módulos_nodo /nginx /.vscode /.idea paquete-lock.json paquete.json hilo.lock .angular /junit junit.xml /.nx/caché
En el IDE en la configuración más bonita - **/*.{js,ts,jsx,tsx,vue,astro,scss,css,html,json}.
Todas las fuentes están en github, en el repositorio: github.com/Fafnur/buy-and-fly
La demostración se puede ver aquí: buy-and-fly.fafn.ru/
Mis grupos: telegram, medium, vk, x.com, linkedin, site
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3