@cloud-ru/ft-deps-validator 1.1.1 → 1.1.2-preview-9ce1a08.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.
Files changed (115) hide show
  1. package/README.md +34 -15
  2. package/dist/cjs/Checker/MonorepoChecker.d.ts +10 -0
  3. package/dist/cjs/Checker/MonorepoChecker.js +57 -0
  4. package/dist/cjs/Checker/RepoChecker.d.ts +8 -0
  5. package/dist/cjs/Checker/RepoChecker.js +36 -0
  6. package/dist/cjs/Checker/__tests__/MonorepoChecker.spec.js +305 -0
  7. package/dist/cjs/Checker/__tests__/RepoChecker.spec.js +116 -0
  8. package/dist/cjs/Checker/index.d.ts +2 -0
  9. package/dist/cjs/Checker/index.js +7 -0
  10. package/dist/cjs/Config/MonorepoConfig.d.ts +12 -0
  11. package/dist/cjs/Config/MonorepoConfig.js +42 -0
  12. package/dist/cjs/Config/RepoConfig.d.ts +10 -0
  13. package/dist/cjs/Config/RepoConfig.js +27 -0
  14. package/dist/cjs/Config/__tests__/MonorepoConfig.spec.js +296 -0
  15. package/dist/cjs/Config/__tests__/RepoConfig.spec.d.ts +1 -0
  16. package/dist/cjs/Config/__tests__/RepoConfig.spec.js +99 -0
  17. package/dist/cjs/Config/index.d.ts +2 -0
  18. package/dist/cjs/Config/index.js +7 -0
  19. package/dist/cjs/Report/__tests__/Report.spec.d.ts +1 -0
  20. package/dist/cjs/Report/__tests__/Report.spec.js +176 -0
  21. package/dist/cjs/Report/index.d.ts +11 -0
  22. package/dist/cjs/Report/index.js +55 -0
  23. package/dist/cjs/index.d.ts +0 -1
  24. package/dist/cjs/index.js +13 -57
  25. package/dist/{esm/types/config.d.ts → cjs/types.d.ts} +14 -3
  26. package/dist/cjs/utils/__tests__/getCliArguments.spec.d.ts +1 -0
  27. package/dist/cjs/utils/__tests__/getCliArguments.spec.js +70 -0
  28. package/dist/cjs/utils/getCliArguments.d.ts +6 -6
  29. package/dist/cjs/utils/getCliArguments.js +1 -27
  30. package/dist/cjs/utils/getConfigFile.d.ts +4 -3
  31. package/dist/cjs/utils/getConfigFile.js +3 -9
  32. package/dist/cjs/utils/getEnvironment.d.ts +3 -0
  33. package/dist/cjs/utils/getEnvironment.js +50 -0
  34. package/dist/cjs/utils/readPackageJsonFile.d.ts +9 -0
  35. package/dist/cjs/utils/readPackageJsonFile.js +28 -0
  36. package/dist/esm/Checker/MonorepoChecker.d.ts +10 -0
  37. package/dist/esm/Checker/MonorepoChecker.js +53 -0
  38. package/dist/esm/Checker/RepoChecker.d.ts +8 -0
  39. package/dist/esm/Checker/RepoChecker.js +29 -0
  40. package/dist/esm/Checker/__tests__/MonorepoChecker.spec.d.ts +1 -0
  41. package/dist/esm/Checker/__tests__/MonorepoChecker.spec.js +300 -0
  42. package/dist/esm/Checker/__tests__/RepoChecker.spec.d.ts +1 -0
  43. package/dist/esm/Checker/__tests__/RepoChecker.spec.js +111 -0
  44. package/dist/esm/Checker/index.d.ts +2 -0
  45. package/dist/esm/Checker/index.js +2 -0
  46. package/dist/esm/Config/MonorepoConfig.d.ts +12 -0
  47. package/dist/esm/Config/MonorepoConfig.js +35 -0
  48. package/dist/esm/Config/RepoConfig.d.ts +10 -0
  49. package/dist/esm/Config/RepoConfig.js +20 -0
  50. package/dist/esm/Config/__tests__/MonorepoConfig.spec.d.ts +1 -0
  51. package/dist/esm/Config/__tests__/MonorepoConfig.spec.js +291 -0
  52. package/dist/esm/Config/__tests__/RepoConfig.spec.d.ts +1 -0
  53. package/dist/esm/Config/__tests__/RepoConfig.spec.js +94 -0
  54. package/dist/esm/Config/index.d.ts +2 -0
  55. package/dist/esm/Config/index.js +2 -0
  56. package/dist/esm/Report/__tests__/Report.spec.d.ts +1 -0
  57. package/dist/esm/Report/__tests__/Report.spec.js +174 -0
  58. package/dist/esm/Report/index.d.ts +11 -0
  59. package/dist/esm/Report/index.js +51 -0
  60. package/dist/esm/index.d.ts +0 -1
  61. package/dist/esm/index.js +14 -55
  62. package/dist/{cjs/types/config.d.ts → esm/types.d.ts} +14 -3
  63. package/dist/esm/types.js +1 -0
  64. package/dist/esm/utils/__tests__/getCliArguments.spec.d.ts +1 -0
  65. package/dist/esm/utils/__tests__/getCliArguments.spec.js +68 -0
  66. package/dist/esm/utils/getCliArguments.d.ts +6 -6
  67. package/dist/esm/utils/getCliArguments.js +1 -27
  68. package/dist/esm/utils/getConfigFile.d.ts +4 -3
  69. package/dist/esm/utils/getConfigFile.js +3 -9
  70. package/dist/esm/utils/getEnvironment.d.ts +3 -0
  71. package/dist/esm/utils/getEnvironment.js +42 -0
  72. package/dist/esm/utils/readPackageJsonFile.d.ts +9 -0
  73. package/dist/esm/utils/readPackageJsonFile.js +20 -0
  74. package/package.json +2 -2
  75. package/src/Checker/MonorepoChecker.ts +45 -0
  76. package/src/Checker/RepoChecker.ts +23 -0
  77. package/src/Checker/__tests__/MonorepoChecker.spec.ts +330 -0
  78. package/src/Checker/__tests__/RepoChecker.spec.ts +132 -0
  79. package/src/Checker/index.ts +2 -0
  80. package/src/Config/MonorepoConfig.ts +51 -0
  81. package/src/Config/RepoConfig.ts +30 -0
  82. package/src/Config/__tests__/MonorepoConfig.spec.ts +348 -0
  83. package/src/Config/__tests__/RepoConfig.spec.ts +131 -0
  84. package/src/Config/index.ts +2 -0
  85. package/src/Report/__tests__/Report.spec.ts +221 -0
  86. package/src/Report/index.ts +75 -0
  87. package/src/index.ts +14 -67
  88. package/src/{types/config.ts → types.ts} +15 -3
  89. package/src/utils/__tests__/getCliArguments.spec.ts +89 -0
  90. package/src/utils/getCliArguments.ts +1 -35
  91. package/src/utils/getConfigFile.ts +7 -11
  92. package/src/utils/getEnvironment.ts +53 -0
  93. package/src/utils/readPackageJsonFile.ts +20 -0
  94. package/dist/cjs/types/cliArguments.d.ts +0 -4
  95. package/dist/cjs/types/config.js +0 -2
  96. package/dist/cjs/types/state.d.ts +0 -6
  97. package/dist/cjs/types/state.js +0 -2
  98. package/dist/cjs/utils/getMonorepoPrefix.d.ts +0 -6
  99. package/dist/cjs/utils/getMonorepoPrefix.js +0 -33
  100. package/dist/cjs/utils/initializeState.d.ts +0 -8
  101. package/dist/cjs/utils/initializeState.js +0 -40
  102. package/dist/esm/types/cliArguments.d.ts +0 -4
  103. package/dist/esm/types/state.d.ts +0 -6
  104. package/dist/esm/utils/getMonorepoPrefix.d.ts +0 -6
  105. package/dist/esm/utils/getMonorepoPrefix.js +0 -27
  106. package/dist/esm/utils/initializeState.d.ts +0 -8
  107. package/dist/esm/utils/initializeState.js +0 -34
  108. package/src/types/cliArguments.ts +0 -5
  109. package/src/types/state.ts +0 -6
  110. package/src/utils/getMonorepoPrefix.ts +0 -32
  111. package/src/utils/initializeState.ts +0 -51
  112. /package/dist/{esm/types/cliArguments.js → cjs/Checker/__tests__/MonorepoChecker.spec.d.ts} +0 -0
  113. /package/dist/{esm/types/config.js → cjs/Checker/__tests__/RepoChecker.spec.d.ts} +0 -0
  114. /package/dist/{esm/types/state.js → cjs/Config/__tests__/MonorepoConfig.spec.d.ts} +0 -0
  115. /package/dist/cjs/{types/cliArguments.js → types.js} +0 -0
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const console_1 = require("../../utils/console");
5
+ const index_1 = require("../index");
6
+ vitest_1.vi.mock('../../utils/console', () => ({
7
+ logError: vitest_1.vi.fn(),
8
+ logInfo: vitest_1.vi.fn(),
9
+ }));
10
+ (0, vitest_1.describe)('Report', () => {
11
+ let report;
12
+ (0, vitest_1.beforeEach)(() => {
13
+ report = new index_1.Report();
14
+ vitest_1.vi.clearAllMocks();
15
+ });
16
+ (0, vitest_1.describe)('add', () => {
17
+ (0, vitest_1.it)('should add state to storage', () => {
18
+ const folder = 'packages/test-package';
19
+ const state = {
20
+ dependencies: ['unused-dep'],
21
+ wrongVersions: ['@cloud-ru/package'],
22
+ };
23
+ report.add(folder, state);
24
+ const exitCode = report.printResultAndGetExitCode();
25
+ (0, vitest_1.expect)(exitCode).toBe(1);
26
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalled();
27
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalled();
28
+ });
29
+ (0, vitest_1.it)('should throw error when trying to add state for existing folder', () => {
30
+ const folder = 'packages/test-package';
31
+ const firstState = {
32
+ dependencies: ['unused-dep'],
33
+ };
34
+ const secondState = {
35
+ wrongVersions: ['@cloud-ru/package'],
36
+ };
37
+ report.add(folder, firstState);
38
+ (0, vitest_1.expect)(() => {
39
+ report.add(folder, secondState);
40
+ }).toThrow(`There is check state in storage already for: ${folder}`);
41
+ });
42
+ });
43
+ (0, vitest_1.describe)('printResultAndGetExitCode', () => {
44
+ (0, vitest_1.it)('should return 0 when storage is empty', () => {
45
+ const exitCode = report.printResultAndGetExitCode();
46
+ (0, vitest_1.expect)(exitCode).toBe(0);
47
+ (0, vitest_1.expect)(console_1.logInfo).not.toHaveBeenCalled();
48
+ (0, vitest_1.expect)(console_1.logError).not.toHaveBeenCalled();
49
+ });
50
+ (0, vitest_1.it)('should return 0 when there are no errors', () => {
51
+ report.add('packages/test-package', {
52
+ dependencies: [],
53
+ wrongVersions: [],
54
+ internalAsDev: [],
55
+ missing: {},
56
+ });
57
+ const exitCode = report.printResultAndGetExitCode();
58
+ (0, vitest_1.expect)(exitCode).toBe(0);
59
+ (0, vitest_1.expect)(console_1.logInfo).not.toHaveBeenCalled();
60
+ (0, vitest_1.expect)(console_1.logError).not.toHaveBeenCalled();
61
+ });
62
+ (0, vitest_1.it)('should return 1 and log errors when wrongVersions exist', () => {
63
+ const folder = 'packages/test-package';
64
+ const wrongVersions = ['@cloud-ru/package1', '@cloud-ru/package2'];
65
+ report.add(folder, {
66
+ wrongVersions,
67
+ });
68
+ const exitCode = report.printResultAndGetExitCode();
69
+ (0, vitest_1.expect)(exitCode).toBe(1);
70
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith(folder);
71
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\twrong version of internal packages:');
72
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package1');
73
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package2');
74
+ });
75
+ (0, vitest_1.it)('should return 1 and log errors when internalAsDev exist', () => {
76
+ const folder = 'packages/test-package';
77
+ const internalAsDev = ['@cloud-ru/package1', '@cloud-ru/package2'];
78
+ report.add(folder, {
79
+ internalAsDev,
80
+ });
81
+ const exitCode = report.printResultAndGetExitCode();
82
+ (0, vitest_1.expect)(exitCode).toBe(1);
83
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith(folder);
84
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\tincorrect usage as dev dep of internal packages:');
85
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package1');
86
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package2');
87
+ });
88
+ (0, vitest_1.it)('should return 1 and log errors when dependencies exist', () => {
89
+ const folder = 'packages/test-package';
90
+ const dependencies = ['unused-dep1', 'unused-dep2'];
91
+ report.add(folder, {
92
+ dependencies,
93
+ });
94
+ const exitCode = report.printResultAndGetExitCode();
95
+ (0, vitest_1.expect)(exitCode).toBe(1);
96
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith(folder);
97
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\tunused dependencies:');
98
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tunused-dep1');
99
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tunused-dep2');
100
+ });
101
+ (0, vitest_1.it)('should return 1 and log errors when missing dependencies exist', () => {
102
+ const folder = 'packages/test-package';
103
+ const missing = {
104
+ 'missing-package1': ['file1.ts', 'file2.ts'],
105
+ 'missing-package2': ['file3.ts'],
106
+ };
107
+ report.add(folder, {
108
+ missing,
109
+ });
110
+ const exitCode = report.printResultAndGetExitCode();
111
+ (0, vitest_1.expect)(exitCode).toBe(1);
112
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith(folder);
113
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\tmissing dependencies:');
114
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tmissing-package1');
115
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tfile1.ts');
116
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tfile2.ts');
117
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tmissing-package2');
118
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tfile3.ts');
119
+ });
120
+ (0, vitest_1.it)('should handle all error types together', () => {
121
+ const folder = 'packages/test-package';
122
+ report.add(folder, {
123
+ wrongVersions: ['@cloud-ru/package1'],
124
+ internalAsDev: ['@cloud-ru/package2'],
125
+ dependencies: ['unused-dep'],
126
+ missing: {
127
+ 'missing-package': ['file.ts'],
128
+ },
129
+ });
130
+ const exitCode = report.printResultAndGetExitCode();
131
+ (0, vitest_1.expect)(exitCode).toBe(1);
132
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith(folder);
133
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\twrong version of internal packages:');
134
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package1');
135
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\tincorrect usage as dev dep of internal packages:');
136
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package2');
137
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\tunused dependencies:');
138
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tunused-dep');
139
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\tmissing dependencies:');
140
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tmissing-package');
141
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\tfile.ts');
142
+ });
143
+ (0, vitest_1.it)('should process multiple packages', () => {
144
+ report.add('packages/package1', {
145
+ wrongVersions: ['@cloud-ru/package'],
146
+ });
147
+ report.add('packages/package2', {
148
+ dependencies: ['unused-dep'],
149
+ });
150
+ const exitCode = report.printResultAndGetExitCode();
151
+ (0, vitest_1.expect)(exitCode).toBe(1);
152
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith('packages/package1');
153
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith(vitest_1.expect.stringContaining('wrong version'));
154
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith('packages/package2');
155
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith(vitest_1.expect.stringContaining('unused dependencies'));
156
+ });
157
+ (0, vitest_1.it)('should use default values for undefined fields', () => {
158
+ const folder = 'packages/test-package';
159
+ report.add(folder, {});
160
+ const exitCode = report.printResultAndGetExitCode();
161
+ (0, vitest_1.expect)(exitCode).toBe(0);
162
+ (0, vitest_1.expect)(console_1.logInfo).not.toHaveBeenCalled();
163
+ (0, vitest_1.expect)(console_1.logError).not.toHaveBeenCalled();
164
+ });
165
+ (0, vitest_1.it)('should format messages with correct tabs', () => {
166
+ const folder = 'packages/test-package';
167
+ report.add(folder, {
168
+ wrongVersions: ['@cloud-ru/package'],
169
+ });
170
+ report.printResultAndGetExitCode();
171
+ (0, vitest_1.expect)(console_1.logInfo).toHaveBeenCalledWith('packages/test-package');
172
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\twrong version of internal packages:');
173
+ (0, vitest_1.expect)(console_1.logError).toHaveBeenCalledWith('\t\t@cloud-ru/package');
174
+ });
175
+ });
176
+ });
@@ -0,0 +1,11 @@
1
+ import { Results } from 'depcheck';
2
+ export type CheckState = Partial<Pick<Results, 'dependencies' | 'missing'> & {
3
+ wrongVersions: string[];
4
+ internalAsDev: string[];
5
+ }>;
6
+ export declare class Report {
7
+ private storage;
8
+ add(folder: string, state: CheckState): void;
9
+ printResultAndGetExitCode(): 1 | 0;
10
+ private printMessages;
11
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Report = void 0;
4
+ const console_1 = require("../utils/console");
5
+ class Report {
6
+ constructor() {
7
+ this.storage = {};
8
+ }
9
+ add(folder, state) {
10
+ if (this.storage[folder]) {
11
+ throw new Error(`There is check state in storage already for: ${folder}`);
12
+ }
13
+ this.storage[folder] = state;
14
+ }
15
+ printResultAndGetExitCode() {
16
+ let exitCode = 0;
17
+ for (const [packageName, { dependencies = [], internalAsDev = [], wrongVersions = [], missing = {} },] of Object.entries(this.storage)) {
18
+ const messages = [['info', 0, packageName]];
19
+ if (wrongVersions.length) {
20
+ messages.push(['error', 1, 'wrong version of internal packages:']);
21
+ wrongVersions.forEach(dep => messages.push(['error', 2, dep]));
22
+ }
23
+ if (internalAsDev.length) {
24
+ messages.push(['error', 1, 'incorrect usage as dev dep of internal packages:']);
25
+ internalAsDev.forEach(dep => messages.push(['error', 2, dep]));
26
+ }
27
+ if (dependencies.length) {
28
+ messages.push(['error', 1, 'unused dependencies:']);
29
+ dependencies.forEach(dep => messages.push(['error', 2, dep]));
30
+ }
31
+ const missingEntities = Object.entries(missing);
32
+ if (missingEntities.length) {
33
+ messages.push(['error', 1, 'missing dependencies:']);
34
+ for (const [packageName, files] of missingEntities) {
35
+ messages.push(['error', 2, packageName]);
36
+ for (const file of files) {
37
+ messages.push(['error', 2, file]);
38
+ }
39
+ }
40
+ }
41
+ if (messages.length > 1) {
42
+ exitCode = 1;
43
+ this.printMessages(messages);
44
+ }
45
+ }
46
+ return exitCode;
47
+ }
48
+ printMessages(messages) {
49
+ for (const [level, tabs, message] of messages) {
50
+ const log = level === 'info' ? console_1.logInfo : console_1.logError;
51
+ log(`${'\t'.repeat(tabs)}${message}`);
52
+ }
53
+ }
54
+ }
55
+ exports.Report = Report;
@@ -1,2 +1 @@
1
- #!/usr/bin/env node
2
1
  export {};
package/dist/cjs/index.js CHANGED
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  "use strict";
3
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -9,67 +8,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
10
9
  });
