{"id":19590,"library":"eslint-config-skyux","title":"SKY UX ESLint Config","description":"Recommended ESLint configuration for SKY UX projects. Current stable version is 14.2.2, released April 2026 with frequent patch releases. This package provides a shared eslint.config extending from typescript-eslint, angular-eslint, and @eslint/js. It includes SKY UX-specific lint rules (e.g., no-sky-selectors) and stylelint integration. Key differentiators: it is the only config tailored to the SKY UX component library, automatically setting up recommended rules for Angular + TypeScript + SKY UX conventions. Requires Angular 19+, angular-eslint 21, and typescript-eslint 8.","status":"active","version":"14.2.2","language":"javascript","source_language":"en","source_url":"https://github.com/blackbaud/skyux","tags":["javascript","blackbaud","skyux","typescript"],"install":[{"cmd":"npm install eslint-config-skyux","lang":"bash","label":"npm"},{"cmd":"yarn add eslint-config-skyux","lang":"bash","label":"yarn"},{"cmd":"pnpm add eslint-config-skyux","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Base ESLint recommended rules","package":"@eslint/js","optional":false},{"reason":"Angular-specific lint rules","package":"angular-eslint","optional":false},{"reason":"SKY UX custom lint rules","package":"skyux-eslint","optional":false},{"reason":"TypeScript lint rules and config builder","package":"typescript-eslint","optional":false}],"imports":[{"note":"This package is ESM-only. In ESLint flat config, import as default.","wrong":"const skyux = require('eslint-config-skyux');","symbol":"default export","correct":"import skyux from 'eslint-config-skyux';"},{"note":"tseslint is the default export of typescript-eslint.","wrong":"import { TSLint } from 'typescript-eslint';","symbol":"typescript-eslint helper","correct":"import tseslint from 'typescript-eslint';"},{"note":"Must use tseslint.config() to properly merge configs. Since v14.","wrong":"export default [...skyux, { ... }];","symbol":"tseslint.config","correct":"export default tseslint.config(...skyux, { ... });"}],"quickstart":{"code":"// eslint.config.mjs\nimport skyux from 'eslint-config-skyux';\nimport tseslint from 'typescript-eslint';\n\nexport default tseslint.config(\n  ...skyux,\n  {\n    languageOptions: {\n      parserOptions: {\n        projectService: true,\n        tsconfigRootDir: import.meta.dirname,\n      },\n    },\n  },\n  {\n    files: ['**/*.ts'],\n    rules: {\n      '@angular-eslint/directive-selector': [\n        'error',\n        {\n          type: 'attribute',\n          prefix: 'app',\n          style: 'camelCase',\n        },\n      ],\n      '@angular-eslint/component-selector': [\n        'error',\n        {\n          type: 'element',\n          prefix: 'app',\n          style: 'kebab-case',\n        },\n      ],\n    },\n  },\n);","lang":"javascript","description":"Minimal eslint.config.mjs setup for a SKY UX Angular project using flat config and typescript-eslint."},"warnings":[{"fix":"Delete .eslintrc.* files and create eslint.config.mjs using the pattern shown in README.","message":"Migrated from legacy eslintrc to flat config (eslint.config.*). Requires ESLint >=9 and removal of .eslintrc files.","severity":"breaking","affected_versions":">=14.0.0"},{"fix":"Set parserOptions.projectService: true in your config.","message":"Requires projectService: true in parserOptions for typed lint rules to work correctly (since v14).","severity":"breaking","affected_versions":">=14.0.0"},{"fix":"Upgrade to Angular 19 or later.","message":"Support for Angular <19 dropped in v14; Angular 19+ required.","severity":"deprecated","affected_versions":">=14.0.0"},{"fix":"Use tseslint.config(...skyux, ...). Do not manually merge config arrays.","message":"Must use ...skyux spread inside tseslint.config(), not directly in an array. Flat configs from different plugins may conflict.","severity":"gotcha","affected_versions":">=14.0.0"},{"fix":"Update Node.js to >=18.19 (recommended 22 LTS).","message":"Dropped support for Node <18.19 (required for ESLint flat config).","severity":"breaking","affected_versions":">=14.0.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Convert your eslint config to an .mjs file and use import instead of require().","cause":"Using CommonJS require() to import an ESM-only package.","error":"Error [ERR_REQUIRE_ESM]: require() of ES Module /node_modules/eslint-config-skyux/index.js not supported."},{"fix":"Use array syntax: ['error', { type: 'attribute', prefix: 'app', style: 'camelCase' }]","cause":"Incorrect format for rule configuration (common when migrating from eslintrc).","error":"Configuration for rule '@angular-eslint/directive-selector' is invalid. Expected an array of objects, got string."},{"fix":"Use tseslint.config(...skyux, ...otherConfigs)","cause":"Forgetting to spread the skyux config inside tseslint.config() (e.g., using skyux directly without ...).","error":"TypeError: skyux is not iterable"},{"fix":"Run 'ng add eslint-config-skyux' or install 'skyux-eslint' as a dev dependency.","cause":"Missing skyux-eslint package in dependencies.","error":"ESLint: Error while loading rule 'skyux-eslint/no-sky-selectors': Rule 'no-sky-selectors' is not defined."}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}