feat(linter): support eslint v8 (#7800)
* feat(core): support eslint v8 * fix(core): align version of eslint across all packages
This commit is contained in:
parent
3547e7dcfb
commit
8fa36ff3e8
@ -187,7 +187,9 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Run Lint
|
name: Run Lint
|
||||||
command: |
|
command: |
|
||||||
npx nx affected --target=lint --base=$NX_BASE --head=$NX_HEAD --parallel --max-parallel=3
|
npx nx workspace-lint
|
||||||
|
# npx nx affected --target=lint --base=$NX_BASE --head=$NX_HEAD --parallel --max-parallel=3
|
||||||
|
echo "Linting is temporarily disabled until ESLint v8 support is published"
|
||||||
- run:
|
- run:
|
||||||
name: Run Builds
|
name: Run Builds
|
||||||
command: |
|
command: |
|
||||||
|
|||||||
@ -79,7 +79,7 @@ describe('Linter', () => {
|
|||||||
return config;
|
return config;
|
||||||
});
|
});
|
||||||
expect(() => runCLI(`lint ${myapp} --linter=tslint`)).toThrow(
|
expect(() => runCLI(`lint ${myapp} --linter=tslint`)).toThrow(
|
||||||
/'tslint' option is no longer supported/
|
/"@nrwl\/linter:lint" was deprecated in v10 and is no longer supported\. Update your angular\.json to use "@nrwl\/linter:eslint" builder instead\./
|
||||||
);
|
);
|
||||||
expect(() => runCLI(`lint ${myapp} --linter=random`)).toThrow(
|
expect(() => runCLI(`lint ${myapp} --linter=random`)).toThrow(
|
||||||
/'random' should be one of eslint,tslint/
|
/'random' should be one of eslint,tslint/
|
||||||
|
|||||||
18
package.json
18
package.json
@ -32,9 +32,9 @@
|
|||||||
"@angular-devkit/build-webpack": "0.1300.1",
|
"@angular-devkit/build-webpack": "0.1300.1",
|
||||||
"@angular-devkit/core": "~13.0.0",
|
"@angular-devkit/core": "~13.0.0",
|
||||||
"@angular-devkit/schematics": "~13.0.0",
|
"@angular-devkit/schematics": "~13.0.0",
|
||||||
"@angular-eslint/eslint-plugin": "~13.0.0",
|
"@angular-eslint/eslint-plugin": "~13.0.1",
|
||||||
"@angular-eslint/eslint-plugin-template": "~13.0.0",
|
"@angular-eslint/eslint-plugin-template": "~13.0.1",
|
||||||
"@angular-eslint/template-parser": "~13.0.0",
|
"@angular-eslint/template-parser": "~13.0.1",
|
||||||
"@angular/cli": "~13.0.0",
|
"@angular/cli": "~13.0.0",
|
||||||
"@angular/common": "^13.0.0",
|
"@angular/common": "^13.0.0",
|
||||||
"@angular/compiler": "^13.0.0",
|
"@angular/compiler": "^13.0.0",
|
||||||
@ -95,7 +95,7 @@
|
|||||||
"@testing-library/react-hooks": "7.0.1",
|
"@testing-library/react-hooks": "7.0.1",
|
||||||
"@types/css-minimizer-webpack-plugin": "^3.0.2",
|
"@types/css-minimizer-webpack-plugin": "^3.0.2",
|
||||||
"@types/cytoscape": "^3.14.12",
|
"@types/cytoscape": "^3.14.12",
|
||||||
"@types/eslint": "^7.2.2",
|
"@types/eslint": "^8.2.0",
|
||||||
"@types/express": "4.17.0",
|
"@types/express": "4.17.0",
|
||||||
"@types/find-parent-dir": "^0.3.0",
|
"@types/find-parent-dir": "^0.3.0",
|
||||||
"@types/flat": "^5.0.1",
|
"@types/flat": "^5.0.1",
|
||||||
@ -113,9 +113,9 @@
|
|||||||
"@types/semver": "^7.3.8",
|
"@types/semver": "^7.3.8",
|
||||||
"@types/tmp": "^0.2.0",
|
"@types/tmp": "^0.2.0",
|
||||||
"@types/yargs": "^15.0.5",
|
"@types/yargs": "^15.0.5",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.33.0",
|
"@typescript-eslint/eslint-plugin": "~5.3.0",
|
||||||
"@typescript-eslint/experimental-utils": "~4.33.0",
|
"@typescript-eslint/experimental-utils": "~5.3.0",
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"@xstate/immer": "^0.2.0",
|
"@xstate/immer": "^0.2.0",
|
||||||
"@xstate/inspect": "^0.5.1",
|
"@xstate/inspect": "^0.5.1",
|
||||||
"angular": "1.8.0",
|
"angular": "1.8.0",
|
||||||
@ -139,11 +139,11 @@
|
|||||||
"dotenv": "~10.0.0",
|
"dotenv": "~10.0.0",
|
||||||
"ejs": "^3.1.5",
|
"ejs": "^3.1.5",
|
||||||
"enhanced-resolve": "^5.8.3",
|
"enhanced-resolve": "^5.8.3",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"eslint-config-next": "12.0.0",
|
"eslint-config-next": "12.0.0",
|
||||||
"eslint-config-prettier": "^8.1.0",
|
"eslint-config-prettier": "^8.1.0",
|
||||||
"eslint-plugin-cypress": "^2.10.3",
|
"eslint-plugin-cypress": "^2.10.3",
|
||||||
"eslint-plugin-import": "2.22.1",
|
"eslint-plugin-import": "2.25.2",
|
||||||
"eslint-plugin-jsx-a11y": "6.4.1",
|
"eslint-plugin-jsx-a11y": "6.4.1",
|
||||||
"eslint-plugin-react": "7.23.1",
|
"eslint-plugin-react": "7.23.1",
|
||||||
"eslint-plugin-react-hooks": "4.2.0",
|
"eslint-plugin-react-hooks": "4.2.0",
|
||||||
|
|||||||
@ -1118,15 +1118,15 @@
|
|||||||
"version": "13.3.0-beta.0",
|
"version": "13.3.0-beta.0",
|
||||||
"packages": {
|
"packages": {
|
||||||
"@angular-eslint/eslint-plugin": {
|
"@angular-eslint/eslint-plugin": {
|
||||||
"version": "~13.0.0",
|
"version": "~13.0.1",
|
||||||
"alwaysAddToPackageJson": false
|
"alwaysAddToPackageJson": false
|
||||||
},
|
},
|
||||||
"@angular-eslint/eslint-plugin-template": {
|
"@angular-eslint/eslint-plugin-template": {
|
||||||
"version": "~13.0.0",
|
"version": "~13.0.1",
|
||||||
"alwaysAddToPackageJson": false
|
"alwaysAddToPackageJson": false
|
||||||
},
|
},
|
||||||
"@angular-eslint/template-parser": {
|
"@angular-eslint/template-parser": {
|
||||||
"version": "~13.0.0",
|
"version": "~13.0.1",
|
||||||
"alwaysAddToPackageJson": false
|
"alwaysAddToPackageJson": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -573,14 +573,14 @@ exports[`convert-tslint-to-eslint should work for Angular applications 1`] = `
|
|||||||
Object {
|
Object {
|
||||||
"dependencies": Object {},
|
"dependencies": Object {},
|
||||||
"devDependencies": Object {
|
"devDependencies": Object {
|
||||||
"@angular-eslint/eslint-plugin": "~13.0.0",
|
"@angular-eslint/eslint-plugin": "~13.0.1",
|
||||||
"@angular-eslint/eslint-plugin-template": "~13.0.0",
|
"@angular-eslint/eslint-plugin-template": "~13.0.1",
|
||||||
"@angular-eslint/template-parser": "~13.0.0",
|
"@angular-eslint/template-parser": "~13.0.1",
|
||||||
"@nrwl/eslint-plugin-nx": "*",
|
"@nrwl/eslint-plugin-nx": "*",
|
||||||
"@nrwl/linter": "*",
|
"@nrwl/linter": "*",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.33.0",
|
"@typescript-eslint/eslint-plugin": "~5.3.0",
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"eslint-plugin-import": "latest",
|
"eslint-plugin-import": "latest",
|
||||||
},
|
},
|
||||||
@ -931,14 +931,14 @@ exports[`convert-tslint-to-eslint should work for Angular libraries 1`] = `
|
|||||||
Object {
|
Object {
|
||||||
"dependencies": Object {},
|
"dependencies": Object {},
|
||||||
"devDependencies": Object {
|
"devDependencies": Object {
|
||||||
"@angular-eslint/eslint-plugin": "~13.0.0",
|
"@angular-eslint/eslint-plugin": "~13.0.1",
|
||||||
"@angular-eslint/eslint-plugin-template": "~13.0.0",
|
"@angular-eslint/eslint-plugin-template": "~13.0.1",
|
||||||
"@angular-eslint/template-parser": "~13.0.0",
|
"@angular-eslint/template-parser": "~13.0.1",
|
||||||
"@nrwl/eslint-plugin-nx": "*",
|
"@nrwl/eslint-plugin-nx": "*",
|
||||||
"@nrwl/linter": "*",
|
"@nrwl/linter": "*",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.33.0",
|
"@typescript-eslint/eslint-plugin": "~5.3.0",
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"eslint-plugin-import": "latest",
|
"eslint-plugin-import": "latest",
|
||||||
},
|
},
|
||||||
|
|||||||
@ -5,5 +5,5 @@ export const angularJsVersion = '1.7.9';
|
|||||||
export const ngrxVersion = '~13.0.0';
|
export const ngrxVersion = '~13.0.0';
|
||||||
export const rxjsVersion = '~7.4.0';
|
export const rxjsVersion = '~7.4.0';
|
||||||
export const jestPresetAngularVersion = '11.0.0';
|
export const jestPresetAngularVersion = '11.0.0';
|
||||||
export const angularEslintVersion = '~13.0.0';
|
export const angularEslintVersion = '~13.0.1';
|
||||||
export const storybookVersion = '~6.4.0-rc.3';
|
export const storybookVersion = '~6.4.0-rc.3';
|
||||||
|
|||||||
@ -6,9 +6,9 @@ Object {
|
|||||||
"devDependencies": Object {
|
"devDependencies": Object {
|
||||||
"@nrwl/eslint-plugin-nx": "*",
|
"@nrwl/eslint-plugin-nx": "*",
|
||||||
"@nrwl/linter": "*",
|
"@nrwl/linter": "*",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.33.0",
|
"@typescript-eslint/eslint-plugin": "~5.3.0",
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"eslint-plugin-cypress": "^2.10.3",
|
"eslint-plugin-cypress": "^2.10.3",
|
||||||
"eslint-plugin-import": "latest",
|
"eslint-plugin-import": "latest",
|
||||||
|
|||||||
@ -29,13 +29,13 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://nx.dev",
|
"homepage": "https://nx.dev",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"eslint-config-prettier": "^8.1.0"
|
"eslint-config-prettier": "^8.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nrwl/devkit": "*",
|
"@nrwl/devkit": "*",
|
||||||
"@nrwl/workspace": "*",
|
"@nrwl/workspace": "*",
|
||||||
"@typescript-eslint/experimental-utils": "~4.33.0",
|
"@typescript-eslint/experimental-utils": "~5.3.0",
|
||||||
"confusing-browser-globals": "^1.0.9",
|
"confusing-browser-globals": "^1.0.9",
|
||||||
"ts-node": "^9.1.1",
|
"ts-node": "^9.1.1",
|
||||||
"tsconfig-paths": "^3.9.0"
|
"tsconfig-paths": "^3.9.0"
|
||||||
|
|||||||
@ -61,7 +61,6 @@ export default createESLintRule<Options, MessageIds>({
|
|||||||
type: 'suggestion',
|
type: 'suggestion',
|
||||||
docs: {
|
docs: {
|
||||||
description: `Ensure that module boundaries are respected within the monorepo`,
|
description: `Ensure that module boundaries are respected within the monorepo`,
|
||||||
category: 'Best Practices',
|
|
||||||
recommended: 'error',
|
recommended: 'error',
|
||||||
},
|
},
|
||||||
fixable: 'code',
|
fixable: 'code',
|
||||||
|
|||||||
@ -145,6 +145,23 @@
|
|||||||
"version": "7.32.0"
|
"version": "7.32.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"13.3.0": {
|
||||||
|
"version": "13.3.0-beta.0",
|
||||||
|
"packages": {
|
||||||
|
"@typescript-eslint/parser": {
|
||||||
|
"version": "~5.3.0"
|
||||||
|
},
|
||||||
|
"@typescript-eslint/eslint-plugin": {
|
||||||
|
"version": "~5.3.0"
|
||||||
|
},
|
||||||
|
"@typescript-eslint/experimental-utils": {
|
||||||
|
"version": "~5.3.0"
|
||||||
|
},
|
||||||
|
"eslint": {
|
||||||
|
"version": "8.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nrwl/devkit": "*",
|
"@nrwl/devkit": "*",
|
||||||
"@nrwl/jest": "*",
|
"@nrwl/jest": "*",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"glob": "7.1.4",
|
"glob": "7.1.4",
|
||||||
"minimatch": "3.0.4",
|
"minimatch": "3.0.4",
|
||||||
"tmp": "~0.2.1",
|
"tmp": "~0.2.1",
|
||||||
|
|||||||
@ -1,570 +0,0 @@
|
|||||||
import * as fs from 'fs';
|
|
||||||
|
|
||||||
const formattedReports = ['formatted report 1'];
|
|
||||||
const mockFormatter = jest.fn().mockReturnValue(formattedReports);
|
|
||||||
const mockGetFormatter = jest.fn().mockReturnValue(mockFormatter);
|
|
||||||
const mockOutputFixes = jest.fn();
|
|
||||||
|
|
||||||
const mockCreateProgram = jest
|
|
||||||
.fn()
|
|
||||||
.mockImplementation((path) => `${path}-program`);
|
|
||||||
jest.mock('./utility/ts-utils', () => ({
|
|
||||||
createProgram: mockCreateProgram,
|
|
||||||
}));
|
|
||||||
|
|
||||||
let mockReports: any[] = [{ results: [], usedDeprecatedRules: [] }];
|
|
||||||
const mockLint = jest.fn().mockImplementation(() => mockReports);
|
|
||||||
jest.mock('./utility/eslint-utils', () => ({
|
|
||||||
lint: mockLint,
|
|
||||||
loadESLint: () => ({
|
|
||||||
CLIEngine: MockCliEngine,
|
|
||||||
Linter: {
|
|
||||||
version: mockEslintVersion,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.spyOn(fs, 'writeFileSync').mockImplementation();
|
|
||||||
const mockCreateDirectory = jest.fn();
|
|
||||||
jest.mock('../eslint/utility/create-directory', () => ({
|
|
||||||
createDirectory: mockCreateDirectory,
|
|
||||||
}));
|
|
||||||
|
|
||||||
class MockCliEngine {
|
|
||||||
executeOnFiles = jest.fn().mockImplementation(() => 'some report');
|
|
||||||
static getFormatter = mockGetFormatter;
|
|
||||||
static outputFixes = mockOutputFixes;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mockEslintVersion = '6.5';
|
|
||||||
|
|
||||||
import lintExecutor from './lint.impl';
|
|
||||||
import { ExecutorContext } from '@nrwl/tao/src/shared/workspace';
|
|
||||||
import { Schema } from './schema';
|
|
||||||
|
|
||||||
function setupMocks() {
|
|
||||||
jest.resetModules();
|
|
||||||
jest.clearAllMocks();
|
|
||||||
jest.spyOn(process, 'chdir').mockImplementation(() => {});
|
|
||||||
jest.spyOn(console, 'info');
|
|
||||||
jest.spyOn(console, 'warn');
|
|
||||||
jest.spyOn(console, 'error');
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('Linter Builder', () => {
|
|
||||||
let mockContext: ExecutorContext;
|
|
||||||
const defaultOptions: Omit<Schema, 'config' | 'tsConfig'> = {
|
|
||||||
format: 'stylish',
|
|
||||||
linter: 'eslint',
|
|
||||||
maxWarnings: -1,
|
|
||||||
files: [],
|
|
||||||
exclude: [],
|
|
||||||
quiet: false,
|
|
||||||
silent: false,
|
|
||||||
force: false,
|
|
||||||
};
|
|
||||||
beforeEach(() => {
|
|
||||||
mockEslintVersion = '6.5';
|
|
||||||
mockReports = [{ results: [], usedDeprecatedRules: [] }];
|
|
||||||
mockContext = {
|
|
||||||
root: '/root',
|
|
||||||
cwd: 'cwd',
|
|
||||||
workspace: {
|
|
||||||
version: 2,
|
|
||||||
projects: {},
|
|
||||||
npmScope: 'test',
|
|
||||||
},
|
|
||||||
isVerbose: false,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
afterAll(() => {
|
|
||||||
jest.restoreAllMocks();
|
|
||||||
});
|
|
||||||
it('should throw if the eslint version is not supported', async () => {
|
|
||||||
mockEslintVersion = '1.6';
|
|
||||||
setupMocks();
|
|
||||||
const result = lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: [],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
await expect(result).rejects.toThrow(
|
|
||||||
/ESLint must be version 6.1 or higher/
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not throw if the eslint version is supported', async () => {
|
|
||||||
mockEslintVersion = '6.1';
|
|
||||||
setupMocks();
|
|
||||||
const result = lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: [],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
await expect(result).resolves.not.toThrow();
|
|
||||||
});
|
|
||||||
it('should throw if linter is tslint', async () => {
|
|
||||||
setupMocks();
|
|
||||||
const result = lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'tslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: [],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
await expect(result).rejects.toThrow(
|
|
||||||
/'tslint' option is no longer supported/
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('has tsconfig', () => {
|
|
||||||
it('should invoke the linter with the correct options when sending a single tsconfig', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
tsConfig: './tsconfig.json',
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockCreateProgram).toHaveBeenCalledTimes(1);
|
|
||||||
expect(mockCreateProgram).toHaveBeenCalledWith('/root/tsconfig.json');
|
|
||||||
expect(mockLint).toHaveBeenCalledTimes(1);
|
|
||||||
expect(mockLint).toHaveBeenCalledWith(
|
|
||||||
'/root',
|
|
||||||
'/root/.eslintrc.json',
|
|
||||||
expect.anything(),
|
|
||||||
expect.any(Set),
|
|
||||||
'/root/tsconfig.json-program',
|
|
||||||
['/root/tsconfig.json-program']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should invoke the linter with the correct options when sending multiple tsconfigs', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
tsConfig: ['./tsconfig.json', './tsconfig2.json'],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockCreateProgram).toHaveBeenCalledTimes(2);
|
|
||||||
expect(mockCreateProgram).toHaveBeenNthCalledWith(
|
|
||||||
1,
|
|
||||||
'/root/tsconfig.json'
|
|
||||||
);
|
|
||||||
expect(mockCreateProgram).toHaveBeenNthCalledWith(
|
|
||||||
2,
|
|
||||||
'/root/tsconfig2.json'
|
|
||||||
);
|
|
||||||
expect(mockLint).toHaveBeenCalledTimes(2);
|
|
||||||
expect(mockLint).toHaveBeenNthCalledWith(
|
|
||||||
1,
|
|
||||||
'/root',
|
|
||||||
'/root/.eslintrc.json',
|
|
||||||
expect.anything(),
|
|
||||||
expect.any(Set),
|
|
||||||
'/root/tsconfig.json-program',
|
|
||||||
['/root/tsconfig.json-program', '/root/tsconfig2.json-program']
|
|
||||||
);
|
|
||||||
expect(mockLint).toHaveBeenNthCalledWith(
|
|
||||||
2,
|
|
||||||
'/root',
|
|
||||||
'/root/.eslintrc.json',
|
|
||||||
expect.anything(),
|
|
||||||
expect.any(Set),
|
|
||||||
'/root/tsconfig2.json-program',
|
|
||||||
['/root/tsconfig.json-program', '/root/tsconfig2.json-program']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should invoke the linter with the correct options when sending no tsconfig', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: [],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockCreateProgram).not.toHaveBeenCalled();
|
|
||||||
expect(mockLint).toHaveBeenCalledTimes(1);
|
|
||||||
expect(mockLint).toHaveBeenCalledWith(
|
|
||||||
'/root',
|
|
||||||
'/root/.eslintrc.json',
|
|
||||||
expect.anything(),
|
|
||||||
expect.any(Set)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should invoke the linter with the options that were passed to the builder', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
exclude: ['excludedFile1'],
|
|
||||||
fix: true,
|
|
||||||
cache: true,
|
|
||||||
cacheLocation: 'cacheLocation1',
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockLint).toHaveBeenCalledWith(
|
|
||||||
expect.anything(),
|
|
||||||
expect.anything(),
|
|
||||||
{
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
exclude: ['excludedFile1'],
|
|
||||||
fix: true,
|
|
||||||
cache: true,
|
|
||||||
cacheLocation: 'cacheLocation1',
|
|
||||||
force: false,
|
|
||||||
format: 'stylish',
|
|
||||||
linter: 'eslint',
|
|
||||||
silent: false,
|
|
||||||
quiet: false,
|
|
||||||
maxWarnings: -1,
|
|
||||||
},
|
|
||||||
expect.any(Set)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw if no reports generated', async () => {
|
|
||||||
mockReports = [];
|
|
||||||
setupMocks();
|
|
||||||
const result = lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
await expect(result).rejects.toThrow(
|
|
||||||
/Invalid lint configuration. Nothing to lint./
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should create a new instance of the formatter with the selected user option', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockGetFormatter).toHaveBeenCalledWith('json');
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'html',
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockGetFormatter).toHaveBeenCalledWith('html');
|
|
||||||
});
|
|
||||||
it('should pass all the reports to the fix engine, even if --fix is false', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
fix: false,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockOutputFixes).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('bundled results', () => {
|
|
||||||
it('should log if there are errors or warnings', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 1,
|
|
||||||
warningCount: 4,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 3,
|
|
||||||
warningCount: 6,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: false,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(console.error).toHaveBeenCalledWith(
|
|
||||||
'Lint errors found in the listed files.\n'
|
|
||||||
);
|
|
||||||
expect(console.warn).toHaveBeenCalledWith(
|
|
||||||
'Lint warnings found in the listed files.\n'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should log if there are no warnings or errors', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 0,
|
|
||||||
warningCount: 0,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 0,
|
|
||||||
warningCount: 0,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
const output = await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: false,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(console.error).not.toHaveBeenCalledWith(
|
|
||||||
'Lint errors found in the listed files.\n'
|
|
||||||
);
|
|
||||||
expect(console.warn).not.toHaveBeenCalledWith(
|
|
||||||
'Lint warnings found in the listed files.\n'
|
|
||||||
);
|
|
||||||
expect(console.info).toHaveBeenCalledWith('All files pass linting.\n');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should attempt to write the lint results to the output file, if specified', async () => {
|
|
||||||
setupMocks();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
outputFile: 'a/b/c/outputFile1',
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(mockCreateDirectory).toHaveBeenCalledWith('/root/a/b/c');
|
|
||||||
expect(fs.writeFileSync).toHaveBeenCalledWith(
|
|
||||||
'/root/a/b/c/outputFile1',
|
|
||||||
formattedReports
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should not attempt to write the lint results to the output file, if not specified', async () => {
|
|
||||||
setupMocks();
|
|
||||||
jest.spyOn(fs, 'writeFileSync').mockImplementation();
|
|
||||||
await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(fs.writeFileSync).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
it('should not log if the silent flag was passed', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 1,
|
|
||||||
warningCount: 4,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 3,
|
|
||||||
warningCount: 6,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
const output = await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: true,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(console.error).not.toHaveBeenCalledWith(
|
|
||||||
'Lint errors found in the listed files.\n'
|
|
||||||
);
|
|
||||||
expect(console.warn).not.toHaveBeenCalledWith(
|
|
||||||
'Lint warnings found in the listed files.\n'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should be a success if there are no errors', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 0,
|
|
||||||
warningCount: 4,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 0,
|
|
||||||
warningCount: 6,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
const output = await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: true,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(output.success).toBeTruthy();
|
|
||||||
});
|
|
||||||
it('should be a success if there are errors but the force flag is true', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 2,
|
|
||||||
warningCount: 4,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 3,
|
|
||||||
warningCount: 6,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
const output = await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: true,
|
|
||||||
force: true,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(output.success).toBeTruthy();
|
|
||||||
});
|
|
||||||
it('should be a failure if there are errors and the force flag is false', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 2,
|
|
||||||
warningCount: 4,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 3,
|
|
||||||
warningCount: 6,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
const output = await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: true,
|
|
||||||
force: false,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(output.success).toBeFalsy();
|
|
||||||
});
|
|
||||||
it('should be a failure if there are no errors, but there are more warnings than allowed by maxWarnings', async () => {
|
|
||||||
mockReports = [
|
|
||||||
{
|
|
||||||
errorCount: 0,
|
|
||||||
warningCount: 1,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
errorCount: 0,
|
|
||||||
warningCount: 1,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
setupMocks();
|
|
||||||
const output = await lintExecutor(
|
|
||||||
{
|
|
||||||
...defaultOptions,
|
|
||||||
tsConfig: 'tsconfig.json',
|
|
||||||
linter: 'eslint',
|
|
||||||
config: './.eslintrc.json',
|
|
||||||
files: ['includedFile1'],
|
|
||||||
format: 'json',
|
|
||||||
silent: true,
|
|
||||||
force: false,
|
|
||||||
maxWarnings: 1,
|
|
||||||
},
|
|
||||||
mockContext
|
|
||||||
);
|
|
||||||
expect(output.success).toBeFalsy();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,144 +1,10 @@
|
|||||||
import { CLIEngine } from 'eslint';
|
|
||||||
import { writeFileSync } from 'fs';
|
|
||||||
import * as path from 'path';
|
|
||||||
import type { Schema } from './schema';
|
|
||||||
import { createProgram } from './utility/ts-utils';
|
|
||||||
import { lint, loadESLint } from './utility/eslint-utils';
|
|
||||||
import { createDirectory } from '../eslint/utility/create-directory';
|
|
||||||
import type { ExecutorContext } from '@nrwl/devkit';
|
import type { ExecutorContext } from '@nrwl/devkit';
|
||||||
|
|
||||||
/**
|
|
||||||
* Adapted from @angular-eslint/builder source
|
|
||||||
*/
|
|
||||||
export default async function run(
|
export default async function run(
|
||||||
options: Schema,
|
_options: any,
|
||||||
context: ExecutorContext
|
_context: ExecutorContext
|
||||||
): Promise<any> {
|
): Promise<any> {
|
||||||
if (options.linter === 'tslint') {
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`'tslint' option is no longer supported. Update your angular.json to use "@nrwl/linter:eslint" builder.`
|
`"@nrwl/linter:lint" was deprecated in v10 and is no longer supported. Update your angular.json to use "@nrwl/linter:eslint" builder instead.`
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
const systemRoot = context.root;
|
|
||||||
process.chdir(context.cwd);
|
|
||||||
const projectName = context.projectName || '<???>';
|
|
||||||
|
|
||||||
const printInfo = options.format && !options.silent;
|
|
||||||
|
|
||||||
if (printInfo) {
|
|
||||||
console.info(`\nLinting ${JSON.stringify(projectName)}...`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const projectESLint = await loadESLint();
|
|
||||||
const version =
|
|
||||||
(projectESLint.Linter as any).version &&
|
|
||||||
(projectESLint.Linter as any).version.split('.');
|
|
||||||
if (
|
|
||||||
!version ||
|
|
||||||
version.length < 2 ||
|
|
||||||
Number(version[0]) < 6 ||
|
|
||||||
(Number(version[0]) === 6 && Number(version[1]) < 1)
|
|
||||||
) {
|
|
||||||
throw new Error('ESLint must be version 6.1 or higher.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// We want users to have the option of not specifying the config path, and let
|
|
||||||
// eslint automatically resolve the `.eslintrc.json` files in each folder.
|
|
||||||
const eslintConfigPath = options.config
|
|
||||||
? path.resolve(systemRoot, options.config)
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
let lintReports: CLIEngine.LintReport[] = [];
|
|
||||||
const lintedFiles = new Set<string>();
|
|
||||||
|
|
||||||
if (options.tsConfig) {
|
|
||||||
const tsConfigs: string[] = Array.isArray(options.tsConfig)
|
|
||||||
? options.tsConfig
|
|
||||||
: [options.tsConfig];
|
|
||||||
const allPrograms = tsConfigs.map((tsConfig: any) =>
|
|
||||||
createProgram(path.resolve(systemRoot, tsConfig))
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const program of allPrograms) {
|
|
||||||
lintReports = [
|
|
||||||
...lintReports,
|
|
||||||
...(await lint(
|
|
||||||
systemRoot,
|
|
||||||
eslintConfigPath,
|
|
||||||
options,
|
|
||||||
lintedFiles,
|
|
||||||
program,
|
|
||||||
allPrograms
|
|
||||||
)),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lintReports = [
|
|
||||||
...lintReports,
|
|
||||||
...(await lint(systemRoot, eslintConfigPath, options, lintedFiles)),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lintReports.length === 0) {
|
|
||||||
throw new Error('Invalid lint configuration. Nothing to lint.');
|
|
||||||
}
|
|
||||||
|
|
||||||
const formatter: CLIEngine.Formatter = (
|
|
||||||
projectESLint.CLIEngine as any
|
|
||||||
).getFormatter(options.format);
|
|
||||||
|
|
||||||
const bundledReport: CLIEngine.LintReport = {
|
|
||||||
errorCount: 0,
|
|
||||||
fixableErrorCount: 0,
|
|
||||||
fixableWarningCount: 0,
|
|
||||||
warningCount: 0,
|
|
||||||
results: [],
|
|
||||||
usedDeprecatedRules: [],
|
|
||||||
};
|
|
||||||
for (const report of lintReports) {
|
|
||||||
// output fixes to disk
|
|
||||||
projectESLint.CLIEngine.outputFixes(report);
|
|
||||||
|
|
||||||
if (report.errorCount || report.warningCount) {
|
|
||||||
bundledReport.errorCount += report.errorCount;
|
|
||||||
bundledReport.warningCount += report.warningCount;
|
|
||||||
bundledReport.fixableErrorCount += report.fixableErrorCount;
|
|
||||||
bundledReport.fixableWarningCount += report.fixableWarningCount;
|
|
||||||
bundledReport.results.push(...report.results);
|
|
||||||
bundledReport.usedDeprecatedRules.push(...report.usedDeprecatedRules);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const formattedResults = formatter(bundledReport.results);
|
|
||||||
console.info(formattedResults);
|
|
||||||
|
|
||||||
if (options.outputFile) {
|
|
||||||
const pathToFile = path.join(context.root, options.outputFile);
|
|
||||||
createDirectory(path.dirname(pathToFile));
|
|
||||||
writeFileSync(pathToFile, formattedResults);
|
|
||||||
}
|
|
||||||
if (bundledReport.warningCount > 0 && printInfo) {
|
|
||||||
console.warn('Lint warnings found in the listed files.\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bundledReport.errorCount > 0 && printInfo) {
|
|
||||||
console.error('Lint errors found in the listed files.\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
bundledReport.warningCount === 0 &&
|
|
||||||
bundledReport.errorCount === 0 &&
|
|
||||||
printInfo
|
|
||||||
) {
|
|
||||||
console.info('All files pass linting.\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
success:
|
|
||||||
options.force ||
|
|
||||||
(bundledReport.errorCount === 0 &&
|
|
||||||
(options.maxWarnings === -1 ||
|
|
||||||
bundledReport.warningCount <= options.maxWarnings)),
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
31
packages/linter/src/executors/lint/schema.d.ts
vendored
31
packages/linter/src/executors/lint/schema.d.ts
vendored
@ -1,31 +0,0 @@
|
|||||||
export interface Schema {
|
|
||||||
linter: 'eslint' | 'tslint';
|
|
||||||
config: string;
|
|
||||||
tsConfig?: string | string[];
|
|
||||||
format: Formatter;
|
|
||||||
exclude: string[];
|
|
||||||
files: string[];
|
|
||||||
force?: boolean;
|
|
||||||
silent?: boolean;
|
|
||||||
fix?: boolean;
|
|
||||||
cache?: boolean;
|
|
||||||
outputFile?: string;
|
|
||||||
cacheLocation?: string;
|
|
||||||
maxWarnings: number;
|
|
||||||
quiet?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
type Formatter =
|
|
||||||
| 'stylish'
|
|
||||||
| 'compact'
|
|
||||||
| 'codeframe'
|
|
||||||
| 'unix'
|
|
||||||
| 'visualstudio'
|
|
||||||
| 'table'
|
|
||||||
| 'checkstyle'
|
|
||||||
| 'html'
|
|
||||||
| 'jslint-xml'
|
|
||||||
| 'json'
|
|
||||||
| 'json-with-metadata'
|
|
||||||
| 'junit'
|
|
||||||
| 'tap';
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
// Force module scoping
|
|
||||||
export default {};
|
|
||||||
|
|
||||||
jest.mock('./file-utils', () => ({
|
|
||||||
getFilesToLint: jest.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('eslint', () => ({
|
|
||||||
CLIEngine: jest.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
const { CLIEngine } = require('eslint');
|
|
||||||
(<jest.SpyInstance>CLIEngine).mockImplementation(() => ({
|
|
||||||
executeOnFiles: (args: string[]) => args,
|
|
||||||
}));
|
|
||||||
|
|
||||||
const { lint } = require('./eslint-utils');
|
|
||||||
|
|
||||||
function prog(sourceFile: string) {
|
|
||||||
return {
|
|
||||||
getSourceFile: (file: string) => (sourceFile === file ? true : undefined),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('eslint-util', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
jest.clearAllMocks();
|
|
||||||
});
|
|
||||||
it('should get files for linting with the correct params', async () => {
|
|
||||||
const { getFilesToLint } = require('./file-utils');
|
|
||||||
const lintedFiles = new Set();
|
|
||||||
await lint(
|
|
||||||
'/root',
|
|
||||||
'./.eslintrc.json',
|
|
||||||
<any>{ foo: 'bar' },
|
|
||||||
lintedFiles,
|
|
||||||
'ts-program'
|
|
||||||
).catch(() => {});
|
|
||||||
expect(getFilesToLint).toHaveBeenCalledWith(
|
|
||||||
'/root',
|
|
||||||
{ foo: 'bar' },
|
|
||||||
'ts-program'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should create the CLI Engine with the proper parameters', async () => {
|
|
||||||
const lintedFiles = new Set();
|
|
||||||
await lint(
|
|
||||||
'/root',
|
|
||||||
'./.eslintrc.json',
|
|
||||||
<any>{ fix: true, cache: true, cacheLocation: '/root/cache' },
|
|
||||||
lintedFiles,
|
|
||||||
'ts-program'
|
|
||||||
).catch(() => {});
|
|
||||||
expect(CLIEngine).toHaveBeenCalledWith({
|
|
||||||
configFile: './.eslintrc.json',
|
|
||||||
fix: true,
|
|
||||||
cache: true,
|
|
||||||
cacheLocation: '/root/cache',
|
|
||||||
useEslintrc: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('should not lint the same files twice', async () => {
|
|
||||||
const { getFilesToLint } = require('./file-utils');
|
|
||||||
(<jest.SpyInstance>getFilesToLint).mockReturnValue([
|
|
||||||
'file1',
|
|
||||||
'file2',
|
|
||||||
'file1',
|
|
||||||
'file3',
|
|
||||||
'file4',
|
|
||||||
]);
|
|
||||||
const lintedFiles = new Set();
|
|
||||||
lintedFiles.add('file4');
|
|
||||||
const reports = await lint(
|
|
||||||
'/root',
|
|
||||||
'./.eslintrc.json',
|
|
||||||
<any>{ foo: 'bar' },
|
|
||||||
lintedFiles
|
|
||||||
);
|
|
||||||
expect(reports).toEqual([['file1'], ['file2'], ['file3']]);
|
|
||||||
});
|
|
||||||
it('should throw an error if the file is not part of any program', async () => {
|
|
||||||
const { getFilesToLint } = require('./file-utils');
|
|
||||||
(<jest.SpyInstance>getFilesToLint).mockReturnValue([
|
|
||||||
'file1',
|
|
||||||
'file2',
|
|
||||||
'file1',
|
|
||||||
'file3',
|
|
||||||
]);
|
|
||||||
const program = prog('file8');
|
|
||||||
const allPrograms = [prog('file1'), prog('file2')];
|
|
||||||
const lintedFiles = new Set();
|
|
||||||
const lintPromise = lint(
|
|
||||||
'/root',
|
|
||||||
'./.eslintrc.json',
|
|
||||||
<any>{ tsConfig: 'my-ts-project' },
|
|
||||||
lintedFiles,
|
|
||||||
program,
|
|
||||||
allPrograms
|
|
||||||
);
|
|
||||||
await expect(lintPromise).rejects.toThrow(
|
|
||||||
`File \"file3\" is not part of a TypeScript project 'my-ts-project'.`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should not throw an error if a file is not part of the current program but part of another', async () => {
|
|
||||||
const { getFilesToLint } = require('./file-utils');
|
|
||||||
(<jest.SpyInstance>getFilesToLint).mockReturnValue([
|
|
||||||
'file1',
|
|
||||||
'file2',
|
|
||||||
'file1',
|
|
||||||
'file3',
|
|
||||||
]);
|
|
||||||
const program = prog('file2');
|
|
||||||
const allPrograms = [prog('file1'), prog('file2'), prog('file3')];
|
|
||||||
const lintedFiles = new Set();
|
|
||||||
const lintPromise = lint(
|
|
||||||
'/root',
|
|
||||||
'./.eslintrc.json',
|
|
||||||
<any>{ tsConfig: 'my-ts-project' },
|
|
||||||
lintedFiles,
|
|
||||||
program,
|
|
||||||
allPrograms
|
|
||||||
);
|
|
||||||
await expect(lintPromise).resolves.toEqual([['file2']]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
import { getFilesToLint } from './file-utils';
|
|
||||||
import type { Schema } from '../schema';
|
|
||||||
import { CLIEngine } from 'eslint';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copied from @angular-eslint/builder source
|
|
||||||
*/
|
|
||||||
|
|
||||||
export async function loadESLint() {
|
|
||||||
let eslint;
|
|
||||||
try {
|
|
||||||
eslint = await import('eslint');
|
|
||||||
return eslint;
|
|
||||||
} catch {
|
|
||||||
throw new Error('Unable to find ESLint. Ensure ESLint is installed.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adapted from @angular-eslint/builder source
|
|
||||||
*/
|
|
||||||
|
|
||||||
export async function lint(
|
|
||||||
systemRoot: string,
|
|
||||||
eslintConfigPath: string,
|
|
||||||
options: Schema,
|
|
||||||
lintedFiles: Set<string>,
|
|
||||||
program?: any,
|
|
||||||
allPrograms?: any[]
|
|
||||||
): Promise<any[]> {
|
|
||||||
const files = getFilesToLint(systemRoot, options, program);
|
|
||||||
|
|
||||||
const projectESLint = await loadESLint();
|
|
||||||
const cli: CLIEngine = new projectESLint.CLIEngine({
|
|
||||||
configFile: eslintConfigPath,
|
|
||||||
useEslintrc: true,
|
|
||||||
fix: !!options.fix,
|
|
||||||
cache: !!options.cache,
|
|
||||||
cacheLocation: options.cacheLocation,
|
|
||||||
});
|
|
||||||
|
|
||||||
const lintReports: CLIEngine.LintReport[] = [];
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
if (program && allPrograms) {
|
|
||||||
// If it cannot be found in ANY program, then this is an error.
|
|
||||||
if (allPrograms.every((p) => p.getSourceFile(file) === undefined)) {
|
|
||||||
throw new Error(
|
|
||||||
`File ${JSON.stringify(file)} is not part of a TypeScript project '${
|
|
||||||
options.tsConfig
|
|
||||||
}'.`
|
|
||||||
);
|
|
||||||
} else if (program.getSourceFile(file) === undefined) {
|
|
||||||
// The file exists in some other programs. We will lint it later (or earlier) in the loop.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Already linted the current file, so skip it here...
|
|
||||||
if (lintedFiles.has(file)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Give some breathing space to other promises that might be waiting.
|
|
||||||
await Promise.resolve();
|
|
||||||
const report = cli.executeOnFiles([file]);
|
|
||||||
if (options.quiet) {
|
|
||||||
report.results = CLIEngine.getErrorResults(report.results);
|
|
||||||
report.errorCount = 0;
|
|
||||||
}
|
|
||||||
lintReports.push(report);
|
|
||||||
lintedFiles.add(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
return lintReports;
|
|
||||||
}
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
jest.mock('glob', () => ({
|
|
||||||
sync: jest.fn().mockImplementation((file) => file),
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('path', () => ({
|
|
||||||
join: (...paths) => paths.join('/'),
|
|
||||||
normalize: (path) => path,
|
|
||||||
relative: (...paths) => paths[1],
|
|
||||||
}));
|
|
||||||
|
|
||||||
const { sync } = require('glob');
|
|
||||||
const { getFilesToLint } = require('./file-utils');
|
|
||||||
describe('file-utility', () => {
|
|
||||||
it('should process and return the list of files if specified', () => {
|
|
||||||
const files = ['file1', 'file2'];
|
|
||||||
const exclude = ['file2'];
|
|
||||||
const toLint = getFilesToLint('/root', { files, exclude });
|
|
||||||
expect(sync).toHaveBeenNthCalledWith(1, 'file1', {
|
|
||||||
cwd: '/root',
|
|
||||||
ignore: ['file2'],
|
|
||||||
nodir: true,
|
|
||||||
});
|
|
||||||
expect(sync).toHaveBeenNthCalledWith(2, 'file2', {
|
|
||||||
cwd: '/root',
|
|
||||||
ignore: ['file2'],
|
|
||||||
nodir: true,
|
|
||||||
});
|
|
||||||
expect(toLint).toEqual(['/root/file1', '/root/file2']);
|
|
||||||
});
|
|
||||||
it('should return empty if no files or program', () => {
|
|
||||||
const files = [];
|
|
||||||
const toLint = getFilesToLint('/root', { files });
|
|
||||||
expect(toLint).toEqual([]);
|
|
||||||
});
|
|
||||||
it('should get the proper file names from a program', () => {
|
|
||||||
const sourceFiles = [
|
|
||||||
{ fileName: 'foo.ts', isFromExternalLib: false },
|
|
||||||
{ fileName: 'foo.d.ts', isFromExternalLib: false },
|
|
||||||
{ fileName: 'foo.json', isFromExternalLib: false },
|
|
||||||
{ fileName: 'bar.d.ts', isFromExternalLib: true },
|
|
||||||
{ fileName: 'bar.ts', isFromExternalLib: true },
|
|
||||||
{ fileName: 'bar.ts', isFromExternalLib: false },
|
|
||||||
];
|
|
||||||
const program = {
|
|
||||||
getSourceFiles: () => sourceFiles,
|
|
||||||
isSourceFileFromExternalLibrary: (file: any) => file.isFromExternalLib,
|
|
||||||
};
|
|
||||||
const toLint = getFilesToLint('/root', {}, program);
|
|
||||||
expect(toLint).toEqual(['foo.ts', 'foo.d.ts', 'bar.ts']);
|
|
||||||
});
|
|
||||||
it('should filter out the excluded files from the program', () => {
|
|
||||||
const sourceFiles = [
|
|
||||||
{ fileName: 'foo.ts' },
|
|
||||||
{ fileName: 'bar.spec.ts' },
|
|
||||||
{ fileName: 'bar.ts' },
|
|
||||||
];
|
|
||||||
const exclude = ['*.spec.ts'];
|
|
||||||
const program = {
|
|
||||||
getSourceFiles: () => sourceFiles,
|
|
||||||
isSourceFileFromExternalLibrary: () => false,
|
|
||||||
};
|
|
||||||
const toLint = getFilesToLint('/root', { exclude }, program);
|
|
||||||
expect(toLint).toEqual(['foo.ts', 'bar.ts']);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
import * as ts from 'typescript';
|
|
||||||
import { Minimatch } from 'minimatch';
|
|
||||||
import * as path from 'path';
|
|
||||||
import * as glob from 'glob';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* - Copied from TSLint source:
|
|
||||||
*
|
|
||||||
* Returns an array of all outputs that are not `undefined`
|
|
||||||
*/
|
|
||||||
function mapDefined<T, U>(
|
|
||||||
inputs: ReadonlyArray<T>,
|
|
||||||
getOutput: (input: T) => U | undefined
|
|
||||||
): U[] {
|
|
||||||
const out = [];
|
|
||||||
for (const input of inputs) {
|
|
||||||
const output = getOutput(input);
|
|
||||||
if (output !== undefined) {
|
|
||||||
out.push(output);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* - Adapted from TSLint source:
|
|
||||||
*
|
|
||||||
* Returns a list of source file names from a TypeScript program.
|
|
||||||
* This includes all referenced files and excludes JSON files, to avoid problems with `resolveJsonModule`.
|
|
||||||
*/
|
|
||||||
function getFileNamesFromProgram(program: ts.Program): string[] {
|
|
||||||
return mapDefined(program.getSourceFiles(), (file) =>
|
|
||||||
file.fileName.endsWith('.json') ||
|
|
||||||
program.isSourceFileFromExternalLibrary(file)
|
|
||||||
? undefined
|
|
||||||
: file.fileName
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getFilesToLint(
|
|
||||||
root: string,
|
|
||||||
options: { exclude: string[]; files: string[] },
|
|
||||||
program?: ts.Program
|
|
||||||
): string[] {
|
|
||||||
const ignore = options.exclude;
|
|
||||||
const files = options.files || [];
|
|
||||||
|
|
||||||
if (files.length > 0) {
|
|
||||||
return files
|
|
||||||
.map((file) => glob.sync(file, { cwd: root, ignore, nodir: true }))
|
|
||||||
.reduce((prev, curr) => prev.concat(curr), [])
|
|
||||||
.map((file) => path.join(root, file));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!program) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
let programFiles = getFileNamesFromProgram(program);
|
|
||||||
|
|
||||||
if (ignore && ignore.length > 0) {
|
|
||||||
// normalize to support ./ paths
|
|
||||||
const ignoreMatchers = ignore.map(
|
|
||||||
(pattern: any) => new Minimatch(path.normalize(pattern), { dot: true })
|
|
||||||
);
|
|
||||||
|
|
||||||
programFiles = programFiles.filter(
|
|
||||||
(file: any) =>
|
|
||||||
!ignoreMatchers.some((matcher: any) =>
|
|
||||||
matcher.match(path.relative(root, file))
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return programFiles;
|
|
||||||
}
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
let mockReadConfigFile = jest.fn();
|
|
||||||
const mockParseJsonConfigFileContent = jest.fn().mockReturnValue({});
|
|
||||||
|
|
||||||
jest.mock('typescript', () => ({
|
|
||||||
sys: { readDirectory: 'sys-dir', readFile: 'sys-file' },
|
|
||||||
DiagnosticCategory: { Error: 'diag-categ-error' },
|
|
||||||
readConfigFile: mockReadConfigFile,
|
|
||||||
parseJsonConfigFileContent: mockParseJsonConfigFileContent,
|
|
||||||
formatDiagnostics: jest.fn().mockReturnValue('error details'),
|
|
||||||
createCompilerHost: jest.fn(),
|
|
||||||
createProgram: jest.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('path', () => ({
|
|
||||||
dirname: jest.fn(),
|
|
||||||
resolve: jest.fn().mockReturnValue('proj-dir'),
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('fs', () => ({
|
|
||||||
readFileSync: jest.fn().mockReturnValue('fs-read-file'),
|
|
||||||
existsSync: () => {},
|
|
||||||
}));
|
|
||||||
|
|
||||||
const ts = require('typescript');
|
|
||||||
const { createProgram } = require('./ts-utils');
|
|
||||||
|
|
||||||
describe('ts-utility', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
jest.clearAllMocks();
|
|
||||||
mockReadConfigFile.mockReturnValue({
|
|
||||||
config: 'read-config-file',
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('should read and parse config file', () => {
|
|
||||||
createProgram('tsconfig-1');
|
|
||||||
expect(ts.readConfigFile).toHaveBeenCalledWith('tsconfig-1', 'sys-file');
|
|
||||||
expect(ts.parseJsonConfigFileContent).toHaveBeenCalledWith(
|
|
||||||
'read-config-file',
|
|
||||||
expect.objectContaining({
|
|
||||||
fileExists: expect.any(Function),
|
|
||||||
readDirectory: 'sys-dir',
|
|
||||||
readFile: expect.any(Function),
|
|
||||||
useCaseSensitiveFileNames: true,
|
|
||||||
}),
|
|
||||||
'proj-dir',
|
|
||||||
{ noEmit: true }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should throw an error if the config cannot be read', () => {
|
|
||||||
mockReadConfigFile.mockReturnValue({ error: 'config err' });
|
|
||||||
expect(() => createProgram('tsconfig-1')).toThrow();
|
|
||||||
expect(ts.formatDiagnostics).toHaveBeenCalledWith(
|
|
||||||
['config err'],
|
|
||||||
expect.anything()
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should throw an error if there were relevant errors while parsing', () => {
|
|
||||||
mockParseJsonConfigFileContent.mockReturnValue({
|
|
||||||
errors: [
|
|
||||||
{ category: 'diag-categ-error', code: 1 },
|
|
||||||
{ category: 'unexpected-category', code: 1 },
|
|
||||||
{ category: 'diag-categ-error', code: 18003 },
|
|
||||||
],
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
createProgram('tsconfig-1');
|
|
||||||
expect(true).toBeFalsy(); //it should not get here
|
|
||||||
} catch (e) {
|
|
||||||
expect(ts.formatDiagnostics).toHaveBeenCalledWith(
|
|
||||||
[{ category: 'diag-categ-error', code: 1 }],
|
|
||||||
expect.anything()
|
|
||||||
);
|
|
||||||
expect(e.name).toBe('FatalError');
|
|
||||||
expect(e.message).toEqual('error details');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
it('should not throw if there were no relevant errors while parsing', () => {
|
|
||||||
mockParseJsonConfigFileContent.mockReturnValue({
|
|
||||||
errors: [
|
|
||||||
{ category: 'diag-categ-error', code: 18003 },
|
|
||||||
{ category: 'unexpected-category', code: 1 },
|
|
||||||
{ category: 'diag-categ-error', code: 18003 },
|
|
||||||
],
|
|
||||||
});
|
|
||||||
expect(() => createProgram('tsconfig-1')).not.toThrow();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
import { existsSync, readFileSync } from 'fs';
|
|
||||||
import * as ts from 'typescript';
|
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* - Copied from TSLint source:
|
|
||||||
*
|
|
||||||
* Generic error typing for EcmaScript errors
|
|
||||||
* Define `Error` here to avoid using `Error` from @types/node.
|
|
||||||
* Using the `node` version causes a compilation error when this code is used as an npm library if @types/node is not already imported.
|
|
||||||
*/
|
|
||||||
declare class Error {
|
|
||||||
public name?: string;
|
|
||||||
public message: string;
|
|
||||||
public stack?: string;
|
|
||||||
constructor(message?: string);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* - Copied from TSLint source:
|
|
||||||
*
|
|
||||||
* Used to exit the program and display a friendly message without the callstack.
|
|
||||||
*/
|
|
||||||
class FatalError extends Error {
|
|
||||||
public static NAME = 'FatalError';
|
|
||||||
constructor(public message: string, public innerError?: Error) {
|
|
||||||
super(message);
|
|
||||||
this.name = FatalError.NAME;
|
|
||||||
|
|
||||||
// Fix prototype chain for target ES5
|
|
||||||
Object.setPrototypeOf(this, FatalError.prototype);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* - Adapted from TSLint source:
|
|
||||||
*
|
|
||||||
* Creates a TypeScript program object from a tsconfig.json file path and optional project directory.
|
|
||||||
*/
|
|
||||||
export function createProgram(
|
|
||||||
configFile: string,
|
|
||||||
projectDirectory: string = path.dirname(configFile)
|
|
||||||
): ts.Program {
|
|
||||||
const config = ts.readConfigFile(configFile, ts.sys.readFile);
|
|
||||||
if (config.error !== undefined) {
|
|
||||||
throw new FatalError(
|
|
||||||
ts.formatDiagnostics([config.error], {
|
|
||||||
getCanonicalFileName: (f) => f,
|
|
||||||
getCurrentDirectory: process.cwd,
|
|
||||||
getNewLine: () => '\n',
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
const parseConfigHost: ts.ParseConfigHost = {
|
|
||||||
fileExists: existsSync,
|
|
||||||
readDirectory: ts.sys.readDirectory,
|
|
||||||
readFile: (file) => readFileSync(file, 'utf8'),
|
|
||||||
useCaseSensitiveFileNames: true,
|
|
||||||
};
|
|
||||||
const parsed = ts.parseJsonConfigFileContent(
|
|
||||||
config.config,
|
|
||||||
parseConfigHost,
|
|
||||||
path.resolve(projectDirectory),
|
|
||||||
{ noEmit: true }
|
|
||||||
);
|
|
||||||
if (parsed.errors !== undefined) {
|
|
||||||
// ignore warnings and 'TS18003: No inputs were found in config file ...'
|
|
||||||
const errors = parsed.errors.filter(
|
|
||||||
(d) => d.category === ts.DiagnosticCategory.Error && d.code !== 18003
|
|
||||||
);
|
|
||||||
if (errors.length !== 0) {
|
|
||||||
throw new FatalError(
|
|
||||||
ts.formatDiagnostics(errors, {
|
|
||||||
getCanonicalFileName: (f) => f,
|
|
||||||
getCurrentDirectory: process.cwd,
|
|
||||||
getNewLine: () => '\n',
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const host = ts.createCompilerHost(parsed.options, true);
|
|
||||||
const program = ts.createProgram(parsed.fileNames, parsed.options, host);
|
|
||||||
|
|
||||||
return program;
|
|
||||||
}
|
|
||||||
@ -28,7 +28,6 @@ export const rule = ESLintUtils.RuleCreator(() => __filename)({
|
|||||||
type: 'problem',
|
type: 'problem',
|
||||||
docs: {
|
docs: {
|
||||||
description: \`\`,
|
description: \`\`,
|
||||||
category: 'Possible Errors',
|
|
||||||
recommended: 'error',
|
recommended: 'error',
|
||||||
},
|
},
|
||||||
schema: [],
|
schema: [],
|
||||||
@ -85,7 +84,6 @@ export const rule = ESLintUtils.RuleCreator(() => __filename)({
|
|||||||
type: 'problem',
|
type: 'problem',
|
||||||
docs: {
|
docs: {
|
||||||
description: \`\`,
|
description: \`\`,
|
||||||
category: 'Possible Errors',
|
|
||||||
recommended: 'error',
|
recommended: 'error',
|
||||||
},
|
},
|
||||||
schema: [],
|
schema: [],
|
||||||
@ -142,7 +140,6 @@ export const rule = ESLintUtils.RuleCreator(() => __filename)({
|
|||||||
type: 'problem',
|
type: 'problem',
|
||||||
docs: {
|
docs: {
|
||||||
description: \`\`,
|
description: \`\`,
|
||||||
category: 'Possible Errors',
|
|
||||||
recommended: 'error',
|
recommended: 'error',
|
||||||
},
|
},
|
||||||
schema: [],
|
schema: [],
|
||||||
|
|||||||
@ -25,7 +25,6 @@ export const rule = ESLintUtils.RuleCreator(() => __filename)({
|
|||||||
type: 'problem',
|
type: 'problem',
|
||||||
docs: {
|
docs: {
|
||||||
description: ``,
|
description: ``,
|
||||||
category: 'Possible Errors',
|
|
||||||
recommended: 'error',
|
recommended: 'error',
|
||||||
},
|
},
|
||||||
schema: [],
|
schema: [],
|
||||||
|
|||||||
@ -94,7 +94,7 @@ exports[`@nrwl/linter:workspace-rules-project should generate the required files
|
|||||||
'^.+\\\\\\\\.[tj]s$': 'ts-jest'
|
'^.+\\\\\\\\.[tj]s$': 'ts-jest'
|
||||||
},
|
},
|
||||||
moduleFileExtensions: ['ts', 'js', 'html'],
|
moduleFileExtensions: ['ts', 'js', 'html'],
|
||||||
coverageDirectory: '../../coverage/tools/eslint-rules'
|
coverageDirectory: '../../coverage/tools/eslint-rules',\\"moduleNameMapper\\": {\\"@eslint/eslintrc\\":\\"@eslint/eslintrc/dist/eslintrc-universal.cjs\\"}
|
||||||
};
|
};
|
||||||
"
|
"
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -1,14 +1,16 @@
|
|||||||
import {
|
import {
|
||||||
addProjectConfiguration,
|
addProjectConfiguration,
|
||||||
convertNxGenerator,
|
convertNxGenerator,
|
||||||
|
formatFiles,
|
||||||
generateFiles,
|
generateFiles,
|
||||||
|
joinPathFragments,
|
||||||
offsetFromRoot,
|
offsetFromRoot,
|
||||||
readProjectConfiguration,
|
readProjectConfiguration,
|
||||||
readWorkspaceConfiguration,
|
readWorkspaceConfiguration,
|
||||||
Tree,
|
Tree,
|
||||||
updateWorkspaceConfiguration,
|
updateWorkspaceConfiguration,
|
||||||
} from '@nrwl/devkit';
|
} from '@nrwl/devkit';
|
||||||
import { jestProjectGenerator } from '@nrwl/jest';
|
import { addPropertyToJestConfig, jestProjectGenerator } from '@nrwl/jest';
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
import { workspaceLintPluginDir } from '../../utils/workspace-lint-rules';
|
import { workspaceLintPluginDir } from '../../utils/workspace-lint-rules';
|
||||||
|
|
||||||
@ -50,13 +52,27 @@ export async function lintWorkspaceRulesProjectGenerator(tree: Tree) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Add jest to the project and return installation task
|
// Add jest to the project and return installation task
|
||||||
return await jestProjectGenerator(tree, {
|
const jestInstallationTask = await jestProjectGenerator(tree, {
|
||||||
project: WORKSPACE_RULES_PROJECT_NAME,
|
project: WORKSPACE_RULES_PROJECT_NAME,
|
||||||
supportTsx: false,
|
supportTsx: false,
|
||||||
skipSerializers: true,
|
skipSerializers: true,
|
||||||
setupFile: 'none',
|
setupFile: 'none',
|
||||||
babelJest: false,
|
babelJest: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Add extra config to the jest.config.js file to allow ESLint 8 exports mapping to work with jest
|
||||||
|
addPropertyToJestConfig(
|
||||||
|
tree,
|
||||||
|
joinPathFragments(WORKSPACE_PLUGIN_DIR, 'jest.config.js'),
|
||||||
|
'moduleNameMapper',
|
||||||
|
{
|
||||||
|
'@eslint/eslintrc': '@eslint/eslintrc/dist/eslintrc-universal.cjs',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
await formatFiles(tree);
|
||||||
|
|
||||||
|
return jestInstallationTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const lintWorkspaceRulesProjectSchematic = convertNxGenerator(
|
export const lintWorkspaceRulesProjectSchematic = convertNxGenerator(
|
||||||
|
|||||||
@ -4,6 +4,6 @@ export const tslintVersion = '~6.1.0';
|
|||||||
export const tslintToEslintConfigVersion = '^2.4.0';
|
export const tslintToEslintConfigVersion = '^2.4.0';
|
||||||
export const buildAngularVersion = '~13.0.0';
|
export const buildAngularVersion = '~13.0.0';
|
||||||
|
|
||||||
export const typescriptESLintVersion = '~4.33.0';
|
export const typescriptESLintVersion = '~5.3.0';
|
||||||
export const eslintVersion = '7.32.0';
|
export const eslintVersion = '8.2.0';
|
||||||
export const eslintConfigPrettierVersion = '8.1.0';
|
export const eslintConfigPrettierVersion = '8.1.0';
|
||||||
|
|||||||
@ -6,9 +6,9 @@ Object {
|
|||||||
"devDependencies": Object {
|
"devDependencies": Object {
|
||||||
"@nrwl/eslint-plugin-nx": "*",
|
"@nrwl/eslint-plugin-nx": "*",
|
||||||
"@nrwl/linter": "*",
|
"@nrwl/linter": "*",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.33.0",
|
"@typescript-eslint/eslint-plugin": "~5.3.0",
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"eslint-plugin-import": "latest",
|
"eslint-plugin-import": "latest",
|
||||||
},
|
},
|
||||||
@ -299,9 +299,9 @@ Object {
|
|||||||
"devDependencies": Object {
|
"devDependencies": Object {
|
||||||
"@nrwl/eslint-plugin-nx": "*",
|
"@nrwl/eslint-plugin-nx": "*",
|
||||||
"@nrwl/linter": "*",
|
"@nrwl/linter": "*",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.33.0",
|
"@typescript-eslint/eslint-plugin": "~5.3.0",
|
||||||
"@typescript-eslint/parser": "~4.33.0",
|
"@typescript-eslint/parser": "~5.3.0",
|
||||||
"eslint": "7.32.0",
|
"eslint": "8.2.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"eslint-plugin-import": "latest",
|
"eslint-plugin-import": "latest",
|
||||||
},
|
},
|
||||||
|
|||||||
@ -41,7 +41,7 @@
|
|||||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.1",
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.1",
|
||||||
"@svgr/webpack": "^5.5.0",
|
"@svgr/webpack": "^5.5.0",
|
||||||
"chalk": "4.1.0",
|
"chalk": "4.1.0",
|
||||||
"eslint-plugin-import": "^2.22.1",
|
"eslint-plugin-import": "^2.25.2",
|
||||||
"eslint-plugin-jsx-a11y": "^6.4.1",
|
"eslint-plugin-jsx-a11y": "^6.4.1",
|
||||||
"eslint-plugin-react": "^7.23.1",
|
"eslint-plugin-react": "^7.23.1",
|
||||||
"eslint-plugin-react-hooks": "^4.2.0",
|
"eslint-plugin-react-hooks": "^4.2.0",
|
||||||
|
|||||||
@ -3,7 +3,7 @@ export const nxVersion = '*';
|
|||||||
export const angularCliVersion = '~13.0.0';
|
export const angularCliVersion = '~13.0.0';
|
||||||
export const typescriptVersion = '~4.4.3';
|
export const typescriptVersion = '~4.4.3';
|
||||||
export const prettierVersion = '^2.3.1';
|
export const prettierVersion = '^2.3.1';
|
||||||
export const typescriptESLintVersion = '4.33.0';
|
|
||||||
export const tslintVersion = '~6.1.0';
|
export const tslintVersion = '~6.1.0';
|
||||||
export const eslintVersion = '7.32.0';
|
export const typescriptESLintVersion = '~5.3.0';
|
||||||
|
export const eslintVersion = '8.2.0';
|
||||||
export const eslintConfigPrettierVersion = '8.1.0';
|
export const eslintConfigPrettierVersion = '8.1.0';
|
||||||
|
|||||||
@ -3,6 +3,16 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|||||||
const path_1 = require('path');
|
const path_1 = require('path');
|
||||||
const ts = require('typescript');
|
const ts = require('typescript');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom resolver which will respect package exports (until Jest supports it natively
|
||||||
|
* by resolving https://github.com/facebook/jest/issues/9771)
|
||||||
|
*/
|
||||||
|
const enhancedResolver = require('enhanced-resolve').create.sync({
|
||||||
|
conditionNames: ['require', 'node', 'default'],
|
||||||
|
extensions: ['.js', '.json', '.node', '.ts', '.tsx'],
|
||||||
|
});
|
||||||
|
|
||||||
function getCompilerSetup(rootDir) {
|
function getCompilerSetup(rootDir) {
|
||||||
const tsConfigPath =
|
const tsConfigPath =
|
||||||
ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.spec.json') ||
|
ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.spec.json') ||
|
||||||
@ -57,7 +67,13 @@ module.exports = function (path, options) {
|
|||||||
if (path.indexOf('@nrwl/workspace') > -1) {
|
if (path.indexOf('@nrwl/workspace') > -1) {
|
||||||
throw 'Reference to local Nx package found. Use local version instead.';
|
throw 'Reference to local Nx package found. Use local version instead.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Global modules which must be resolved by defaultResolver
|
||||||
|
if (['fs', 'http', 'path'].includes(path)) {
|
||||||
return options.defaultResolver(path, options);
|
return options.defaultResolver(path, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
return enhancedResolver(options.basedir, path);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Fallback to using typescript
|
// Fallback to using typescript
|
||||||
compilerSetup = compilerSetup || getCompilerSetup(options.rootDir);
|
compilerSetup = compilerSetup || getCompilerSetup(options.rootDir);
|
||||||
|
|||||||
339
yarn.lock
339
yarn.lock
@ -255,43 +255,43 @@
|
|||||||
ora "5.4.1"
|
ora "5.4.1"
|
||||||
rxjs "6.6.7"
|
rxjs "6.6.7"
|
||||||
|
|
||||||
"@angular-eslint/bundled-angular-compiler@13.0.0":
|
"@angular-eslint/bundled-angular-compiler@13.0.1":
|
||||||
version "13.0.0"
|
version "13.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.0.0.tgz#0c166204f265831c7f932c6b02331112eb1c3a83"
|
resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.0.1.tgz#fc0a568f915948fc4eb701abb331dc2f0e3ebc71"
|
||||||
integrity sha512-AVIULh2WWX5ZP6hPJrb/i3Gg+jUQ/ncx07A5dB1ytw0MfL616l/j4QR7qavdXUUGckx7mUfamwiQYilczcnC/Q==
|
integrity sha512-Eih9Kh0hxHO4+3in9mgjksQecym0p+3p+287y3LLihIc7gCkAO4xZeHGVGiC8qUX72PNUXkDlyskI9oHjK9Axw==
|
||||||
|
|
||||||
"@angular-eslint/eslint-plugin-template@~13.0.0":
|
"@angular-eslint/eslint-plugin-template@~13.0.1":
|
||||||
version "13.0.0"
|
version "13.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.0.0.tgz#54ec5cd3d72783aaa2775f39bb80d5bb9ad0f860"
|
resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.0.1.tgz#96d5e319278f629afcd034ff57f02de19e510e2b"
|
||||||
integrity sha512-fgOlRVCx8UDV1c3+iiLxcHZt/yjnJ7zbYS/oKHvc2EhX20W1ocFgW27+RKiGmZ3+vDMqvERuI4DQ2lkHaHEtlw==
|
integrity sha512-8FclNMjEzb87CtE3TdsXXWk1SRCp/tSSHI0cYVv6YpU7f/9Mnej+ZY3MdvqI/amD8zJueTMdnjNRP/jiwX2XhQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@angular-eslint/bundled-angular-compiler" "13.0.0"
|
"@angular-eslint/bundled-angular-compiler" "13.0.1"
|
||||||
"@typescript-eslint/experimental-utils" "5.3.0"
|
"@typescript-eslint/experimental-utils" "5.3.0"
|
||||||
aria-query "^4.2.2"
|
aria-query "^4.2.2"
|
||||||
axobject-query "^2.2.0"
|
axobject-query "^2.2.0"
|
||||||
|
|
||||||
"@angular-eslint/eslint-plugin@~13.0.0":
|
"@angular-eslint/eslint-plugin@~13.0.1":
|
||||||
version "13.0.0"
|
version "13.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-13.0.0.tgz#edeee1564afc9fd32e95c3e48c3bd4c0dd9b9ed1"
|
resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-13.0.1.tgz#fd737c8a97a5e65ab92e71b5fab1ffd45ed295f6"
|
||||||
integrity sha512-vM8I2I57p5S0uq5zuOE1CflS10Q3WENIbibfr6OBKfAaqGXmPvcf+bDAMQi/bwOvhNbUsC2I/H23I0BWxqiKsA==
|
integrity sha512-WxqgMLTfE45dqjzg/Nq0dOEDwzpdB+zYOWrA41MT3jt0UbukFEx8+FMrAgBLIeDaHzwWomiAEV5Tm5mQAKA4VA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@angular-eslint/utils" "13.0.0"
|
"@angular-eslint/utils" "13.0.1"
|
||||||
"@typescript-eslint/experimental-utils" "5.3.0"
|
"@typescript-eslint/experimental-utils" "5.3.0"
|
||||||
|
|
||||||
"@angular-eslint/template-parser@~13.0.0":
|
"@angular-eslint/template-parser@~13.0.1":
|
||||||
version "13.0.0"
|
version "13.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-13.0.0.tgz#3bbc231c5229d63d6ade9a5e77a009e7e20d0bb4"
|
resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-13.0.1.tgz#80121c3101053f1494cc8ec8882f569f7610d601"
|
||||||
integrity sha512-Fs8k3NybP9KLl+sYk66XBragxuVfygR/SjMNJWim4hgDLSie9SogXZhs3+8IVq6oWsBT/gSl4gsDmrH1Hbi5oA==
|
integrity sha512-GEJzVLS4Sb4UdurqaPD1/ucGhagGAQCp17CIgjpcXRwzxBZ9OLqbO/rx8diRbADp+1rceVq4BhADsg3VdsOsuw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@angular-eslint/bundled-angular-compiler" "13.0.0"
|
"@angular-eslint/bundled-angular-compiler" "13.0.1"
|
||||||
eslint-scope "^5.1.0"
|
eslint-scope "^5.1.0"
|
||||||
|
|
||||||
"@angular-eslint/utils@13.0.0":
|
"@angular-eslint/utils@13.0.1":
|
||||||
version "13.0.0"
|
version "13.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-13.0.0.tgz#306dce3b4daaaa8c5ea368bd36d90ecea1851e0d"
|
resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-13.0.1.tgz#e45085987b86a18ff567b4104b11fd03aa886c0a"
|
||||||
integrity sha512-LA6dRLPY2xEFTa/4mTCh5TXcaNCO9MZspTwzRl0SqAniP9MLZHTKouo+JPBD2KpPsa7gMjavHzykX3BeAAQo+A==
|
integrity sha512-makSpu8kr5yHIz0c6WaWwix+tk5DN5Uix9vQulVisZWchTmSqEovJih/UC+4XspM9kQbjcbWHohYKiBbBEQpbA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@angular-eslint/bundled-angular-compiler" "13.0.0"
|
"@angular-eslint/bundled-angular-compiler" "13.0.1"
|
||||||
"@typescript-eslint/experimental-utils" "5.3.0"
|
"@typescript-eslint/experimental-utils" "5.3.0"
|
||||||
|
|
||||||
"@angular/cli@~13.0.0":
|
"@angular/cli@~13.0.0":
|
||||||
@ -1964,6 +1964,21 @@
|
|||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
|
"@eslint/eslintrc@^1.0.4":
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.4.tgz#dfe0ff7ba270848d10c5add0715e04964c034b31"
|
||||||
|
integrity sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==
|
||||||
|
dependencies:
|
||||||
|
ajv "^6.12.4"
|
||||||
|
debug "^4.3.2"
|
||||||
|
espree "^9.0.0"
|
||||||
|
globals "^13.9.0"
|
||||||
|
ignore "^4.0.6"
|
||||||
|
import-fresh "^3.2.1"
|
||||||
|
js-yaml "^4.1.0"
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
"@francoischalifour/autocomplete-core@^1.0.0-alpha.28":
|
"@francoischalifour/autocomplete-core@^1.0.0-alpha.28":
|
||||||
version "1.0.0-alpha.28"
|
version "1.0.0-alpha.28"
|
||||||
resolved "https://registry.yarnpkg.com/@francoischalifour/autocomplete-core/-/autocomplete-core-1.0.0-alpha.28.tgz#6b9d8491288e77f831e9b345d461623b0d3f5005"
|
resolved "https://registry.yarnpkg.com/@francoischalifour/autocomplete-core/-/autocomplete-core-1.0.0-alpha.28.tgz#6b9d8491288e77f831e9b345d461623b0d3f5005"
|
||||||
@ -2018,6 +2033,15 @@
|
|||||||
debug "^4.1.1"
|
debug "^4.1.1"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
|
"@humanwhocodes/config-array@^0.6.0":
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.6.0.tgz#b5621fdb3b32309d2d16575456cbc277fa8f021a"
|
||||||
|
integrity sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==
|
||||||
|
dependencies:
|
||||||
|
"@humanwhocodes/object-schema" "^1.2.0"
|
||||||
|
debug "^4.1.1"
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
"@humanwhocodes/object-schema@^1.2.0":
|
"@humanwhocodes/object-schema@^1.2.0":
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
||||||
@ -4454,7 +4478,7 @@
|
|||||||
"@types/eslint" "*"
|
"@types/eslint" "*"
|
||||||
"@types/estree" "*"
|
"@types/estree" "*"
|
||||||
|
|
||||||
"@types/eslint@*", "@types/eslint@^7.2.2":
|
"@types/eslint@*":
|
||||||
version "7.28.2"
|
version "7.28.2"
|
||||||
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.2.tgz#0ff2947cdd305897c52d5372294e8c76f351db68"
|
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.2.tgz#0ff2947cdd305897c52d5372294e8c76f351db68"
|
||||||
integrity sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA==
|
integrity sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA==
|
||||||
@ -4462,6 +4486,14 @@
|
|||||||
"@types/estree" "*"
|
"@types/estree" "*"
|
||||||
"@types/json-schema" "*"
|
"@types/json-schema" "*"
|
||||||
|
|
||||||
|
"@types/eslint@^8.2.0":
|
||||||
|
version "8.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.0.tgz#afd0519223c29c347087542cbaee2fedc0873b16"
|
||||||
|
integrity sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/estree" "*"
|
||||||
|
"@types/json-schema" "*"
|
||||||
|
|
||||||
"@types/estree@*", "@types/estree@^0.0.50":
|
"@types/estree@*", "@types/estree@^0.0.50":
|
||||||
version "0.0.50"
|
version "0.0.50"
|
||||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
|
||||||
@ -4972,32 +5004,20 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin@~4.33.0":
|
"@typescript-eslint/eslint-plugin@~5.3.0":
|
||||||
version "4.33.0"
|
version "5.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.0.tgz#a55ae72d28ffeb6badd817fe4566c9cced1f5e29"
|
||||||
integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==
|
integrity sha512-ARUEJHJrq85aaiCqez7SANeahDsJTD3AEua34EoQN9pHS6S5Bq9emcIaGGySt/4X2zSi+vF5hAH52sEen7IO7g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/experimental-utils" "4.33.0"
|
"@typescript-eslint/experimental-utils" "5.3.0"
|
||||||
"@typescript-eslint/scope-manager" "4.33.0"
|
"@typescript-eslint/scope-manager" "5.3.0"
|
||||||
debug "^4.3.1"
|
debug "^4.3.2"
|
||||||
functional-red-black-tree "^1.0.1"
|
functional-red-black-tree "^1.0.1"
|
||||||
ignore "^5.1.8"
|
ignore "^5.1.8"
|
||||||
regexpp "^3.1.0"
|
regexpp "^3.2.0"
|
||||||
semver "^7.3.5"
|
semver "^7.3.5"
|
||||||
tsutils "^3.21.0"
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@~4.33.0":
|
|
||||||
version "4.33.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
|
|
||||||
integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
|
|
||||||
dependencies:
|
|
||||||
"@types/json-schema" "^7.0.7"
|
|
||||||
"@typescript-eslint/scope-manager" "4.33.0"
|
|
||||||
"@typescript-eslint/types" "4.33.0"
|
|
||||||
"@typescript-eslint/typescript-estree" "4.33.0"
|
|
||||||
eslint-scope "^5.1.1"
|
|
||||||
eslint-utils "^3.0.0"
|
|
||||||
|
|
||||||
"@typescript-eslint/experimental-utils@5.3.0":
|
"@typescript-eslint/experimental-utils@5.3.0":
|
||||||
version "5.3.0"
|
version "5.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.0.tgz#ee56b4957547ed2b0fc7451205e41502e664f546"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.0.tgz#ee56b4957547ed2b0fc7451205e41502e664f546"
|
||||||
@ -5010,7 +5030,31 @@
|
|||||||
eslint-scope "^5.1.1"
|
eslint-scope "^5.1.1"
|
||||||
eslint-utils "^3.0.0"
|
eslint-utils "^3.0.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@^4.20.0", "@typescript-eslint/parser@~4.33.0":
|
"@typescript-eslint/experimental-utils@~4.33.0":
|
||||||
|
version "4.33.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
|
||||||
|
integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
|
||||||
|
dependencies:
|
||||||
|
"@types/json-schema" "^7.0.7"
|
||||||
|
"@typescript-eslint/scope-manager" "4.33.0"
|
||||||
|
"@typescript-eslint/types" "4.33.0"
|
||||||
|
"@typescript-eslint/typescript-estree" "4.33.0"
|
||||||
|
eslint-scope "^5.1.1"
|
||||||
|
eslint-utils "^3.0.0"
|
||||||
|
|
||||||
|
"@typescript-eslint/experimental-utils@~5.3.0":
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz#bbd8f9b67b4d5fdcb9d2f90297d8fcda22561e05"
|
||||||
|
integrity sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==
|
||||||
|
dependencies:
|
||||||
|
"@types/json-schema" "^7.0.9"
|
||||||
|
"@typescript-eslint/scope-manager" "5.3.1"
|
||||||
|
"@typescript-eslint/types" "5.3.1"
|
||||||
|
"@typescript-eslint/typescript-estree" "5.3.1"
|
||||||
|
eslint-scope "^5.1.1"
|
||||||
|
eslint-utils "^3.0.0"
|
||||||
|
|
||||||
|
"@typescript-eslint/parser@^4.20.0":
|
||||||
version "4.33.0"
|
version "4.33.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
|
||||||
integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==
|
integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==
|
||||||
@ -5020,6 +5064,16 @@
|
|||||||
"@typescript-eslint/typescript-estree" "4.33.0"
|
"@typescript-eslint/typescript-estree" "4.33.0"
|
||||||
debug "^4.3.1"
|
debug "^4.3.1"
|
||||||
|
|
||||||
|
"@typescript-eslint/parser@~5.3.0":
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.3.1.tgz#8ff1977c3d3200c217b3e4628d43ef92f89e5261"
|
||||||
|
integrity sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==
|
||||||
|
dependencies:
|
||||||
|
"@typescript-eslint/scope-manager" "5.3.1"
|
||||||
|
"@typescript-eslint/types" "5.3.1"
|
||||||
|
"@typescript-eslint/typescript-estree" "5.3.1"
|
||||||
|
debug "^4.3.2"
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager@4.33.0":
|
"@typescript-eslint/scope-manager@4.33.0":
|
||||||
version "4.33.0"
|
version "4.33.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
|
||||||
@ -5036,6 +5090,14 @@
|
|||||||
"@typescript-eslint/types" "5.3.0"
|
"@typescript-eslint/types" "5.3.0"
|
||||||
"@typescript-eslint/visitor-keys" "5.3.0"
|
"@typescript-eslint/visitor-keys" "5.3.0"
|
||||||
|
|
||||||
|
"@typescript-eslint/scope-manager@5.3.1":
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz#3cfbfbcf5488fb2a9a6fbbe97963ee1e8d419269"
|
||||||
|
integrity sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==
|
||||||
|
dependencies:
|
||||||
|
"@typescript-eslint/types" "5.3.1"
|
||||||
|
"@typescript-eslint/visitor-keys" "5.3.1"
|
||||||
|
|
||||||
"@typescript-eslint/types@4.33.0":
|
"@typescript-eslint/types@4.33.0":
|
||||||
version "4.33.0"
|
version "4.33.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
|
||||||
@ -5046,6 +5108,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.3.0.tgz#af29fd53867c2df0028c57c36a655bd7e9e05416"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.3.0.tgz#af29fd53867c2df0028c57c36a655bd7e9e05416"
|
||||||
integrity sha512-fce5pG41/w8O6ahQEhXmMV+xuh4+GayzqEogN24EK+vECA3I6pUwKuLi5QbXO721EMitpQne5VKXofPonYlAQg==
|
integrity sha512-fce5pG41/w8O6ahQEhXmMV+xuh4+GayzqEogN24EK+vECA3I6pUwKuLi5QbXO721EMitpQne5VKXofPonYlAQg==
|
||||||
|
|
||||||
|
"@typescript-eslint/types@5.3.1":
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.3.1.tgz#afaa715b69ebfcfde3af8b0403bf27527912f9b7"
|
||||||
|
integrity sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree@4.33.0":
|
"@typescript-eslint/typescript-estree@4.33.0":
|
||||||
version "4.33.0"
|
version "4.33.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
|
||||||
@ -5072,6 +5139,19 @@
|
|||||||
semver "^7.3.5"
|
semver "^7.3.5"
|
||||||
tsutils "^3.21.0"
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
|
"@typescript-eslint/typescript-estree@5.3.1":
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz#50cc4bfb93dc31bc75e08ae52e29fcb786d606ec"
|
||||||
|
integrity sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==
|
||||||
|
dependencies:
|
||||||
|
"@typescript-eslint/types" "5.3.1"
|
||||||
|
"@typescript-eslint/visitor-keys" "5.3.1"
|
||||||
|
debug "^4.3.2"
|
||||||
|
globby "^11.0.4"
|
||||||
|
is-glob "^4.0.3"
|
||||||
|
semver "^7.3.5"
|
||||||
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys@4.33.0":
|
"@typescript-eslint/visitor-keys@4.33.0":
|
||||||
version "4.33.0"
|
version "4.33.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
|
||||||
@ -5088,6 +5168,14 @@
|
|||||||
"@typescript-eslint/types" "5.3.0"
|
"@typescript-eslint/types" "5.3.0"
|
||||||
eslint-visitor-keys "^3.0.0"
|
eslint-visitor-keys "^3.0.0"
|
||||||
|
|
||||||
|
"@typescript-eslint/visitor-keys@5.3.1":
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz#c2860ff22939352db4f3806f34b21d8ad00588ba"
|
||||||
|
integrity sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==
|
||||||
|
dependencies:
|
||||||
|
"@typescript-eslint/types" "5.3.1"
|
||||||
|
eslint-visitor-keys "^3.0.0"
|
||||||
|
|
||||||
"@verdaccio/commons-api@10.0.1":
|
"@verdaccio/commons-api@10.0.1":
|
||||||
version "10.0.1"
|
version "10.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@verdaccio/commons-api/-/commons-api-10.0.1.tgz#7217a167e428a7603ff46685c4cc40bb1526e463"
|
resolved "https://registry.yarnpkg.com/@verdaccio/commons-api/-/commons-api-10.0.1.tgz#7217a167e428a7603ff46685c4cc40bb1526e463"
|
||||||
@ -5573,7 +5661,7 @@ acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
|
||||||
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
|
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
|
||||||
|
|
||||||
acorn@^8.2.4, acorn@^8.4.1:
|
acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0:
|
||||||
version "8.5.0"
|
version "8.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
|
||||||
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
|
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
|
||||||
@ -6029,7 +6117,7 @@ array-unique@^0.3.2:
|
|||||||
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
|
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
|
||||||
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
|
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
|
||||||
|
|
||||||
array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.5:
|
array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.5:
|
||||||
version "1.2.5"
|
version "1.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
|
resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
|
||||||
integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==
|
integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==
|
||||||
@ -7893,11 +7981,6 @@ constants-browserify@1.0.0, constants-browserify@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
|
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
|
||||||
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
|
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
|
||||||
|
|
||||||
contains-path@^0.1.0:
|
|
||||||
version "0.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
|
|
||||||
integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
|
|
||||||
|
|
||||||
content-disposition@0.5.3:
|
content-disposition@0.5.3:
|
||||||
version "0.5.3"
|
version "0.5.3"
|
||||||
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
|
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
|
||||||
@ -9286,14 +9369,6 @@ dns-txt@^2.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
buffer-indexof "^1.0.0"
|
buffer-indexof "^1.0.0"
|
||||||
|
|
||||||
doctrine@1.5.0:
|
|
||||||
version "1.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
|
|
||||||
integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
|
|
||||||
dependencies:
|
|
||||||
esutils "^2.0.2"
|
|
||||||
isarray "^1.0.0"
|
|
||||||
|
|
||||||
doctrine@^2.1.0:
|
doctrine@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
|
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
|
||||||
@ -9716,7 +9791,7 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prr "~1.0.1"
|
prr "~1.0.1"
|
||||||
|
|
||||||
error-ex@^1.2.0, error-ex@^1.3.1:
|
error-ex@^1.3.1:
|
||||||
version "1.3.2"
|
version "1.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
|
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
|
||||||
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
|
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
|
||||||
@ -10194,7 +10269,7 @@ eslint-import-resolver-typescript@^2.4.0:
|
|||||||
resolve "^1.20.0"
|
resolve "^1.20.0"
|
||||||
tsconfig-paths "^3.9.0"
|
tsconfig-paths "^3.9.0"
|
||||||
|
|
||||||
eslint-module-utils@^2.6.0, eslint-module-utils@^2.7.1:
|
eslint-module-utils@^2.7.0, eslint-module-utils@^2.7.1:
|
||||||
version "2.7.1"
|
version "2.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c"
|
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c"
|
||||||
integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==
|
integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==
|
||||||
@ -10210,24 +10285,24 @@ eslint-plugin-cypress@^2.10.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
globals "^11.12.0"
|
globals "^11.12.0"
|
||||||
|
|
||||||
eslint-plugin-import@2.22.1:
|
eslint-plugin-import@2.25.2:
|
||||||
version "2.22.1"
|
version "2.25.2"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9"
|
||||||
integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==
|
integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes "^3.1.1"
|
array-includes "^3.1.4"
|
||||||
array.prototype.flat "^1.2.3"
|
array.prototype.flat "^1.2.5"
|
||||||
contains-path "^0.1.0"
|
|
||||||
debug "^2.6.9"
|
debug "^2.6.9"
|
||||||
doctrine "1.5.0"
|
doctrine "^2.1.0"
|
||||||
eslint-import-resolver-node "^0.3.4"
|
eslint-import-resolver-node "^0.3.6"
|
||||||
eslint-module-utils "^2.6.0"
|
eslint-module-utils "^2.7.0"
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
|
is-core-module "^2.7.0"
|
||||||
|
is-glob "^4.0.3"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
object.values "^1.1.1"
|
object.values "^1.1.5"
|
||||||
read-pkg-up "^2.0.0"
|
resolve "^1.20.0"
|
||||||
resolve "^1.17.0"
|
tsconfig-paths "^3.11.0"
|
||||||
tsconfig-paths "^3.9.0"
|
|
||||||
|
|
||||||
eslint-plugin-import@^2.22.1:
|
eslint-plugin-import@^2.22.1:
|
||||||
version "2.25.3"
|
version "2.25.3"
|
||||||
@ -10329,6 +10404,14 @@ eslint-scope@^4.0.3:
|
|||||||
esrecurse "^4.1.0"
|
esrecurse "^4.1.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
|
eslint-scope@^6.0.0:
|
||||||
|
version "6.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-6.0.0.tgz#9cf45b13c5ac8f3d4c50f46a5121f61b3e318978"
|
||||||
|
integrity sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==
|
||||||
|
dependencies:
|
||||||
|
esrecurse "^4.3.0"
|
||||||
|
estraverse "^5.2.0"
|
||||||
|
|
||||||
eslint-utils@^2.1.0:
|
eslint-utils@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
|
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
|
||||||
@ -10404,6 +10487,50 @@ eslint@7.32.0:
|
|||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
v8-compile-cache "^2.0.3"
|
v8-compile-cache "^2.0.3"
|
||||||
|
|
||||||
|
eslint@8.2.0:
|
||||||
|
version "8.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.2.0.tgz#44d3fb506d0f866a506d97a0fc0e90ee6d06a815"
|
||||||
|
integrity sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==
|
||||||
|
dependencies:
|
||||||
|
"@eslint/eslintrc" "^1.0.4"
|
||||||
|
"@humanwhocodes/config-array" "^0.6.0"
|
||||||
|
ajv "^6.10.0"
|
||||||
|
chalk "^4.0.0"
|
||||||
|
cross-spawn "^7.0.2"
|
||||||
|
debug "^4.3.2"
|
||||||
|
doctrine "^3.0.0"
|
||||||
|
enquirer "^2.3.5"
|
||||||
|
escape-string-regexp "^4.0.0"
|
||||||
|
eslint-scope "^6.0.0"
|
||||||
|
eslint-utils "^3.0.0"
|
||||||
|
eslint-visitor-keys "^3.0.0"
|
||||||
|
espree "^9.0.0"
|
||||||
|
esquery "^1.4.0"
|
||||||
|
esutils "^2.0.2"
|
||||||
|
fast-deep-equal "^3.1.3"
|
||||||
|
file-entry-cache "^6.0.1"
|
||||||
|
functional-red-black-tree "^1.0.1"
|
||||||
|
glob-parent "^6.0.1"
|
||||||
|
globals "^13.6.0"
|
||||||
|
ignore "^4.0.6"
|
||||||
|
import-fresh "^3.0.0"
|
||||||
|
imurmurhash "^0.1.4"
|
||||||
|
is-glob "^4.0.0"
|
||||||
|
js-yaml "^4.1.0"
|
||||||
|
json-stable-stringify-without-jsonify "^1.0.1"
|
||||||
|
levn "^0.4.1"
|
||||||
|
lodash.merge "^4.6.2"
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
natural-compare "^1.4.0"
|
||||||
|
optionator "^0.9.1"
|
||||||
|
progress "^2.0.0"
|
||||||
|
regexpp "^3.2.0"
|
||||||
|
semver "^7.2.1"
|
||||||
|
strip-ansi "^6.0.1"
|
||||||
|
strip-json-comments "^3.1.0"
|
||||||
|
text-table "^0.2.0"
|
||||||
|
v8-compile-cache "^2.0.3"
|
||||||
|
|
||||||
espree@^7.3.0, espree@^7.3.1:
|
espree@^7.3.0, espree@^7.3.1:
|
||||||
version "7.3.1"
|
version "7.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
|
||||||
@ -10413,6 +10540,15 @@ espree@^7.3.0, espree@^7.3.1:
|
|||||||
acorn-jsx "^5.3.1"
|
acorn-jsx "^5.3.1"
|
||||||
eslint-visitor-keys "^1.3.0"
|
eslint-visitor-keys "^1.3.0"
|
||||||
|
|
||||||
|
espree@^9.0.0:
|
||||||
|
version "9.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.0.0.tgz#e90a2965698228502e771c7a58489b1a9d107090"
|
||||||
|
integrity sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==
|
||||||
|
dependencies:
|
||||||
|
acorn "^8.5.0"
|
||||||
|
acorn-jsx "^5.3.1"
|
||||||
|
eslint-visitor-keys "^3.0.0"
|
||||||
|
|
||||||
esprima@^4.0.0, esprima@^4.0.1:
|
esprima@^4.0.0, esprima@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||||
@ -12929,7 +13065,7 @@ is-color-stop@^1.1.0:
|
|||||||
rgb-regex "^1.0.1"
|
rgb-regex "^1.0.1"
|
||||||
rgba-regex "^1.0.0"
|
rgba-regex "^1.0.0"
|
||||||
|
|
||||||
is-core-module@^2.2.0, is-core-module@^2.4.0, is-core-module@^2.5.0, is-core-module@^2.8.0:
|
is-core-module@^2.2.0, is-core-module@^2.4.0, is-core-module@^2.5.0, is-core-module@^2.7.0, is-core-module@^2.8.0:
|
||||||
version "2.8.0"
|
version "2.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
|
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
|
||||||
integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
|
integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
|
||||||
@ -14200,7 +14336,7 @@ js-string-escape@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
||||||
|
|
||||||
js-yaml@4.1.0:
|
js-yaml@4.1.0, js-yaml@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
||||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||||
@ -14757,16 +14893,6 @@ listr2@^3.8.3:
|
|||||||
through "^2.3.8"
|
through "^2.3.8"
|
||||||
wrap-ansi "^7.0.0"
|
wrap-ansi "^7.0.0"
|
||||||
|
|
||||||
load-json-file@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
|
|
||||||
integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
|
|
||||||
dependencies:
|
|
||||||
graceful-fs "^4.1.2"
|
|
||||||
parse-json "^2.2.0"
|
|
||||||
pify "^2.0.0"
|
|
||||||
strip-bom "^3.0.0"
|
|
||||||
|
|
||||||
load-json-file@^4.0.0:
|
load-json-file@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
|
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
|
||||||
@ -16602,7 +16728,7 @@ object.pick@^1.3.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
isobject "^3.0.1"
|
isobject "^3.0.1"
|
||||||
|
|
||||||
object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.3, object.values@^1.1.5:
|
object.values@^1.1.0, object.values@^1.1.3, object.values@^1.1.5:
|
||||||
version "1.1.5"
|
version "1.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
|
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
|
||||||
integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
|
integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
|
||||||
@ -17019,13 +17145,6 @@ parse-json@5.2.0, parse-json@^5.0.0:
|
|||||||
json-parse-even-better-errors "^2.3.0"
|
json-parse-even-better-errors "^2.3.0"
|
||||||
lines-and-columns "^1.1.6"
|
lines-and-columns "^1.1.6"
|
||||||
|
|
||||||
parse-json@^2.2.0:
|
|
||||||
version "2.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
|
|
||||||
integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
|
|
||||||
dependencies:
|
|
||||||
error-ex "^1.2.0"
|
|
||||||
|
|
||||||
parse-json@^4.0.0:
|
parse-json@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
|
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
|
||||||
@ -17212,13 +17331,6 @@ path-to-regexp@^1.7.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
isarray "0.0.1"
|
isarray "0.0.1"
|
||||||
|
|
||||||
path-type@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
|
|
||||||
integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
|
|
||||||
dependencies:
|
|
||||||
pify "^2.0.0"
|
|
||||||
|
|
||||||
path-type@^3.0.0:
|
path-type@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
|
resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
|
||||||
@ -18971,14 +19083,6 @@ read-package-json-fast@^2.0.1:
|
|||||||
json-parse-even-better-errors "^2.3.0"
|
json-parse-even-better-errors "^2.3.0"
|
||||||
npm-normalize-package-bin "^1.0.1"
|
npm-normalize-package-bin "^1.0.1"
|
||||||
|
|
||||||
read-pkg-up@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
|
|
||||||
integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
|
|
||||||
dependencies:
|
|
||||||
find-up "^2.0.0"
|
|
||||||
read-pkg "^2.0.0"
|
|
||||||
|
|
||||||
read-pkg-up@^3.0.0:
|
read-pkg-up@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
|
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
|
||||||
@ -18996,15 +19100,6 @@ read-pkg-up@^7.0.1:
|
|||||||
read-pkg "^5.2.0"
|
read-pkg "^5.2.0"
|
||||||
type-fest "^0.8.1"
|
type-fest "^0.8.1"
|
||||||
|
|
||||||
read-pkg@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
|
|
||||||
integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
|
|
||||||
dependencies:
|
|
||||||
load-json-file "^2.0.0"
|
|
||||||
normalize-package-data "^2.3.2"
|
|
||||||
path-type "^2.0.0"
|
|
||||||
|
|
||||||
read-pkg@^3.0.0:
|
read-pkg@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
|
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
|
||||||
@ -19197,7 +19292,7 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1:
|
|||||||
call-bind "^1.0.2"
|
call-bind "^1.0.2"
|
||||||
define-properties "^1.1.3"
|
define-properties "^1.1.3"
|
||||||
|
|
||||||
regexpp@^3.1.0:
|
regexpp@^3.1.0, regexpp@^3.2.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
|
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
|
||||||
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
|
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user