11
10
  };
12
- var __importDefault = (this && this.__importDefault) || function (mod) {
13
- return (mod && mod.__esModule) ? mod : { "default": mod };
14
- };
15
11
  Object.defineProperty(exports, "__esModule", { value: true });
16
- const depcheck_1 = __importDefault(require("depcheck"));
17
- const glob_1 = require("glob");
12
+ const Checker_1 = require("./Checker");
13
+ const Config_1 = require("./Config");
14
+ const RepoConfig_1 = require("./Config/RepoConfig");
18
15
  const console_1 = require("./utils/console");
19
- const getCliArguments_1 = require("./utils/getCliArguments");
20
- const getConfigFile_1 = require("./utils/getConfigFile");
21
- const initializeState_1 = require("./utils/initializeState");
16
+ const getEnvironment_1 = require("./utils/getEnvironment");
22
17
  (() => __awaiter(void 0, void 0, void 0, function* () {
23
18
  try {
24
- const args = (0, getCliArguments_1.getCliArguments)();
25
- const configFile = (0, getConfigFile_1.getConfigFile)(args.cwd);
26
- const config = configFile ? Object.assign(args, configFile) : args;
27
- const options = {
28
- ignoreBinPackage: false,
29
- skipMissing: false,
30
- ignorePatterns: config.ignorePatterns.map(pattern => pattern.toString()),
31
- ignoreMatches: config.ignoreMatches.map(match => match.toString()),
32
- };
33
- const folders = (0, glob_1.globSync)(config.rootPackagesFolderPattern, {
34
- ignore: config.ignoredPackagesFolderFiles.map(path => path.toString()),
35
- });
36
- const state = (0, initializeState_1.initializeState)({
37
- cwd: args.cwd,
38
- folders,
39
- prefix: config.prefix,
40
- });
41
- for (const folder of folders) {
42
- const { dependencies, missing: missingDepsPerPackage } = yield (0, depcheck_1.default)(folder, options);
43
- state.unusedDeps.push(...dependencies.map(x => `${folder}: ${x}`));
44
- if (Object.keys(missingDepsPerPackage).length) {
45
- state.missing.push(missingDepsPerPackage);
46
- }
47
- }
48
- if (Object.values(state).every(result => result.length < 1)) {
49
- (0, console_1.logInfo)('Dependencies have been checked. Everything is ok.');
50
- process.exit(0);
51
- return;
52
- }
53
- if (state.wrongVersions.length) {
54
- (0, console_1.logError)('You have to fix wrong version of internal packages:');
55
- state.wrongVersions.forEach(console_1.logDebug);
56
- }
57
- if (state.internalAsDev.length) {
58
- (0, console_1.logError)('You have to fix wrong usage of internal packages in dev dependencies (either delete them or move to dependencies):');
59
- state.internalAsDev.forEach(console_1.logDebug);
60
- }
61
- if (state.unusedDeps.length) {
62
- (0, console_1.logError)('You have to fix following unused dependencies:');
63
- state.unusedDeps.forEach(console_1.logDebug);
64
- }
65
- if (state.missing.length) {
66
- (0, console_1.logError)('You have to fix following missed dependencies:');
67
- state.missing.forEach(x => (0, console_1.logDebug)(JSON.stringify(x, null, 2)));
68
- }
69
- process.exit(1);
19
+ const env = (0, getEnvironment_1.getEnvironment)();
20
+ const checker = (0, getEnvironment_1.isMonorepoEnv)(env)
21
+ ? new Checker_1.MonorepoChecker(new Config_1.MonorepoConfig(env))
22
+ : new Checker_1.RepoChecker(new RepoConfig_1.RepoConfig(env));
23
+ const report = yield checker.check();
24
+ const exitCode = report.printResultAndGetExitCode();
25
+ process.exit(exitCode);
70
26
  }
71
- catch (err) {
72
- console.error(err);
27
+ catch (e) {
28
+ (0, console_1.logError)(`${e}`);
73
29
  process.exit(1);
74
30
  }
75
31
  }))();
@@ -1,12 +1,23 @@
1
- export type Config = {
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
- /** Monorepo prefix (if skipped will try to find automatically) */
7
- prefix?: string;
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,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const getCliArguments_1 = require("../getCliArguments");
5
+ (0, vitest_1.describe)('@cloud-ru/ft-deps-validator/getCliArguments', () => {
6
+ const originalArgv = process.argv;
7
+ (0, vitest_1.beforeEach)(() => {
8
+ process.argv = originalArgv;
9
+ vitest_1.vi.clearAllMocks();
10
+ });
11
+ (0, vitest_1.it)('should return empty object when no arguments provided', () => {
12
+ process.argv = ['node', 'script.js'];
13
+ const result = (0, getCliArguments_1.getCliArguments)();
14
+ (0, vitest_1.expect)(result.cwd).toBeUndefined();
15
+ (0, vitest_1.expect)(result.rootPackagesFolderPattern).toBeUndefined();
16
+ (0, vitest_1.expect)(result.ignoredPackagesFolderFiles).toBeUndefined();
17
+ (0, vitest_1.expect)(result.ignorePatterns).toBeUndefined();
18
+ (0, vitest_1.expect)(result.ignoreMatches).toBeUndefined();
19
+ });
20
+ (0, vitest_1.it)('should parse cwd option', () => {
21
+ const testCwd = '/test/directory';
22
+ process.argv = ['node', 'script.js', '--cwd', testCwd];
23
+ const result = (0, getCliArguments_1.getCliArguments)();
24
+ (0, vitest_1.expect)(result.cwd).toBe(testCwd);
25
+ });
26
+ (0, vitest_1.it)('should parse cwd option with alias -d', () => {
27
+ const testCwd = '/test/directory';
28
+ process.argv = ['node', 'script.js', '-d', testCwd];
29
+ const result = (0, getCliArguments_1.getCliArguments)();
30
+ (0, vitest_1.expect)(result.cwd).toBe(testCwd);
31
+ });
32
+ (0, vitest_1.it)('should parse rootPackagesFolderPattern option', () => {
33
+ const pattern = 'apps/*';
34
+ process.argv = ['node', 'script.js', '--rootPackagesFolderPattern', pattern];
35
+ const result = (0, getCliArguments_1.getCliArguments)();
36
+ (0, vitest_1.expect)(result.rootPackagesFolderPattern).toBe(pattern);
37
+ });
38
+ (0, vitest_1.it)('should parse rootPackagesFolderPattern option with alias -p', () => {
39
+ const pattern = 'apps/*';
40
+ process.argv = ['node', 'script.js', '-p', pattern];
41
+ const result = (0, getCliArguments_1.getCliArguments)();
42
+ (0, vitest_1.expect)(result.rootPackagesFolderPattern).toBe(pattern);
43
+ });
44
+ (0, vitest_1.it)('should parse ignoredPackagesFolderFiles option', () => {
45
+ const files = ['file1.json', 'file2.json'];
46
+ process.argv = ['node', 'script.js', '--ignoredPackagesFolderFiles', ...files];
47
+ const result = (0, getCliArguments_1.getCliArguments)();
48
+ (0, vitest_1.expect)(result.ignoredPackagesFolderFiles).toEqual(files);
49
+ });
50
+ (0, vitest_1.it)('should parse ignorePatterns option', () => {
51
+ const patterns = ['test', 'build'];
52
+ process.argv = ['node', 'script.js', '--ignorePatterns', ...patterns];
53
+ const result = (0, getCliArguments_1.getCliArguments)();
54
+ (0, vitest_1.expect)(result.ignorePatterns).toEqual(patterns);
55
+ });
56
+ (0, vitest_1.it)('should parse ignoreMatches option', () => {
57
+ const matches = ['package1', 'package2'];
58
+ process.argv = ['node', 'script.js', '--ignoreMatches', ...matches];
59
+ const result = (0, getCliArguments_1.getCliArguments)();
60
+ (0, vitest_1.expect)(result.ignoreMatches).toEqual(matches);
61
+ });
62
+ (0, vitest_1.it)('should parse multiple options together', () => {
63
+ const testCwd = '/test/directory';
64
+ const pattern = 'apps/*';
65
+ process.argv = ['node', 'script.js', '--cwd', testCwd, '--rootPackagesFolderPattern', pattern];
66
+ const result = (0, getCliArguments_1.getCliArguments)();
67
+ (0, vitest_1.expect)(result.cwd).toBe(testCwd);
68
+ (0, vitest_1.expect)(result.rootPackagesFolderPattern).toBe(pattern);
69
+ });
70
+ });
@@ -1,10 +1,10 @@
1
1
  export declare function getCliArguments(): {
2
- cwd: string;
3
- rootPackagesFolderPattern: string;
4
- ignoredPackagesFolderFiles: string[];
5
- prefix: string | undefined;
6
- ignorePatterns: string[] | (string | number)[];
7
- ignoreMatches: string[] | (string | number)[];
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
  };
@@ -4,49 +4,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getCliArguments = getCliArguments;
7
- const path_1 = __importDefault(require("path"));
8
7
  const yargs_1 = __importDefault(require("yargs"));
9
8
  function getCliArguments() {
10
- const parsed = (0, yargs_1.default)(process.argv.slice(2))
9
+ return (0, yargs_1.default)(process.argv.slice(2))
11
10
  .option('cwd', {
12
11
  alias: 'd',
13
12
  type: 'string',
14
- default: process.cwd(),
15
13
  description: 'working directory (default: current working directory, cwd)',
16
- })
17
- .option('prefix', {
18
- type: 'string',
19
- description: 'monorepo prefix (if skipped will try to find automatically)',
20
14
  })
21
15
  .option('rootPackagesFolderPattern', {
22
16
  alias: 'p',
23
17
  type: 'string',
24
- default: 'packages/*',
25
18
  description: 'folder containing packages (glob pattern, e.g., "packages/*" or "apps/*")',
26
19
  })
27
20
  .option('ignoredPackagesFolderFiles', {
28
21
  type: 'array',
29
- default: ['packages/tsconfig.cjs.json', 'packages/tsconfig.esm.json'],
30
22
  description: 'specify one or more paths that should be ignored in packages folder',
31
23
  })
32
24
  .option('ignorePatterns', {
33
25
  type: 'array',
34
- default: ['stories', 'dist', '__tests__', '__e2e__'],
35
26
  description: 'specify one or more directories names that should be ignored',
36
27
  })
37
28
  .option('ignoreMatches', {
38
29
  type: 'array',
39
- default: [
40
- 'react',
41
- 'react-dom',
42
- 'react-docgen-typescript',
43
- '@snack-uikit/figma-tokens',
44
- '@sbercloud/figma-tokens-cloud-platform',
45
- '@sbercloud/figma-tokens-mlspace',
46
- '@sbercloud/figma-tokens-admin',
47
- '@sbercloud/figma-tokens-web',
48
- '@sbercloud/figma-tokens-giga-id',
49
- ],
50
30
  description: 'specify one or more packages that should be ignored',
51
31
  })
52
32
  .locale('en')
@@ -54,10 +34,4 @@ function getCliArguments() {
54
34
  .alias('h', 'help')
55
35
  .alias('v', 'version')
56
36
  .parseSync();
57
- const cwd = path_1.default.resolve(parsed.cwd);
58
- const rootPackagesFolderPattern = path_1.default.resolve(cwd, parsed.rootPackagesFolderPattern);
59
- const ignoredPackagesFolderFiles = parsed.ignoredPackagesFolderFiles.map(file => path_1.default.resolve(cwd, file.toString()));
60
- return Object.assign(Object.assign({}, parsed), { cwd,
61
- rootPackagesFolderPattern,
62
- ignoredPackagesFolderFiles });
63
37
  }
@@ -1,3 +1,4 @@
1
- import { CliArguments } from '../types/cliArguments';
2
- import { Config } from '../types/config';
3
- export declare function getConfigFile(cwd: CliArguments['cwd']): Config | null;
1
+ import { RawMonorepoEnvType, RawRepoEnvType } from '../types';
2
+ type PossibleConfig = RawMonorepoEnvType & RawRepoEnvType;
3
+ export declare function getConfigFile(cwd: string): PossibleConfig;
4
+ export {};
@@ -10,14 +10,8 @@ const CONFIG_FILE_NAME = 'deps-validator.config.json';
10
10
  function getConfigFile(cwd) {
11
11
  const configPath = path_1.default.resolve(cwd, CONFIG_FILE_NAME);
12
12
  if (!fs_1.default.existsSync(configPath)) {
13
- return null;
14
- }
15
- try {
16
- const configContent = fs_1.default.readFileSync(configPath, 'utf-8');
17
- const config = JSON.parse(configContent);
18
- return config;
19
- }
20
- catch (_a) {
21
- return null;
13
+ return { packages: {} };
22
14
  }
15
+ const configContent = fs_1.default.readFileSync(configPath, 'utf-8');
16
+ return JSON.parse(configContent);
23
17
  }
@@ -0,0 +1,3 @@
1
+ import { MonorepoEnvType, RepoEnvType } from '../types';
2
+ export declare function getEnvironment(): MonorepoEnvType | RepoEnvType;
3
+ export declare const isMonorepoEnv: (env: MonorepoEnvType | RepoEnvType) => env is MonorepoEnvType;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isMonorepoEnv = void 0;
7
+ exports.getEnvironment = getEnvironment;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const getCliArguments_1 = require("./getCliArguments");
11
+ const getConfigFile_1 = require("./getConfigFile");
12
+ function getEnvironment() {
13
+ const defaultConfig = {
14
+ cwd: process.cwd(),
15
+ ignoredPackagesFolderFiles: ['packages/tsconfig.cjs.json', 'packages/tsconfig.esm.json'],
16
+ ignorePatterns: ['stories', 'dist', '__tests__', '__e2e__'],
17
+ ignoreMatches: [
18
+ 'react',
19
+ 'react-dom',
20
+ 'react-docgen-typescript',
21
+ '@snack-uikit/figma-tokens',
22
+ '@sbercloud/figma-tokens-cloud-platform',
23
+ '@sbercloud/figma-tokens-mlspace',
24
+ '@sbercloud/figma-tokens-admin',
25
+ '@sbercloud/figma-tokens-web',
26
+ '@sbercloud/figma-tokens-giga-id',
27
+ ],
28
+ };
29
+ const configFile = (0, getConfigFile_1.getConfigFile)(defaultConfig.cwd);
30
+ const configArguments = (0, getCliArguments_1.getCliArguments)();
31
+ const rootIsNotPassed = !configFile.rootPackagesFolderPattern && !configArguments.ignoredPackagesFolderFiles;
32
+ const rawConfig = Object.assign(defaultConfig,
33
+ /* конфиг файл имеет меньший приоритет перед cli-аргументами */
34
+ configFile, configArguments);
35
+ if (rootIsNotPassed) {
36
+ /*
37
+ Если папку не передали в конфиге, то проверим на наличие папки сами,
38
+ если она есть, то считаем что это монорепа
39
+ */
40
+ if (node_fs_1.default.existsSync(node_path_1.default.resolve(defaultConfig.cwd, './packages'))) {
41
+ rawConfig.rootPackagesFolderPattern = 'packages/*';
42
+ }
43
+ else {
44
+ delete rawConfig.rootPackagesFolderPattern;
45
+ }
46
+ }
47
+ return rawConfig;
48
+ }
49
+ const isMonorepoEnv = (env) => Boolean('rootPackagesFolderPattern' in env);
50
+ exports.isMonorepoEnv = isMonorepoEnv;
@@ -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,28 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.readPackageJsonFileSync = exports.readPackageJsonFile = void 0;
16
+ const node_fs_1 = __importDefault(require("node:fs"));
17
+ const promises_1 = __importDefault(require("node:fs/promises"));
18
+ const node_path_1 = __importDefault(require("node:path"));
19
+ const readPackageJsonFile = (folder) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const file = yield promises_1.default.readFile(node_path_1.default.relative(folder, './package.json'), 'utf8');
21
+ return JSON.parse(file);
22
+ });
23
+ exports.readPackageJsonFile = readPackageJsonFile;
24
+ const readPackageJsonFileSync = (folder) => {
25
+ const file = node_fs_1.default.readFileSync(node_path_1.default.resolve(folder, './package.json'), 'utf8');
26
+ return JSON.parse(file);
27
+ };
28
+ exports.readPackageJsonFileSync = readPackageJsonFileSync;
@@ -0,0 +1,10 @@
1
+ import { MonorepoConfig } from '../Config';
2
+ import { RepoChecker } from './RepoChecker';
3
+ export declare class MonorepoChecker extends RepoChecker {
4
+ private actualVersions;
5
+ constructor(config: MonorepoConfig);
6
+ protected checkFolder(path: string): Promise<Partial<Pick<import("depcheck").Results, "dependencies" | "missing"> & {
7
+ wrongVersions: string[];
8
+ internalAsDev: string[];
9
+ }>>;
10
+ }