Merge pull request #10037 from backstage/rugvip/role-lint

cli: introduce role-based lint configuration setup
This commit is contained in:
Patrik Oldsberg
2022-03-08 09:27:19 +01:00
committed by GitHub
136 changed files with 559 additions and 644 deletions
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/cli': patch
---
Added a new ESLint configuration setup for packages, which utilizes package roles to generate the correct configuration. The new configuration is available at `@backstage/cli/config/eslint-factory`.
Introduced a new `backstage-cli migrate package-lint-configs` command, which migrates old lint configurations to use `@backstage/cli/config/eslint-factory`.
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -11
View File
@@ -1,11 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
overrides: [
{
files: ['**/*.ts?(x)'],
rules: {
'react/prop-types': 1,
},
},
],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+2 -3
View File
@@ -1,7 +1,6 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
ignorePatterns: ['templates/**'],
rules: {
'no-console': 0,
},
};
});
+286
View File
@@ -0,0 +1,286 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const { join: joinPath } = require('path');
/**
* Creates a ESLint configuration that extends the base Backstage configuration.
* In addition to the standard ESLint configuration options, the `extraConfig`
* parameter also accepts the following keys:
*
* - `tsRules`: Additional ESLint rules to apply to TypeScript
* - `testRules`: Additional ESLint rules to apply to tests
* - `restrictedImports`: Additional paths to add to no-restricted-imports
* - `restrictedSrcImports`: Additional paths to add to no-restricted-imports in src files
* - `restrictedTestImports`: Additional paths to add to no-restricted-imports in test files
* - `restrictedSyntax`: Additional patterns to add to no-restricted-syntax
* - `restrictedSrcSyntax`: Additional patterns to add to no-restricted-syntax in src files
* - `restrictedTestSyntax`: Additional patterns to add to no-restricted-syntax in test files
*/
function createConfig(dir, extraConfig = {}) {
const {
extends: extraExtends,
plugins,
env,
parserOptions,
ignorePatterns,
rules,
tsRules,
testRules,
restrictedImports,
restrictedSrcImports,
restrictedTestImports,
restrictedSyntax,
restrictedSrcSyntax,
restrictedTestSyntax,
...otherConfig
} = extraConfig;
return {
...otherConfig,
extends: [
'@spotify/eslint-config-base',
'@spotify/eslint-config-typescript',
'prettier',
'plugin:jest/recommended',
'plugin:monorepo/recommended',
...(extraExtends ?? []),
],
parser: '@typescript-eslint/parser',
plugins: ['import', ...(plugins ?? [])],
env: {
jest: true,
...env,
},
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
lib: require('./tsconfig.json').compilerOptions.lib,
...parserOptions,
},
ignorePatterns: [
'.eslintrc.js',
'**/dist/**',
'**/dist-types/**',
...(ignorePatterns ?? []),
],
rules: {
'no-shadow': 'off',
'no-redeclare': 'off',
'@typescript-eslint/no-shadow': 'error',
'@typescript-eslint/no-redeclare': 'error',
'no-undef': 'off',
'import/newline-after-import': 'error',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: dir
? [
`!${joinPath(dir, 'src/**')}`,
joinPath(dir, 'src/**/*.test.*'),
joinPath(dir, 'src/**/*.stories.*'),
joinPath(dir, 'src/setupTests.*'),
]
: [
// Legacy config for packages that don't provide a dir
'**/*.test.*',
'**/*.stories.*',
'**/src/setupTests.*',
'**/dev/**',
],
optionalDependencies: true,
peerDependencies: true,
bundledDependencies: true,
},
],
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': 'error',
'@typescript-eslint/consistent-type-assertions': 'error',
'@typescript-eslint/no-unused-vars': [
'warn',
{
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true,
argsIgnorePattern: '^_',
},
],
'no-restricted-imports': [
2,
{
paths: [
...(restrictedImports ?? []),
...(restrictedSrcImports ?? []),
],
// Avoid cross-package imports
patterns: ['**/../../**/*/src/**', '**/../../**/*/src'],
},
],
'no-restricted-syntax': [
'error',
...(restrictedSyntax ?? []),
...(restrictedSrcSyntax ?? []),
],
...rules,
},
overrides: [
{
files: ['**/*.ts?(x)'],
rules: {
'@typescript-eslint/no-unused-vars': 'off',
'no-undef': 'off',
...tsRules,
},
},
{
files: ['**/*.test.*', '**/*.stories.*', 'src/setupTests.*', '!src/**'],
rules: {
...testRules,
'no-restricted-syntax': [
'error',
...(restrictedSyntax ?? []),
...(restrictedTestSyntax ?? []),
],
'no-restricted-imports': [
2,
{
paths: [
...(restrictedImports ?? []),
...(restrictedTestImports ?? []),
],
// Avoid cross-package imports
patterns: ['**/../../**/*/src/**', '**/../../**/*/src'],
},
],
},
},
],
};
}
/**
* Creates a ESLint configuration for the given package role.
* The `extraConfig` parameter accepts the same keys as for the `createConfig` function.
*/
function createConfigForRole(dir, role, extraConfig = {}) {
switch (role) {
case 'common-library':
return createConfig(dir, extraConfig);
case 'web-library':
case 'frontend':
case 'frontend-plugin':
case 'frontend-plugin-module':
return createConfig(dir, {
...extraConfig,
extends: [
'@spotify/eslint-config-react',
...(extraConfig.extends ?? []),
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
...extraConfig.parserOptions,
},
settings: {
react: {
version: 'detect',
},
...extraConfig.settings,
},
restrictedImports: [
{
// Importing the entire MUI icons packages kills build performance as the list of icons is huge.
name: '@material-ui/icons',
message: "Please import '@material-ui/icons/<Icon>' instead.",
},
{
name: '@material-ui/icons/', // because this is possible too ._.
message: "Please import '@material-ui/icons/<Icon>' instead.",
},
...require('module').builtinModules,
...(extraConfig.restrictedImports ?? []),
],
tsRules: {
'react/prop-types': 0,
...extraConfig.tsRules,
},
});
case 'cli':
case 'node-library':
case 'backend':
case 'backend-plugin':
case 'backend-plugin-module':
return createConfig(dir, {
...extraConfig,
globals: {
__non_webpack_require__: 'readonly',
...extraConfig.globals,
},
rules: {
'no-console': 0, // Permitted in console programs
'new-cap': ['error', { capIsNew: false }], // Because Express constructs things e.g. like 'const r = express.Router()'
...extraConfig.rules,
},
restrictedSyntax: [
{
message:
'Default import from winston is not allowed, import `* as winston` instead.',
selector:
'ImportDeclaration[source.value="winston"] ImportDefaultSpecifier',
},
...(extraConfig.restrictedSyntax ?? []),
],
restrictedSrcSyntax: [
{
message:
"`__dirname` doesn't refer to the same dir in production builds, try `resolvePackagePath()` from `@backstage/backend-common` instead.",
selector: 'Identifier[name="__dirname"]',
},
...(extraConfig.restrictedSrcSyntax ?? []),
],
});
default:
throw new Error(`Unknown package role ${role}`);
}
}
/**
* Creates a ESLint configuration for the package in the given directory.
* The `extraConfig` parameter accepts the same keys as for the `createConfig` function.
*/
function createPackageConfig(dir, extraConfig) {
const pkg = require(joinPath(dir, 'package.json'));
const role = pkg.backstage?.role;
if (!role) {
throw new Error(`Package ${pkg.name} does not have a backstage.role`);
}
return createConfigForRole(dir, role, extraConfig);
}
module.exports = createPackageConfig; // Alias
module.exports.createConfig = createConfig;
module.exports.createConfigForRole = createConfigForRole;
module.exports.createPackageConfig = createPackageConfig;
+4 -87
View File
@@ -14,90 +14,7 @@
* limitations under the License.
*/
const globalRestrictedSyntax = [
{
message:
'Default import from winston is not allowed, import `* as winston` instead.',
selector:
'ImportDeclaration[source.value="winston"] ImportDefaultSpecifier',
},
];
module.exports = {
extends: [
'@spotify/eslint-config-base',
'@spotify/eslint-config-typescript',
'prettier',
'plugin:jest/recommended',
'plugin:monorepo/recommended',
],
parser: '@typescript-eslint/parser',
plugins: ['import'],
env: {
jest: true,
},
globals: {
__non_webpack_require__: 'readonly',
},
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
lib: require('./tsconfig.json').compilerOptions.lib,
},
ignorePatterns: ['.eslintrc.js', '**/dist/**', '**/dist-types/**'],
rules: {
'no-shadow': 'off',
'no-redeclare': 'off',
'@typescript-eslint/no-shadow': 'error',
'@typescript-eslint/no-redeclare': 'error',
'no-console': 0, // Permitted in console programs
'new-cap': ['error', { capIsNew: false }], // Because Express constructs things e.g. like 'const r = express.Router()'
'import/newline-after-import': 'error',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: ['**/*.test.*', 'src/setupTests.*', 'dev/**'],
optionalDependencies: true,
peerDependencies: true,
bundledDependencies: true,
},
],
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': 'error',
'@typescript-eslint/no-unused-vars': [
'warn',
{ vars: 'all', args: 'after-used', ignoreRestSiblings: true },
],
// Avoid cross-package imports
'no-restricted-imports': [
2,
{ patterns: ['**/../../**/*/src/**', '**/../../**/*/src'] },
],
// Avoid default import from winston as it breaks at runtime
'no-restricted-syntax': [
'error',
{
message:
"`__dirname` doesn't refer to the same dir in production builds, try `resolvePackagePath()` from `@backstage/backend-common` instead.",
selector: 'Identifier[name="__dirname"]',
},
...globalRestrictedSyntax,
],
},
overrides: [
{
files: ['**/*.ts?(x)'],
rules: {
'@typescript-eslint/no-unused-vars': 'off',
'no-undef': 'off',
},
},
{
files: ['*.test.*', 'src/setupTests.*', 'dev/**'],
rules: {
'no-restricted-syntax': ['error', ...globalRestrictedSyntax],
},
},
],
};
module.exports = require('./eslint-factory').createConfigForRole(
undefined,
'node-library',
);
+4 -93
View File
@@ -14,96 +14,7 @@
* limitations under the License.
*/
module.exports = {
extends: [
'@spotify/eslint-config-base',
'@spotify/eslint-config-react',
'@spotify/eslint-config-typescript',
'prettier',
'plugin:jest/recommended',
'plugin:monorepo/recommended',
],
parser: '@typescript-eslint/parser',
plugins: ['import'],
env: {
jest: true,
},
parserOptions: {
ecmaVersion: 2018,
ecmaFeatures: {
jsx: true,
},
sourceType: 'module',
lib: require('./tsconfig.json').compilerOptions.lib,
},
settings: {
react: {
version: 'detect',
},
},
ignorePatterns: ['.eslintrc.js', '**/dist/**', '**/dist-types/**'],
rules: {
'no-shadow': 'off',
'no-redeclare': 'off',
'@typescript-eslint/no-shadow': 'error',
'@typescript-eslint/no-redeclare': 'error',
'no-undef': 'off',
'import/newline-after-import': 'error',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'**/*.test.*',
'**/*.stories.*',
'**/src/setupTests.*',
'**/dev/**',
],
optionalDependencies: true,
peerDependencies: true,
bundledDependencies: true,
},
],
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': 'error',
'@typescript-eslint/consistent-type-assertions': 'error',
'@typescript-eslint/no-unused-vars': [
'warn',
{
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true,
argsIgnorePattern: '^_',
},
],
'no-restricted-imports': [
2,
{
paths: [
{
// Importing the entire MUI icons packages kills build performance as the list of icons is huge.
name: '@material-ui/icons',
message: "Please import '@material-ui/icons/<Icon>' instead.",
},
{
name: '@material-ui/icons/', // because this is possible too ._.
message: "Please import '@material-ui/icons/<Icon>' instead.",
},
...require('module').builtinModules,
],
// Avoid cross-package imports
patterns: ['**/../../**/*/src/**', '**/../../**/*/src'],
},
],
},
overrides: [
{
files: ['**/*.ts?(x)'],
rules: {
// Default to not enforcing prop-types in typescript
'react/prop-types': 0,
'@typescript-eslint/no-unused-vars': 'off',
'no-undef': 'off',
},
},
],
};
module.exports = require('./eslint-factory').createConfigForRole(
undefined,
'web-library',
);
+9
View File
@@ -165,6 +165,15 @@ export function registerMigrateCommand(program: CommanderStatic) {
.action(
lazy(() => import('./migrate/packageScripts').then(m => m.command)),
);
command
.command('package-lint-configs')
.description(
'Migrates all packages to use @backstage/cli/config/eslint-factory',
)
.action(
lazy(() => import('./migrate/packageLintConfigs').then(m => m.command)),
);
}
export function registerCommands(program: CommanderStatic) {
@@ -0,0 +1,89 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs-extra';
import { resolve as resolvePath } from 'path';
import { PackageGraph } from '../../lib/monorepo';
import { runPlain } from '../../lib/run';
const PREFIX = `module.exports = require('@backstage/cli/config/eslint-factory')`;
export async function command() {
const packages = await PackageGraph.listTargetPackages();
const oldConfigs = [
require.resolve('@backstage/cli/config/eslint.js'),
require.resolve('@backstage/cli/config/eslint.backend.js'),
];
const configPaths = new Array<string>();
await Promise.all(
packages.map(async ({ dir, packageJson }) => {
const configPath = resolvePath(dir, '.eslintrc.js');
if (!(await fs.pathExists(configPath))) {
console.log(`Skipping ${packageJson.name}, missing .eslintrc.js`);
return;
}
let existingConfig: Record<string, unknown>;
try {
existingConfig = require(configPath);
} catch (error) {
console.log(
`Skipping ${packageJson.name}, failed to load .eslintrc.js, ${error}`,
);
return;
}
// Only transform configs that extend the old config files, and
// we remove that entry from the extends array.
const extendsArray = (existingConfig.extends as string[]) ?? [];
const extendIndex = extendsArray.findIndex(p => oldConfigs.includes(p));
if (extendIndex === -1) {
console.log(
`Skipping ${packageJson.name}, .eslintrc.js does not extend the legacy config`,
);
return;
}
extendsArray.splice(extendIndex, 1);
if (extendsArray.length === 0) {
delete existingConfig.extends;
}
if (Object.keys(existingConfig).length > 0) {
await fs.writeFile(
configPath,
`${PREFIX}(__dirname, ${JSON.stringify(existingConfig, null, 2)});\n`,
);
} else {
await fs.writeFile(configPath, `${PREFIX}(__dirname);\n`);
}
configPaths.push(configPath);
}),
);
// If prettier is present, then we run that too
let hasPrettier = false;
try {
require.resolve('prettier');
hasPrettier = true;
} catch {
/* ignore */
}
if (hasPrettier) {
await runPlain('prettier', '--write', ...configPaths);
}
}
+2 -3
View File
@@ -1,5 +1,4 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
'no-console': 0,
'import/no-extraneous-dependencies': [
@@ -12,4 +11,4 @@ module.exports = {
},
],
},
};
});
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+2 -3
View File
@@ -1,6 +1,5 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
'jest/expect-expect': 0,
},
};
});
+2 -5
View File
@@ -1,8 +1,5 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
// TODO: add prop types to JS and remove
'react/prop-types': 0,
'jest/expect-expect': 0,
},
};
});
+8 -22
View File
@@ -1,25 +1,11 @@
const base = require('@backstage/cli/config/eslint');
const [, baseRestrictedImports] = base.rules['no-restricted-imports'];
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
// TODO: add prop types to JS and remove
'react/prop-types': 0,
'jest/expect-expect': 0,
'no-restricted-imports': [
2,
{
...baseRestrictedImports,
paths: [
{
// Importing the entire MUI icons packages kills build performance as the list of icons is huge.
name: '@material-ui/core',
message: "Please import '@material-ui/core/...' instead.",
},
...baseRestrictedImports.paths,
],
},
],
},
};
restrictedImports: [
{
name: '@material-ui/core',
message: "Please import '@material-ui/core/...' instead.",
},
],
});
+1 -8
View File
@@ -1,8 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
rules: {
// TODO: add prop types to JS and remove
'react/prop-types': 0,
'jest/expect-expect': 0,
},
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+2 -3
View File
@@ -1,7 +1,6 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
ignorePatterns: ['templates/**'],
rules: {
'no-console': 0,
},
};
});
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+2 -3
View File
@@ -1,5 +1,4 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
'no-console': 0,
'import/no-extraneous-dependencies': [
@@ -12,4 +11,4 @@ module.exports = {
},
],
},
};
});
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -11
View File
@@ -1,11 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
overrides: [
{
files: ['**/*.ts?(x)'],
rules: {
'no-restricted-imports': 0,
},
},
],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
@@ -37,6 +37,7 @@ function findPreviewBundlePath(): string {
// This can be tested by running `yarn pack` and extracting the resulting tarball into a directory.
// Within the extracted directory, run `npm install --only=prod`.
// Once that's done you can test the CLI in any directory using `node <tmp-dir>/package <command>`.
// eslint-disable-next-line no-restricted-syntax
return findPaths(__dirname).resolveOwn('dist/embedded-app');
}
}
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+2 -4
View File
@@ -1,7 +1,5 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
// Prefer to use rendered.getBy*, which will throw an error
'jest/expect-expect': 0,
},
};
});
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+2 -3
View File
@@ -1,6 +1,5 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, {
rules: {
quotes: ['error', 'single'],
},
};
});
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint.backend')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
+1 -3
View File
@@ -1,3 +1 @@
module.exports = {
extends: [require.resolve('@backstage/cli/config/eslint')],
};
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);

Some files were not shown because too many files have changed in this diff Show More