@cloud-ru/ft-deps-validator 1.1.1 → 1.1.2-preview-8996d18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -15
- package/dist/cjs/Checker/MonorepoChecker.d.ts +10 -0
- package/dist/cjs/Checker/MonorepoChecker.js +57 -0
- package/dist/cjs/Checker/RepoChecker.d.ts +8 -0
- package/dist/cjs/Checker/RepoChecker.js +36 -0
- package/dist/cjs/Checker/__tests__/MonorepoChecker.spec.js +305 -0
- package/dist/cjs/Checker/__tests__/RepoChecker.spec.js +116 -0
- package/dist/cjs/Checker/index.d.ts +2 -0
- package/dist/cjs/Checker/index.js +7 -0
- package/dist/cjs/Config/MonorepoConfig.d.ts +12 -0
- package/dist/cjs/Config/MonorepoConfig.js +42 -0
- package/dist/cjs/Config/RepoConfig.d.ts +10 -0
- package/dist/cjs/Config/RepoConfig.js +27 -0
- package/dist/cjs/Config/__tests__/MonorepoConfig.spec.js +291 -0
- package/dist/cjs/Config/__tests__/RepoConfig.spec.d.ts +1 -0
- package/dist/cjs/Config/__tests__/RepoConfig.spec.js +99 -0
- package/dist/cjs/Config/index.d.ts +2 -0
- package/dist/cjs/Config/index.js +7 -0
- package/dist/cjs/Report/__tests__/Report.spec.d.ts +1 -0
- package/dist/cjs/Report/__tests__/Report.spec.js +176 -0
- package/dist/cjs/Report/index.d.ts +11 -0
- package/dist/cjs/Report/index.js +55 -0
- package/dist/cjs/index.d.ts +0 -1
- package/dist/cjs/index.js +13 -57
- package/dist/{esm/types/config.d.ts → cjs/types.d.ts} +14 -3
- package/dist/cjs/utils/__tests__/getCliArguments.spec.d.ts +1 -0
- package/dist/cjs/utils/__tests__/getCliArguments.spec.js +70 -0
- package/dist/cjs/utils/getCliArguments.d.ts +6 -6
- package/dist/cjs/utils/getCliArguments.js +1 -27
- package/dist/cjs/utils/getConfigFile.d.ts +4 -3
- package/dist/cjs/utils/getConfigFile.js +3 -9
- package/dist/cjs/utils/getEnvironment.d.ts +3 -0
- package/dist/cjs/utils/getEnvironment.js +50 -0
- package/dist/cjs/utils/readPackageJsonFile.d.ts +9 -0
- package/dist/cjs/utils/readPackageJsonFile.js +28 -0
- package/dist/esm/Checker/MonorepoChecker.d.ts +10 -0
- package/dist/esm/Checker/MonorepoChecker.js +53 -0
- package/dist/esm/Checker/RepoChecker.d.ts +8 -0
- package/dist/esm/Checker/RepoChecker.js +29 -0
- package/dist/esm/Checker/__tests__/MonorepoChecker.spec.d.ts +1 -0
- package/dist/esm/Checker/__tests__/MonorepoChecker.spec.js +300 -0
- package/dist/esm/Checker/__tests__/RepoChecker.spec.d.ts +1 -0
- package/dist/esm/Checker/__tests__/RepoChecker.spec.js +111 -0
- package/dist/esm/Checker/index.d.ts +2 -0
- package/dist/esm/Checker/index.js +2 -0
- package/dist/esm/Config/MonorepoConfig.d.ts +12 -0
- package/dist/esm/Config/MonorepoConfig.js +35 -0
- package/dist/esm/Config/RepoConfig.d.ts +10 -0
- package/dist/esm/Config/RepoConfig.js +20 -0
- package/dist/esm/Config/__tests__/MonorepoConfig.spec.d.ts +1 -0
- package/dist/esm/Config/__tests__/MonorepoConfig.spec.js +289 -0
- package/dist/esm/Config/__tests__/RepoConfig.spec.d.ts +1 -0
- package/dist/esm/Config/__tests__/RepoConfig.spec.js +94 -0
- package/dist/esm/Config/index.d.ts +2 -0
- package/dist/esm/Config/index.js +2 -0
- package/dist/esm/Report/__tests__/Report.spec.d.ts +1 -0
- package/dist/esm/Report/__tests__/Report.spec.js +174 -0
- package/dist/esm/Report/index.d.ts +11 -0
- package/dist/esm/Report/index.js +51 -0
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/index.js +14 -55
- package/dist/{cjs/types/config.d.ts → esm/types.d.ts} +14 -3
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/__tests__/getCliArguments.spec.d.ts +1 -0
- package/dist/esm/utils/__tests__/getCliArguments.spec.js +68 -0
- package/dist/esm/utils/getCliArguments.d.ts +6 -6
- package/dist/esm/utils/getCliArguments.js +1 -27
- package/dist/esm/utils/getConfigFile.d.ts +4 -3
- package/dist/esm/utils/getConfigFile.js +3 -9
- package/dist/esm/utils/getEnvironment.d.ts +3 -0
- package/dist/esm/utils/getEnvironment.js +42 -0
- package/dist/esm/utils/readPackageJsonFile.d.ts +9 -0
- package/dist/esm/utils/readPackageJsonFile.js +20 -0
- package/package.json +2 -2
- package/src/Checker/MonorepoChecker.ts +45 -0
- package/src/Checker/RepoChecker.ts +23 -0
- package/src/Checker/__tests__/MonorepoChecker.spec.ts +330 -0
- package/src/Checker/__tests__/RepoChecker.spec.ts +132 -0
- package/src/Checker/index.ts +2 -0
- package/src/Config/MonorepoConfig.ts +51 -0
- package/src/Config/RepoConfig.ts +30 -0
- package/src/Config/__tests__/MonorepoConfig.spec.ts +346 -0
- package/src/Config/__tests__/RepoConfig.spec.ts +131 -0
- package/src/Config/index.ts +2 -0
- package/src/Report/__tests__/Report.spec.ts +221 -0
- package/src/Report/index.ts +75 -0
- package/src/index.ts +14 -67
- package/src/{types/config.ts → types.ts} +15 -3
- package/src/utils/__tests__/getCliArguments.spec.ts +89 -0
- package/src/utils/getCliArguments.ts +1 -35
- package/src/utils/getConfigFile.ts +7 -11
- package/src/utils/getEnvironment.ts +53 -0
- package/src/utils/readPackageJsonFile.ts +20 -0
- package/dist/cjs/types/cliArguments.d.ts +0 -4
- package/dist/cjs/types/config.js +0 -2
- package/dist/cjs/types/state.d.ts +0 -6
- package/dist/cjs/types/state.js +0 -2
- package/dist/cjs/utils/getMonorepoPrefix.d.ts +0 -6
- package/dist/cjs/utils/getMonorepoPrefix.js +0 -33
- package/dist/cjs/utils/initializeState.d.ts +0 -8
- package/dist/cjs/utils/initializeState.js +0 -40
- package/dist/esm/types/cliArguments.d.ts +0 -4
- package/dist/esm/types/state.d.ts +0 -6
- package/dist/esm/utils/getMonorepoPrefix.d.ts +0 -6
- package/dist/esm/utils/getMonorepoPrefix.js +0 -27
- package/dist/esm/utils/initializeState.d.ts +0 -8
- package/dist/esm/utils/initializeState.js +0 -34
- package/src/types/cliArguments.ts +0 -5
- package/src/types/state.ts +0 -6
- package/src/utils/getMonorepoPrefix.ts +0 -32
- package/src/utils/initializeState.ts +0 -51
- /package/dist/{esm/types/cliArguments.js → cjs/Checker/__tests__/MonorepoChecker.spec.d.ts} +0 -0
- /package/dist/{esm/types/config.js → cjs/Checker/__tests__/RepoChecker.spec.d.ts} +0 -0
- /package/dist/{esm/types/state.js → cjs/Config/__tests__/MonorepoConfig.spec.d.ts} +0 -0
- /package/dist/cjs/{types/cliArguments.js → types.js} +0 -0
package/dist/esm/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
2
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
3
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -8,63 +7,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
8
|
});
|
|
10
9
|
};
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { initializeState } from './utils/initializeState';
|
|
10
|
+
import { MonorepoChecker, RepoChecker } from './Checker';
|
|
11
|
+
import { MonorepoConfig } from './Config';
|
|
12
|
+
import { RepoConfig } from './Config/RepoConfig';
|
|
13
|
+
import { logError } from './utils/console';
|
|
14
|
+
import { getEnvironment, isMonorepoEnv } from './utils/getEnvironment';
|
|
17
15
|
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
16
|
try {
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
ignoreMatches: config.ignoreMatches.map(match => match.toString()),
|
|
27
|
-
};
|
|
28
|
-
const folders = globSync(config.rootPackagesFolderPattern, {
|
|
29
|
-
ignore: config.ignoredPackagesFolderFiles.map(path => path.toString()),
|
|
30
|
-
});
|
|
31
|
-
const state = initializeState({
|
|
32
|
-
cwd: args.cwd,
|
|
33
|
-
folders,
|
|
34
|
-
prefix: config.prefix,
|
|
35
|
-
});
|
|
36
|
-
for (const folder of folders) {
|
|
37
|
-
const { dependencies, missing: missingDepsPerPackage } = yield depCheck(folder, options);
|
|
38
|
-
state.unusedDeps.push(...dependencies.map(x => `${folder}: ${x}`));
|
|
39
|
-
if (Object.keys(missingDepsPerPackage).length) {
|
|
40
|
-
state.missing.push(missingDepsPerPackage);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (Object.values(state).every(result => result.length < 1)) {
|
|
44
|
-
logInfo('Dependencies have been checked. Everything is ok.');
|
|
45
|
-
process.exit(0);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (state.wrongVersions.length) {
|
|
49
|
-
logError('You have to fix wrong version of internal packages:');
|
|
50
|
-
state.wrongVersions.forEach(logDebug);
|
|
51
|
-
}
|
|
52
|
-
if (state.internalAsDev.length) {
|
|
53
|
-
logError('You have to fix wrong usage of internal packages in dev dependencies (either delete them or move to dependencies):');
|
|
54
|
-
state.internalAsDev.forEach(logDebug);
|
|
55
|
-
}
|
|
56
|
-
if (state.unusedDeps.length) {
|
|
57
|
-
logError('You have to fix following unused dependencies:');
|
|
58
|
-
state.unusedDeps.forEach(logDebug);
|
|
59
|
-
}
|
|
60
|
-
if (state.missing.length) {
|
|
61
|
-
logError('You have to fix following missed dependencies:');
|
|
62
|
-
state.missing.forEach(x => logDebug(JSON.stringify(x, null, 2)));
|
|
63
|
-
}
|
|
64
|
-
process.exit(1);
|
|
17
|
+
const env = getEnvironment();
|
|
18
|
+
const checker = isMonorepoEnv(env)
|
|
19
|
+
? new MonorepoChecker(new MonorepoConfig(env))
|
|
20
|
+
: new RepoChecker(new RepoConfig(env));
|
|
21
|
+
const report = yield checker.check();
|
|
22
|
+
const exitCode = report.printResultAndGetExitCode();
|
|
23
|
+
process.exit(exitCode);
|
|
65
24
|
}
|
|
66
|
-
catch (
|
|
67
|
-
|
|
25
|
+
catch (e) {
|
|
26
|
+
logError(`${e}`);
|
|
68
27
|
process.exit(1);
|
|
69
28
|
}
|
|
70
29
|
}))();
|
|
@@ -1,12 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
type BaseEnvType = {
|
|
2
2
|
/** Directories names that should be ignored */
|
|
3
3
|
ignorePatterns?: string[];
|
|
4
4
|
/** Names of packages that should be ignored */
|
|
5
5
|
ignoreMatches?: string[];
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
};
|
|
7
|
+
export type RawRepoEnvType = BaseEnvType & {
|
|
8
|
+
packages?: Record<string, BaseEnvType>;
|
|
9
|
+
};
|
|
10
|
+
export type RawMonorepoEnvType = {
|
|
8
11
|
/** One or more paths that should be ignored in packages folder */
|
|
9
12
|
ignoredPackagesFolderFiles?: string[];
|
|
10
13
|
/** Folder containing packages (glob pattern, e.g., "packages/*" or "apps/*") */
|
|
11
14
|
rootPackagesFolderPattern?: string;
|
|
15
|
+
} & RawRepoEnvType;
|
|
16
|
+
export type RepoEnvType = RawRepoEnvType & {
|
|
17
|
+
cwd: string;
|
|
18
|
+
};
|
|
19
|
+
export type MonorepoEnvType = RawMonorepoEnvType & {
|
|
20
|
+
cwd: string;
|
|
21
|
+
rootPackagesFolderPattern: string;
|
|
12
22
|
};
|
|
23
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { getCliArguments } from '../getCliArguments';
|
|
3
|
+
describe('@cloud-ru/ft-deps-validator/getCliArguments', () => {
|
|
4
|
+
const originalArgv = process.argv;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
process.argv = originalArgv;
|
|
7
|
+
vi.clearAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it('should return empty object when no arguments provided', () => {
|
|
10
|
+
process.argv = ['node', 'script.js'];
|
|
11
|
+
const result = getCliArguments();
|
|
12
|
+
expect(result.cwd).toBeUndefined();
|
|
13
|
+
expect(result.rootPackagesFolderPattern).toBeUndefined();
|
|
14
|
+
expect(result.ignoredPackagesFolderFiles).toBeUndefined();
|
|
15
|
+
expect(result.ignorePatterns).toBeUndefined();
|
|
16
|
+
expect(result.ignoreMatches).toBeUndefined();
|
|
17
|
+
});
|
|
18
|
+
it('should parse cwd option', () => {
|
|
19
|
+
const testCwd = '/test/directory';
|
|
20
|
+
process.argv = ['node', 'script.js', '--cwd', testCwd];
|
|
21
|
+
const result = getCliArguments();
|
|
22
|
+
expect(result.cwd).toBe(testCwd);
|
|
23
|
+
});
|
|
24
|
+
it('should parse cwd option with alias -d', () => {
|
|
25
|
+
const testCwd = '/test/directory';
|
|
26
|
+
process.argv = ['node', 'script.js', '-d', testCwd];
|
|
27
|
+
const result = getCliArguments();
|
|
28
|
+
expect(result.cwd).toBe(testCwd);
|
|
29
|
+
});
|
|
30
|
+
it('should parse rootPackagesFolderPattern option', () => {
|
|
31
|
+
const pattern = 'apps/*';
|
|
32
|
+
process.argv = ['node', 'script.js', '--rootPackagesFolderPattern', pattern];
|
|
33
|
+
const result = getCliArguments();
|
|
34
|
+
expect(result.rootPackagesFolderPattern).toBe(pattern);
|
|
35
|
+
});
|
|
36
|
+
it('should parse rootPackagesFolderPattern option with alias -p', () => {
|
|
37
|
+
const pattern = 'apps/*';
|
|
38
|
+
process.argv = ['node', 'script.js', '-p', pattern];
|
|
39
|
+
const result = getCliArguments();
|
|
40
|
+
expect(result.rootPackagesFolderPattern).toBe(pattern);
|
|
41
|
+
});
|
|
42
|
+
it('should parse ignoredPackagesFolderFiles option', () => {
|
|
43
|
+
const files = ['file1.json', 'file2.json'];
|
|
44
|
+
process.argv = ['node', 'script.js', '--ignoredPackagesFolderFiles', ...files];
|
|
45
|
+
const result = getCliArguments();
|
|
46
|
+
expect(result.ignoredPackagesFolderFiles).toEqual(files);
|
|
47
|
+
});
|
|
48
|
+
it('should parse ignorePatterns option', () => {
|
|
49
|
+
const patterns = ['test', 'build'];
|
|
50
|
+
process.argv = ['node', 'script.js', '--ignorePatterns', ...patterns];
|
|
51
|
+
const result = getCliArguments();
|
|
52
|
+
expect(result.ignorePatterns).toEqual(patterns);
|
|
53
|
+
});
|
|
54
|
+
it('should parse ignoreMatches option', () => {
|
|
55
|
+
const matches = ['package1', 'package2'];
|
|
56
|
+
process.argv = ['node', 'script.js', '--ignoreMatches', ...matches];
|
|
57
|
+
const result = getCliArguments();
|
|
58
|
+
expect(result.ignoreMatches).toEqual(matches);
|
|
59
|
+
});
|
|
60
|
+
it('should parse multiple options together', () => {
|
|
61
|
+
const testCwd = '/test/directory';
|
|
62
|
+
const pattern = 'apps/*';
|
|
63
|
+
process.argv = ['node', 'script.js', '--cwd', testCwd, '--rootPackagesFolderPattern', pattern];
|
|
64
|
+
const result = getCliArguments();
|
|
65
|
+
expect(result.cwd).toBe(testCwd);
|
|
66
|
+
expect(result.rootPackagesFolderPattern).toBe(pattern);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare function getCliArguments(): {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
ignorePatterns:
|
|
7
|
-
ignoreMatches:
|
|
2
|
+
[x: string]: unknown;
|
|
3
|
+
cwd: string | undefined;
|
|
4
|
+
rootPackagesFolderPattern: string | undefined;
|
|
5
|
+
ignoredPackagesFolderFiles: (string | number)[] | undefined;
|
|
6
|
+
ignorePatterns: (string | number)[] | undefined;
|
|
7
|
+
ignoreMatches: (string | number)[] | undefined;
|
|
8
8
|
_: (string | number)[];
|
|
9
9
|
$0: string;
|
|
10
10
|
};
|
|
@@ -1,46 +1,26 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
1
|
import yargs from 'yargs';
|
|
3
2
|
export function getCliArguments() {
|
|
4
|
-
|
|
3
|
+
return yargs(process.argv.slice(2))
|
|
5
4
|
.option('cwd', {
|
|
6
5
|
alias: 'd',
|
|
7
6
|
type: 'string',
|
|
8
|
-
default: process.cwd(),
|
|
9
7
|
description: 'working directory (default: current working directory, cwd)',
|
|
10
|
-
})
|
|
11
|
-
.option('prefix', {
|
|
12
|
-
type: 'string',
|
|
13
|
-
description: 'monorepo prefix (if skipped will try to find automatically)',
|
|
14
8
|
})
|
|
15
9
|
.option('rootPackagesFolderPattern', {
|
|
16
10
|
alias: 'p',
|
|
17
11
|
type: 'string',
|
|
18
|
-
default: 'packages/*',
|
|
19
12
|
description: 'folder containing packages (glob pattern, e.g., "packages/*" or "apps/*")',
|
|
20
13
|
})
|
|
21
14
|
.option('ignoredPackagesFolderFiles', {
|
|
22
15
|
type: 'array',
|
|
23
|
-
default: ['packages/tsconfig.cjs.json', 'packages/tsconfig.esm.json'],
|
|
24
16
|
description: 'specify one or more paths that should be ignored in packages folder',
|
|
25
17
|
})
|
|
26
18
|
.option('ignorePatterns', {
|
|
27
19
|
type: 'array',
|
|
28
|
-
default: ['stories', 'dist', '__tests__', '__e2e__'],
|
|
29
20
|
description: 'specify one or more directories names that should be ignored',
|
|
30
21
|
})
|
|
31
22
|
.option('ignoreMatches', {
|
|
32
23
|
type: 'array',
|
|
33
|
-
default: [
|
|
34
|
-
'react',
|
|
35
|
-
'react-dom',
|
|
36
|
-
'react-docgen-typescript',
|
|
37
|
-
'@snack-uikit/figma-tokens',
|
|
38
|
-
'@sbercloud/figma-tokens-cloud-platform',
|
|
39
|
-
'@sbercloud/figma-tokens-mlspace',
|
|
40
|
-
'@sbercloud/figma-tokens-admin',
|
|
41
|
-
'@sbercloud/figma-tokens-web',
|
|
42
|
-
'@sbercloud/figma-tokens-giga-id',
|
|
43
|
-
],
|
|
44
24
|
description: 'specify one or more packages that should be ignored',
|
|
45
25
|
})
|
|
46
26
|
.locale('en')
|
|
@@ -48,10 +28,4 @@ export function getCliArguments() {
|
|
|
48
28
|
.alias('h', 'help')
|
|
49
29
|
.alias('v', 'version')
|
|
50
30
|
.parseSync();
|
|
51
|
-
const cwd = path.resolve(parsed.cwd);
|
|
52
|
-
const rootPackagesFolderPattern = path.resolve(cwd, parsed.rootPackagesFolderPattern);
|
|
53
|
-
const ignoredPackagesFolderFiles = parsed.ignoredPackagesFolderFiles.map(file => path.resolve(cwd, file.toString()));
|
|
54
|
-
return Object.assign(Object.assign({}, parsed), { cwd,
|
|
55
|
-
rootPackagesFolderPattern,
|
|
56
|
-
ignoredPackagesFolderFiles });
|
|
57
31
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare function getConfigFile(cwd:
|
|
1
|
+
import { RawMonorepoEnvType, RawRepoEnvType } from '../types';
|
|
2
|
+
type PossibleConfig = RawMonorepoEnvType & RawRepoEnvType;
|
|
3
|
+
export declare function getConfigFile(cwd: string): PossibleConfig;
|
|
4
|
+
export {};
|
|
@@ -4,14 +4,8 @@ const CONFIG_FILE_NAME = 'deps-validator.config.json';
|
|
|
4
4
|
export function getConfigFile(cwd) {
|
|
5
5
|
const configPath = path.resolve(cwd, CONFIG_FILE_NAME);
|
|
6
6
|
if (!fs.existsSync(configPath)) {
|
|
7
|
-
return
|
|
8
|
-
}
|
|
9
|
-
try {
|
|
10
|
-
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
11
|
-
const config = JSON.parse(configContent);
|
|
12
|
-
return config;
|
|
13
|
-
}
|
|
14
|
-
catch (_a) {
|
|
15
|
-
return null;
|
|
7
|
+
return { packages: {} };
|
|
16
8
|
}
|
|
9
|
+
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
10
|
+
return JSON.parse(configContent);
|
|
17
11
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getCliArguments } from './getCliArguments';
|
|
4
|
+
import { getConfigFile } from './getConfigFile';
|
|
5
|
+
export function getEnvironment() {
|
|
6
|
+
const defaultConfig = {
|
|
7
|
+
cwd: process.cwd(),
|
|
8
|
+
ignoredPackagesFolderFiles: ['packages/tsconfig.cjs.json', 'packages/tsconfig.esm.json'],
|
|
9
|
+
ignorePatterns: ['stories', 'dist', '__tests__', '__e2e__'],
|
|
10
|
+
ignoreMatches: [
|
|
11
|
+
'react',
|
|
12
|
+
'react-dom',
|
|
13
|
+
'react-docgen-typescript',
|
|
14
|
+
'@snack-uikit/figma-tokens',
|
|
15
|
+
'@sbercloud/figma-tokens-cloud-platform',
|
|
16
|
+
'@sbercloud/figma-tokens-mlspace',
|
|
17
|
+
'@sbercloud/figma-tokens-admin',
|
|
18
|
+
'@sbercloud/figma-tokens-web',
|
|
19
|
+
'@sbercloud/figma-tokens-giga-id',
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
const configFile = getConfigFile(defaultConfig.cwd);
|
|
23
|
+
const configArguments = getCliArguments();
|
|
24
|
+
const rootIsNotPassed = !configFile.rootPackagesFolderPattern && !configArguments.ignoredPackagesFolderFiles;
|
|
25
|
+
const rawConfig = Object.assign(defaultConfig,
|
|
26
|
+
/* конфиг файл имеет меньший приоритет перед cli-аргументами */
|
|
27
|
+
configFile, configArguments);
|
|
28
|
+
if (rootIsNotPassed) {
|
|
29
|
+
/*
|
|
30
|
+
Если папку не передали в конфиге, то проверим на наличие папки сами,
|
|
31
|
+
если она есть, то считаем что это монорепа
|
|
32
|
+
*/
|
|
33
|
+
if (fs.existsSync(path.resolve(defaultConfig.cwd, './packages'))) {
|
|
34
|
+
rawConfig.rootPackagesFolderPattern = 'packages/*';
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
delete rawConfig.rootPackagesFolderPattern;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return rawConfig;
|
|
41
|
+
}
|
|
42
|
+
export const isMonorepoEnv = (env) => Boolean('rootPackagesFolderPattern' in env);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type PackageJson = {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
dependencies: Record<string, string>;
|
|
5
|
+
devDependencies: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
export declare const readPackageJsonFile: (folder: string) => Promise<PackageJson>;
|
|
8
|
+
export declare const readPackageJsonFileSync: (folder: string) => PackageJson;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import fsp from 'node:fs/promises';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
export const readPackageJsonFile = (folder) => __awaiter(void 0, void 0, void 0, function* () {
|
|
14
|
+
const file = yield fsp.readFile(path.relative(folder, './package.json'), 'utf8');
|
|
15
|
+
return JSON.parse(file);
|
|
16
|
+
});
|
|
17
|
+
export const readPackageJsonFileSync = (folder) => {
|
|
18
|
+
const file = fs.readFileSync(path.resolve(folder, './package.json'), 'utf8');
|
|
19
|
+
return JSON.parse(file);
|
|
20
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloud-ru/ft-deps-validator",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2-preview-8996d18.0",
|
|
4
4
|
"description": "Validator for unused, missing or wrong version dependencies in monorepo's packages",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -38,5 +38,5 @@
|
|
|
38
38
|
"glob": "10.5.0",
|
|
39
39
|
"yargs": "18.0.0"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "7564a8b88cec298ec89adf8265978420d475c337"
|
|
42
42
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { MonorepoConfig } from '../Config';
|
|
2
|
+
import { readPackageJsonFile, readPackageJsonFileSync } from '../utils/readPackageJsonFile';
|
|
3
|
+
import { RepoChecker } from './RepoChecker';
|
|
4
|
+
|
|
5
|
+
export class MonorepoChecker extends RepoChecker {
|
|
6
|
+
private actualVersions: Record<string, string> = {};
|
|
7
|
+
|
|
8
|
+
constructor(config: MonorepoConfig) {
|
|
9
|
+
super(config);
|
|
10
|
+
|
|
11
|
+
this.config.getFolders().reduce((acc, folder) => {
|
|
12
|
+
const pkg = readPackageJsonFileSync(folder);
|
|
13
|
+
acc[pkg.name] = pkg.version;
|
|
14
|
+
return acc;
|
|
15
|
+
}, this.actualVersions);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected async checkFolder(path: string) {
|
|
19
|
+
const [result, pkg] = await Promise.all([super.checkFolder(path), readPackageJsonFile(path)]);
|
|
20
|
+
|
|
21
|
+
for (const [dep, version] of Object.entries(pkg.dependencies)) {
|
|
22
|
+
const actualVersion = this.actualVersions[dep];
|
|
23
|
+
if (actualVersion !== version) {
|
|
24
|
+
const message = `"${dep}" has wrong version "${version}", but need "${actualVersion}".`;
|
|
25
|
+
if (result.wrongVersions) {
|
|
26
|
+
result.wrongVersions.push();
|
|
27
|
+
} else {
|
|
28
|
+
result.wrongVersions = [message];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const devDep of Object.keys(pkg.devDependencies)) {
|
|
34
|
+
if (this.actualVersions[devDep]) {
|
|
35
|
+
if (result.internalAsDev) {
|
|
36
|
+
result.internalAsDev.push(devDep);
|
|
37
|
+
} else {
|
|
38
|
+
result.internalAsDev = [devDep];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import depcheck from 'depcheck';
|
|
2
|
+
|
|
3
|
+
import { RepoConfig } from '../Config';
|
|
4
|
+
import { CheckState, Report } from '../Report';
|
|
5
|
+
|
|
6
|
+
export class RepoChecker {
|
|
7
|
+
protected config: RepoConfig;
|
|
8
|
+
|
|
9
|
+
constructor(config: RepoConfig) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public async check(): Promise<Report> {
|
|
14
|
+
const folders = this.config.getFolders();
|
|
15
|
+
const report = new Report();
|
|
16
|
+
await Promise.all(folders.map(folder => this.checkFolder(folder).then(result => report.add(folder, result))));
|
|
17
|
+
return report;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected async checkFolder(path: string): Promise<CheckState> {
|
|
21
|
+
return depcheck(path, this.config.getFolderOptions(path));
|
|
22
|
+
}
|
|
23
|
+
}
|