@xylabs/ts-scripts-yarn3 6.5.0 → 6.5.2
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/dist/actions/deplint/checkPackage/checkPackage.mjs +260 -0
- package/dist/actions/deplint/checkPackage/checkPackage.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs +1 -0
- package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getTypesInDependencies.mjs +19 -0
- package/dist/actions/deplint/checkPackage/getTypesInDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs +35 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs +21 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs +22 -0
- package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs +19 -0
- package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/index.mjs +260 -0
- package/dist/actions/deplint/checkPackage/index.mjs.map +1 -0
- package/dist/actions/deplint/deplint.mjs +320 -0
- package/dist/actions/deplint/deplint.mjs.map +1 -0
- package/dist/actions/deplint/findFiles.mjs +24 -0
- package/dist/actions/deplint/findFiles.mjs.map +1 -0
- package/dist/actions/deplint/findFilesByGlob.mjs +9 -0
- package/dist/actions/deplint/findFilesByGlob.mjs.map +1 -0
- package/dist/actions/deplint/getBasePackageName.mjs +12 -0
- package/dist/actions/deplint/getBasePackageName.mjs.map +1 -0
- package/dist/actions/deplint/getDependenciesFromPackageJson.mjs +20 -0
- package/dist/actions/deplint/getDependenciesFromPackageJson.mjs.map +1 -0
- package/dist/actions/deplint/getExternalImportsFromFiles.mjs +98 -0
- package/dist/actions/deplint/getExternalImportsFromFiles.mjs.map +1 -0
- package/dist/actions/deplint/getImportsFromFile.mjs +65 -0
- package/dist/actions/deplint/getImportsFromFile.mjs.map +1 -0
- package/dist/actions/{deplint.mjs → deplint/index.mjs} +165 -88
- package/dist/actions/deplint/index.mjs.map +1 -0
- package/dist/actions/fix.mjs.map +1 -1
- package/dist/actions/index.mjs +240 -161
- package/dist/actions/index.mjs.map +1 -1
- package/dist/actions/lint.mjs.map +1 -1
- package/dist/bin/xy.mjs +244 -156
- package/dist/bin/xy.mjs.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.mjs +287 -199
- package/dist/index.mjs.map +1 -1
- package/dist/xy/index.mjs +244 -156
- package/dist/xy/index.mjs.map +1 -1
- package/dist/xy/param.mjs +1 -1
- package/dist/xy/param.mjs.map +1 -1
- package/dist/xy/xy.mjs +244 -156
- package/dist/xy/xy.mjs.map +1 -1
- package/dist/xy/xyCommonCommands.mjs +1 -1
- package/dist/xy/xyCommonCommands.mjs.map +1 -1
- package/dist/xy/xyLintCommands.mjs +217 -108
- package/dist/xy/xyLintCommands.mjs.map +1 -1
- package/dist/xy/xyParseOptions.mjs +0 -21
- package/dist/xy/xyParseOptions.mjs.map +1 -1
- package/package.json +3 -3
- package/dist/actions/deplint.mjs.map +0 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
// src/actions/deplint/findFilesByGlob.ts
|
|
2
|
+
import { globSync } from "glob";
|
|
3
|
+
function findFilesByGlob(cwd, pattern) {
|
|
4
|
+
return globSync(pattern, { cwd, absolute: true });
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// src/actions/deplint/findFiles.ts
|
|
8
|
+
function findFiles(path3) {
|
|
9
|
+
const allSourceInclude = ["./src/**/*.{ts,tsx}", "./dist/**/*.d.ts"];
|
|
10
|
+
const prodExcludeEndswith = [".spec.ts", ".stories.tsx"];
|
|
11
|
+
const prodExcludeIncludes = ["/spec/", "/stories/", "/scripts/"];
|
|
12
|
+
const allSourceFiles = allSourceInclude.flatMap((pattern) => findFilesByGlob(path3, pattern));
|
|
13
|
+
const prodSourceFiles = allSourceFiles.filter((file) => !prodExcludeEndswith.some((ext) => file.endsWith(ext)) && !prodExcludeIncludes.some((excl) => file.includes(excl)));
|
|
14
|
+
const devSourceFiles = allSourceFiles.filter((file) => !prodSourceFiles.includes(file));
|
|
15
|
+
return {
|
|
16
|
+
allSourceFiles,
|
|
17
|
+
prodSourceFiles,
|
|
18
|
+
devSourceFiles
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// src/actions/deplint/getDependenciesFromPackageJson.ts
|
|
23
|
+
import fs from "node:fs";
|
|
24
|
+
import path from "node:path";
|
|
25
|
+
function getDependenciesFromPackageJson(packageJsonPath) {
|
|
26
|
+
const packageJsonFullPath = path.resolve(packageJsonPath);
|
|
27
|
+
const rawContent = fs.readFileSync(packageJsonFullPath, "utf8");
|
|
28
|
+
const packageJson = JSON.parse(rawContent);
|
|
29
|
+
const dependencies = packageJson.dependencies ? Object.keys(packageJson.dependencies) : [];
|
|
30
|
+
const devDependencies = packageJson.devDependencies ? Object.keys(packageJson.devDependencies) : [];
|
|
31
|
+
const peerDependencies = packageJson.peerDependencies ? Object.keys(packageJson.peerDependencies) : [];
|
|
32
|
+
return {
|
|
33
|
+
dependencies,
|
|
34
|
+
devDependencies,
|
|
35
|
+
peerDependencies
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/actions/deplint/getImportsFromFile.ts
|
|
40
|
+
import fs2 from "node:fs";
|
|
41
|
+
import path2 from "node:path";
|
|
42
|
+
import ts from "typescript";
|
|
43
|
+
|
|
44
|
+
// src/actions/deplint/getBasePackageName.ts
|
|
45
|
+
function getBasePackageName(importName) {
|
|
46
|
+
if (importName.startsWith("@")) {
|
|
47
|
+
const parts = importName.split("/");
|
|
48
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importName;
|
|
49
|
+
}
|
|
50
|
+
return importName.split("/")[0];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/actions/deplint/getImportsFromFile.ts
|
|
54
|
+
function getImportsFromFile(filePath, importPaths, typeImportPaths) {
|
|
55
|
+
const sourceCode = fs2.readFileSync(filePath, "utf8");
|
|
56
|
+
const sourceFile = ts.createSourceFile(
|
|
57
|
+
path2.basename(filePath),
|
|
58
|
+
sourceCode,
|
|
59
|
+
ts.ScriptTarget.Latest,
|
|
60
|
+
true
|
|
61
|
+
);
|
|
62
|
+
const imports = [];
|
|
63
|
+
const typeImports = [];
|
|
64
|
+
const isDeclarationFile = filePath.endsWith(".d.ts");
|
|
65
|
+
function visit(node) {
|
|
66
|
+
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
|
|
67
|
+
const moduleSpecifier = node.moduleSpecifier?.getFullText();
|
|
68
|
+
const isTypeImport = ts.isImportDeclaration(node) ? node.importClause?.isTypeOnly ?? false : false;
|
|
69
|
+
if (moduleSpecifier) {
|
|
70
|
+
const trimmed = moduleSpecifier.split("'").at(1) ?? moduleSpecifier;
|
|
71
|
+
if (isTypeImport && !isDeclarationFile) {
|
|
72
|
+
typeImports.push(trimmed);
|
|
73
|
+
} else {
|
|
74
|
+
imports.push(trimmed);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
} else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
|
78
|
+
const [arg] = node.arguments;
|
|
79
|
+
if (ts.isStringLiteral(arg)) {
|
|
80
|
+
const trimmed = arg.text;
|
|
81
|
+
imports.push(trimmed);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
ts.forEachChild(node, visit);
|
|
85
|
+
}
|
|
86
|
+
visit(sourceFile);
|
|
87
|
+
const importsStartsWithExcludes = [".", "#", "node:"];
|
|
88
|
+
const cleanedImports = imports.filter((imp) => !importsStartsWithExcludes.some((exc) => imp.startsWith(exc))).map(getBasePackageName);
|
|
89
|
+
const cleanedTypeImports = typeImports.filter((imp) => !importsStartsWithExcludes.some((exc) => imp.startsWith(exc))).map(getBasePackageName);
|
|
90
|
+
for (const imp of cleanedImports) {
|
|
91
|
+
importPaths[imp] = importPaths[imp] || [];
|
|
92
|
+
importPaths[imp].push(filePath);
|
|
93
|
+
}
|
|
94
|
+
for (const imp of cleanedTypeImports) {
|
|
95
|
+
typeImportPaths[imp] = typeImportPaths[imp] || [];
|
|
96
|
+
typeImportPaths[imp].push(filePath);
|
|
97
|
+
}
|
|
98
|
+
return [cleanedImports, cleanedTypeImports];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// src/actions/deplint/getExternalImportsFromFiles.ts
|
|
102
|
+
var internalImportPrefixes = [".", "#", "node:"];
|
|
103
|
+
var removeInternalImports = (imports) => {
|
|
104
|
+
return imports.filter((imp) => !internalImportPrefixes.some((prefix) => imp.startsWith(prefix)));
|
|
105
|
+
};
|
|
106
|
+
function getExternalImportsFromFiles({ prodSourceFiles, devSourceFiles }) {
|
|
107
|
+
const prodImportPaths = {};
|
|
108
|
+
const prodTypeImportPaths = {};
|
|
109
|
+
const prodImportPairs = prodSourceFiles.map((path3) => getImportsFromFile(path3, prodImportPaths, prodTypeImportPaths));
|
|
110
|
+
const prodImports = prodImportPairs.flatMap((pair) => pair[0]);
|
|
111
|
+
const prodTypeImports = prodImportPairs.flatMap((pair) => pair[1]);
|
|
112
|
+
const devImportPaths = {};
|
|
113
|
+
const devTypeImportPaths = {};
|
|
114
|
+
const devImportPairs = devSourceFiles.map((path3) => getImportsFromFile(path3, devImportPaths, devTypeImportPaths));
|
|
115
|
+
const devImports = devImportPairs.flatMap((pair) => pair[0]);
|
|
116
|
+
const devTypeImports = devImportPairs.flatMap((pair) => pair[1]);
|
|
117
|
+
const externalProdImports = removeInternalImports(prodImports);
|
|
118
|
+
const externalProdTypeImports = removeInternalImports(prodTypeImports);
|
|
119
|
+
const externalDevImports = removeInternalImports(devImports);
|
|
120
|
+
return {
|
|
121
|
+
prodImports,
|
|
122
|
+
devImports,
|
|
123
|
+
prodImportPaths,
|
|
124
|
+
prodTypeImportPaths,
|
|
125
|
+
devImportPaths,
|
|
126
|
+
externalProdImports,
|
|
127
|
+
externalDevImports,
|
|
128
|
+
prodTypeImports,
|
|
129
|
+
devTypeImports,
|
|
130
|
+
externalProdTypeImports
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// src/actions/deplint/checkPackage/getTypesInDependencies.ts
|
|
135
|
+
import chalk from "chalk";
|
|
136
|
+
function getTypesInDependencies({ name, location }, { dependencies }, {}) {
|
|
137
|
+
let typesInDependencies = 0;
|
|
138
|
+
for (const dep of dependencies) {
|
|
139
|
+
if (dep.startsWith("@types/")) {
|
|
140
|
+
typesInDependencies++;
|
|
141
|
+
console.log(`[${chalk.blue(name)}] @types in dependencies in package.json: ${chalk.red(dep)}`);
|
|
142
|
+
console.log(` ${location}/package.json
|
|
143
|
+
`);
|
|
144
|
+
console.log("");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return typesInDependencies;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// src/actions/deplint/checkPackage/getUnlistedDependencies.ts
|
|
151
|
+
import chalk2 from "chalk";
|
|
152
|
+
function getUnlistedDependencies({ name }, {
|
|
153
|
+
dependencies,
|
|
154
|
+
devDependencies,
|
|
155
|
+
peerDependencies
|
|
156
|
+
}, {
|
|
157
|
+
externalProdTypeImports,
|
|
158
|
+
prodTypeImportPaths,
|
|
159
|
+
externalProdImports,
|
|
160
|
+
prodImportPaths
|
|
161
|
+
}) {
|
|
162
|
+
let unlistedDependencies = 0;
|
|
163
|
+
for (const imp of externalProdTypeImports) {
|
|
164
|
+
if (!dependencies.includes(imp) && !peerDependencies.includes(imp) && !dependencies.includes(`@types/${imp}`) && !peerDependencies.includes(`@types/${imp}`)) {
|
|
165
|
+
unlistedDependencies++;
|
|
166
|
+
console.log(`[${chalk2.blue(name)}] Missing dependency in package.json: ${chalk2.red(imp)}`);
|
|
167
|
+
console.log(` ${prodTypeImportPaths[imp].join("\n")}`);
|
|
168
|
+
console.log("");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (const imp of externalProdImports) {
|
|
172
|
+
if (!dependencies.includes(imp) && !peerDependencies.includes(imp)) {
|
|
173
|
+
unlistedDependencies++;
|
|
174
|
+
console.log(`[${chalk2.blue(name)}] Missing dependency in package.json: ${chalk2.red(imp)}`);
|
|
175
|
+
console.log(` ${prodImportPaths[imp].join("\n")}`);
|
|
176
|
+
console.log("");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return unlistedDependencies;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts
|
|
183
|
+
import chalk3 from "chalk";
|
|
184
|
+
function getUnlistedDevDependencies({ name }, {
|
|
185
|
+
devDependencies,
|
|
186
|
+
dependencies,
|
|
187
|
+
peerDependencies
|
|
188
|
+
}, { devImportPaths, externalDevImports }) {
|
|
189
|
+
let unlistedDevDependencies = 0;
|
|
190
|
+
for (const imp of externalDevImports) {
|
|
191
|
+
if (!devDependencies.includes(imp) && !dependencies.includes(imp) && !peerDependencies.includes(imp)) {
|
|
192
|
+
unlistedDevDependencies++;
|
|
193
|
+
console.log(`[${chalk3.blue(name)}] Missing devDependency in package.json: ${chalk3.red(imp)}`);
|
|
194
|
+
console.log(` Found in: ${devImportPaths[imp].join(", ")}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return unlistedDevDependencies;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// src/actions/deplint/checkPackage/getUnusedDependencies.ts
|
|
201
|
+
import chalk4 from "chalk";
|
|
202
|
+
function getUnusedDependencies({ name, location }, { dependencies }, {
|
|
203
|
+
externalProdImports,
|
|
204
|
+
externalProdTypeImports
|
|
205
|
+
}) {
|
|
206
|
+
let unusedDependencies = 0;
|
|
207
|
+
for (const dep of dependencies) {
|
|
208
|
+
if (!externalProdImports.includes(dep) && !externalProdTypeImports.includes(dep)) {
|
|
209
|
+
unusedDependencies++;
|
|
210
|
+
console.log(`[${chalk4.blue(name)}] Unused dependency in package.json: ${chalk4.red(dep)}`);
|
|
211
|
+
console.log(` ${location}/package.json
|
|
212
|
+
`);
|
|
213
|
+
console.log("");
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return unusedDependencies;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts
|
|
220
|
+
import chalk5 from "chalk";
|
|
221
|
+
function getUnusedPeerDependencies({ name, location }, { peerDependencies }, { externalProdImports, externalProdTypeImports }) {
|
|
222
|
+
let unusedDependencies = 0;
|
|
223
|
+
for (const dep of peerDependencies) {
|
|
224
|
+
if (!externalProdImports.includes(dep) && !externalProdTypeImports.includes(dep)) {
|
|
225
|
+
unusedDependencies++;
|
|
226
|
+
console.log(`[${chalk5.blue(name)}] Unused peerDependency in package.json: ${chalk5.red(dep)}`);
|
|
227
|
+
console.log(` ${location}/package.json
|
|
228
|
+
`);
|
|
229
|
+
console.log("");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return unusedDependencies;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// src/actions/deplint/checkPackage/checkPackage.ts
|
|
236
|
+
function checkPackage({
|
|
237
|
+
name,
|
|
238
|
+
location,
|
|
239
|
+
deps = false,
|
|
240
|
+
devDeps = false,
|
|
241
|
+
peerDeps = false
|
|
242
|
+
}) {
|
|
243
|
+
const { prodSourceFiles, devSourceFiles } = findFiles(location);
|
|
244
|
+
const checkDeps = deps || !(deps || devDeps || peerDeps);
|
|
245
|
+
const checkDevDeps = devDeps || !(deps || devDeps || peerDeps);
|
|
246
|
+
const checkPeerDeps = peerDeps || !(deps || devDeps || peerDeps);
|
|
247
|
+
const sourceParams = getExternalImportsFromFiles({ prodSourceFiles, devSourceFiles });
|
|
248
|
+
const packageParams = getDependenciesFromPackageJson(`${location}/package.json`);
|
|
249
|
+
const unlistedDependencies = checkDeps ? getUnlistedDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
250
|
+
const unusedDependencies = checkDeps ? getUnusedDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
251
|
+
const typesInDependencies = checkDeps ? getTypesInDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
252
|
+
const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
253
|
+
const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
254
|
+
const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + typesInDependencies + unusedPeerDependencies;
|
|
255
|
+
return totalErrors;
|
|
256
|
+
}
|
|
257
|
+
export {
|
|
258
|
+
checkPackage
|
|
259
|
+
};
|
|
260
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/deplint/findFilesByGlob.ts","../../../../src/actions/deplint/findFiles.ts","../../../../src/actions/deplint/getDependenciesFromPackageJson.ts","../../../../src/actions/deplint/getImportsFromFile.ts","../../../../src/actions/deplint/getBasePackageName.ts","../../../../src/actions/deplint/getExternalImportsFromFiles.ts","../../../../src/actions/deplint/checkPackage/getTypesInDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnlistedDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts","../../../../src/actions/deplint/checkPackage/checkPackage.ts"],"sourcesContent":["import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string) {\n return globSync(pattern, { cwd, absolute: true })\n}\n","import { findFilesByGlob } from './findFilesByGlob.ts'\n\nexport function findFiles(path: string) {\n const allSourceInclude = ['./src/**/*.{ts,tsx}', './dist/**/*.d.ts']\n const prodExcludeEndswith = ['.spec.ts', '.stories.tsx']\n const prodExcludeIncludes = ['/spec/', '/stories/', '/scripts/']\n const allSourceFiles = allSourceInclude.flatMap(pattern => findFilesByGlob(path, pattern))\n\n const prodSourceFiles = allSourceFiles.filter(file => !prodExcludeEndswith.some(ext => file.endsWith(ext))\n && !prodExcludeIncludes.some(excl => file.includes(excl)))\n\n const devSourceFiles = allSourceFiles.filter(file => !prodSourceFiles.includes(file))\n return {\n allSourceFiles, prodSourceFiles, devSourceFiles,\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function getDependenciesFromPackageJson(packageJsonPath: string) {\n const packageJsonFullPath = path.resolve(packageJsonPath)\n const rawContent = fs.readFileSync(packageJsonFullPath, 'utf8')\n const packageJson = JSON.parse(rawContent)\n\n const dependencies = packageJson.dependencies\n ? Object.keys(packageJson.dependencies)\n : []\n\n const devDependencies = packageJson.devDependencies\n ? Object.keys(packageJson.devDependencies)\n : []\n\n const peerDependencies = packageJson.peerDependencies\n ? Object.keys(packageJson.peerDependencies)\n : []\n\n return {\n dependencies, devDependencies, peerDependencies,\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport ts from 'typescript'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nexport function getImportsFromFile(filePath: string, importPaths: Record<string, string[]>, typeImportPaths: Record<string, string[]>) {\n const sourceCode = fs.readFileSync(filePath, 'utf8')\n\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n )\n\n const imports: string[] = []\n const typeImports: string[] = []\n\n const isDeclarationFile = filePath.endsWith('.d.ts')\n\n function visit(node: ts.Node) {\n if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {\n const moduleSpecifier = (node.moduleSpecifier)?.getFullText()\n const isTypeImport = ts.isImportDeclaration(node) ? (node.importClause?.isTypeOnly ?? false) : false\n if (moduleSpecifier) {\n const trimmed = moduleSpecifier.split(\"'\").at(1) ?? moduleSpecifier\n // we are determining if the type import is being imported in an exported d.ts file\n if (isTypeImport && !isDeclarationFile) {\n typeImports.push(trimmed)\n } else {\n imports.push(trimmed)\n }\n }\n } else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {\n const [arg] = node.arguments\n if (ts.isStringLiteral(arg)) {\n const trimmed = arg.text\n imports.push(trimmed)\n }\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n const importsStartsWithExcludes = ['.', '#', 'node:']\n\n const cleanedImports = imports.filter(imp => !importsStartsWithExcludes.some(exc => imp.startsWith(exc))).map(getBasePackageName)\n const cleanedTypeImports = typeImports.filter(imp => !importsStartsWithExcludes.some(exc => imp.startsWith(exc))).map(getBasePackageName)\n\n for (const imp of cleanedImports) {\n importPaths[imp] = importPaths[imp] || []\n importPaths[imp].push(filePath)\n }\n\n for (const imp of cleanedTypeImports) {\n typeImportPaths[imp] = typeImportPaths[imp] || []\n typeImportPaths[imp].push(filePath)\n }\n\n return [cleanedImports, cleanedTypeImports]\n}\n","export function getBasePackageName(importName: string) {\n if (importName.startsWith('@')) {\n const parts = importName.split('/')\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importName\n }\n return importName.split('/')[0]\n}\n","import { getImportsFromFile } from './getImportsFromFile.ts'\n\nconst internalImportPrefixes = ['.', '#', 'node:']\n\nconst removeInternalImports = (imports: string[]) => {\n return imports.filter(imp => !internalImportPrefixes.some(prefix => imp.startsWith(prefix)))\n}\n\nexport function getExternalImportsFromFiles({ prodSourceFiles, devSourceFiles }: { devSourceFiles: string[]; prodSourceFiles: string[] }) {\n const prodImportPaths: Record<string, string[]> = {}\n const prodTypeImportPaths: Record<string, string[]> = {}\n const prodImportPairs = prodSourceFiles.map(path => getImportsFromFile(path, prodImportPaths, prodTypeImportPaths))\n const prodImports = prodImportPairs.flatMap(pair => pair[0])\n const prodTypeImports = prodImportPairs.flatMap(pair => pair[1])\n\n const devImportPaths: Record<string, string[]> = {}\n const devTypeImportPaths: Record<string, string[]> = {}\n const devImportPairs = devSourceFiles.map(path => getImportsFromFile(path, devImportPaths, devTypeImportPaths))\n const devImports = devImportPairs.flatMap(pair => pair[0])\n const devTypeImports = devImportPairs.flatMap(pair => pair[1])\n\n const externalProdImports = removeInternalImports(prodImports)\n const externalProdTypeImports = removeInternalImports(prodTypeImports)\n const externalDevImports = removeInternalImports(devImports)\n return {\n prodImports,\n devImports,\n prodImportPaths,\n prodTypeImportPaths,\n devImportPaths,\n externalProdImports,\n externalDevImports,\n prodTypeImports,\n devTypeImports,\n externalProdTypeImports,\n }\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getTypesInDependencies({ name, location }: Workspace, { dependencies }: CheckPackageParams, {}: CheckSourceParams) {\n let typesInDependencies = 0\n for (const dep of dependencies) {\n if (dep.startsWith('@types/')) {\n typesInDependencies++\n console.log(`[${chalk.blue(name)}] @types in dependencies in package.json: ${chalk.red(dep)}`)\n console.log(` ${location}/package.json\\n`)\n console.log('')\n }\n }\n return typesInDependencies\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getUnlistedDependencies({ name }: Workspace, {\n dependencies, devDependencies, peerDependencies,\n}: CheckPackageParams, {\n externalProdTypeImports, prodTypeImportPaths, externalProdImports, prodImportPaths,\n}: CheckSourceParams) {\n let unlistedDependencies = 0\n\n // check production type imports\n for (const imp of externalProdTypeImports) {\n if (!dependencies.includes(imp) && !peerDependencies.includes(imp) && !dependencies.includes(`@types/${imp}`)\n && !peerDependencies.includes(`@types/${imp}`)) {\n unlistedDependencies++\n console.log(`[${chalk.blue(name)}] Missing dependency in package.json: ${chalk.red(imp)}`)\n console.log(` ${prodTypeImportPaths[imp].join('\\n')}`)\n console.log('')\n }\n }\n\n // check production imports\n for (const imp of externalProdImports) {\n if (!dependencies.includes(imp) && !peerDependencies.includes(imp)) {\n unlistedDependencies++\n console.log(`[${chalk.blue(name)}] Missing dependency in package.json: ${chalk.red(imp)}`)\n console.log(` ${prodImportPaths[imp].join('\\n')}`)\n console.log('')\n }\n }\n return unlistedDependencies\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getUnlistedDevDependencies(\n { name }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n { devImportPaths, externalDevImports }: CheckSourceParams,\n) {\n let unlistedDevDependencies = 0\n for (const imp of externalDevImports) {\n if (!devDependencies.includes(imp) && !dependencies.includes(imp) && !peerDependencies.includes(imp)) {\n unlistedDevDependencies++\n console.log(`[${chalk.blue(name)}] Missing devDependency in package.json: ${chalk.red(imp)}`)\n console.log(` Found in: ${devImportPaths[imp].join(', ')}`)\n }\n }\n return unlistedDevDependencies\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getUnusedDependencies(\n { name, location }: Workspace,\n { dependencies }: CheckPackageParams,\n {\n externalProdImports,\n externalProdTypeImports,\n }: CheckSourceParams,\n) {\n let unusedDependencies = 0\n for (const dep of dependencies) {\n if (!externalProdImports.includes(dep) && !externalProdTypeImports.includes(dep)) {\n unusedDependencies++\n console.log(`[${chalk.blue(name)}] Unused dependency in package.json: ${chalk.red(dep)}`)\n console.log(` ${location}/package.json\\n`)\n console.log('')\n }\n }\n return unusedDependencies\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getUnusedPeerDependencies(\n { name, location }: Workspace,\n { peerDependencies }: CheckPackageParams,\n { externalProdImports, externalProdTypeImports }: CheckSourceParams,\n) {\n let unusedDependencies = 0\n for (const dep of peerDependencies) {\n if (!externalProdImports.includes(dep) && !externalProdTypeImports.includes(dep)) {\n unusedDependencies++\n console.log(`[${chalk.blue(name)}] Unused peerDependency in package.json: ${chalk.red(dep)}`)\n console.log(` ${location}/package.json\\n`)\n console.log('')\n }\n }\n return unusedDependencies\n}\n","import type { Workspace } from '../../../lib/index.ts'\nimport { findFiles } from '../findFiles.ts'\nimport { getDependenciesFromPackageJson } from '../getDependenciesFromPackageJson.ts'\nimport { getExternalImportsFromFiles } from '../getExternalImportsFromFiles.ts'\nimport { getTypesInDependencies } from './getTypesInDependencies.ts'\nimport { getUnlistedDependencies } from './getUnlistedDependencies.ts'\nimport { getUnlistedDevDependencies } from './getUnlistedDevDependencies.ts'\nimport { getUnusedDependencies } from './getUnusedDependencies.ts'\nimport { getUnusedPeerDependencies } from './getUnusedPeerDependencies.ts'\n\nexport interface CheckPackageOptions extends Workspace {\n deps?: boolean\n devDeps?: boolean\n peerDeps?: boolean\n}\n\nexport function checkPackage({\n name, location, deps = false, devDeps = false, peerDeps = false,\n}: CheckPackageOptions) {\n const { prodSourceFiles, devSourceFiles } = findFiles(location)\n const checkDeps = deps || !(deps || devDeps || peerDeps)\n const checkDevDeps = devDeps || !(deps || devDeps || peerDeps)\n const checkPeerDeps = peerDeps || !(deps || devDeps || peerDeps)\n const sourceParams = getExternalImportsFromFiles({ prodSourceFiles, devSourceFiles })\n\n const packageParams = getDependenciesFromPackageJson(`${location}/package.json`)\n\n const unlistedDependencies = checkDeps ? getUnlistedDependencies({ name, location }, packageParams, sourceParams) : 0\n const unusedDependencies = checkDeps ? getUnusedDependencies({ name, location }, packageParams, sourceParams) : 0\n const typesInDependencies = checkDeps ? getTypesInDependencies({ name, location }, packageParams, sourceParams) : 0\n const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0\n const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams) : 0\n\n const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + typesInDependencies + unusedPeerDependencies\n\n return totalErrors\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","path","chalk","chalk","chalk","chalk"]}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// src/actions/deplint/deplint.ts
|
|
2
|
+
import chalk6 from "chalk";
|
|
3
|
+
|
|
4
|
+
// src/lib/yarn/workspace/yarnWorkspaces.ts
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
var yarnWorkspaces = () => {
|
|
7
|
+
const result = spawnSync("yarn", ["workspaces", "list", "--json", "--recursive"], { encoding: "utf8", shell: true });
|
|
8
|
+
if (result.error) {
|
|
9
|
+
throw result.error;
|
|
10
|
+
}
|
|
11
|
+
return result.stdout.toString().split("\n").slice(0, -1).map((item) => {
|
|
12
|
+
return JSON.parse(item);
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// src/lib/yarn/workspace/yarnWorkspace.ts
|
|
17
|
+
var yarnWorkspace = (pkg) => {
|
|
18
|
+
const workspace = yarnWorkspaces().find(({ name }) => name === pkg);
|
|
19
|
+
if (!workspace) throw new Error(`Workspace ${pkg} not found`);
|
|
20
|
+
return workspace;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// src/actions/deplint/findFilesByGlob.ts
|
|
24
|
+
import { globSync } from "glob";
|
|
25
|
+
function findFilesByGlob(cwd, pattern) {
|
|
26
|
+
return globSync(pattern, { cwd, absolute: true });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// src/actions/deplint/findFiles.ts
|
|
30
|
+
function findFiles(path3) {
|
|
31
|
+
const allSourceInclude = ["./src/**/*.{ts,tsx}", "./dist/**/*.d.ts"];
|
|
32
|
+
const prodExcludeEndswith = [".spec.ts", ".stories.tsx"];
|
|
33
|
+
const prodExcludeIncludes = ["/spec/", "/stories/", "/scripts/"];
|
|
34
|
+
const allSourceFiles = allSourceInclude.flatMap((pattern) => findFilesByGlob(path3, pattern));
|
|
35
|
+
const prodSourceFiles = allSourceFiles.filter((file) => !prodExcludeEndswith.some((ext) => file.endsWith(ext)) && !prodExcludeIncludes.some((excl) => file.includes(excl)));
|
|
36
|
+
const devSourceFiles = allSourceFiles.filter((file) => !prodSourceFiles.includes(file));
|
|
37
|
+
return {
|
|
38
|
+
allSourceFiles,
|
|
39
|
+
prodSourceFiles,
|
|
40
|
+
devSourceFiles
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// src/actions/deplint/getDependenciesFromPackageJson.ts
|
|
45
|
+
import fs from "node:fs";
|
|
46
|
+
import path from "node:path";
|
|
47
|
+
function getDependenciesFromPackageJson(packageJsonPath) {
|
|
48
|
+
const packageJsonFullPath = path.resolve(packageJsonPath);
|
|
49
|
+
const rawContent = fs.readFileSync(packageJsonFullPath, "utf8");
|
|
50
|
+
const packageJson = JSON.parse(rawContent);
|
|
51
|
+
const dependencies = packageJson.dependencies ? Object.keys(packageJson.dependencies) : [];
|
|
52
|
+
const devDependencies = packageJson.devDependencies ? Object.keys(packageJson.devDependencies) : [];
|
|
53
|
+
const peerDependencies = packageJson.peerDependencies ? Object.keys(packageJson.peerDependencies) : [];
|
|
54
|
+
return {
|
|
55
|
+
dependencies,
|
|
56
|
+
devDependencies,
|
|
57
|
+
peerDependencies
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// src/actions/deplint/getImportsFromFile.ts
|
|
62
|
+
import fs2 from "node:fs";
|
|
63
|
+
import path2 from "node:path";
|
|
64
|
+
import ts from "typescript";
|
|
65
|
+
|
|
66
|
+
// src/actions/deplint/getBasePackageName.ts
|
|
67
|
+
function getBasePackageName(importName) {
|
|
68
|
+
if (importName.startsWith("@")) {
|
|
69
|
+
const parts = importName.split("/");
|
|
70
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importName;
|
|
71
|
+
}
|
|
72
|
+
return importName.split("/")[0];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/actions/deplint/getImportsFromFile.ts
|
|
76
|
+
function getImportsFromFile(filePath, importPaths, typeImportPaths) {
|
|
77
|
+
const sourceCode = fs2.readFileSync(filePath, "utf8");
|
|
78
|
+
const sourceFile = ts.createSourceFile(
|
|
79
|
+
path2.basename(filePath),
|
|
80
|
+
sourceCode,
|
|
81
|
+
ts.ScriptTarget.Latest,
|
|
82
|
+
true
|
|
83
|
+
);
|
|
84
|
+
const imports = [];
|
|
85
|
+
const typeImports = [];
|
|
86
|
+
const isDeclarationFile = filePath.endsWith(".d.ts");
|
|
87
|
+
function visit(node) {
|
|
88
|
+
if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
|
|
89
|
+
const moduleSpecifier = node.moduleSpecifier?.getFullText();
|
|
90
|
+
const isTypeImport = ts.isImportDeclaration(node) ? node.importClause?.isTypeOnly ?? false : false;
|
|
91
|
+
if (moduleSpecifier) {
|
|
92
|
+
const trimmed = moduleSpecifier.split("'").at(1) ?? moduleSpecifier;
|
|
93
|
+
if (isTypeImport && !isDeclarationFile) {
|
|
94
|
+
typeImports.push(trimmed);
|
|
95
|
+
} else {
|
|
96
|
+
imports.push(trimmed);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
|
100
|
+
const [arg] = node.arguments;
|
|
101
|
+
if (ts.isStringLiteral(arg)) {
|
|
102
|
+
const trimmed = arg.text;
|
|
103
|
+
imports.push(trimmed);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
ts.forEachChild(node, visit);
|
|
107
|
+
}
|
|
108
|
+
visit(sourceFile);
|
|
109
|
+
const importsStartsWithExcludes = [".", "#", "node:"];
|
|
110
|
+
const cleanedImports = imports.filter((imp) => !importsStartsWithExcludes.some((exc) => imp.startsWith(exc))).map(getBasePackageName);
|
|
111
|
+
const cleanedTypeImports = typeImports.filter((imp) => !importsStartsWithExcludes.some((exc) => imp.startsWith(exc))).map(getBasePackageName);
|
|
112
|
+
for (const imp of cleanedImports) {
|
|
113
|
+
importPaths[imp] = importPaths[imp] || [];
|
|
114
|
+
importPaths[imp].push(filePath);
|
|
115
|
+
}
|
|
116
|
+
for (const imp of cleanedTypeImports) {
|
|
117
|
+
typeImportPaths[imp] = typeImportPaths[imp] || [];
|
|
118
|
+
typeImportPaths[imp].push(filePath);
|
|
119
|
+
}
|
|
120
|
+
return [cleanedImports, cleanedTypeImports];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/actions/deplint/getExternalImportsFromFiles.ts
|
|
124
|
+
var internalImportPrefixes = [".", "#", "node:"];
|
|
125
|
+
var removeInternalImports = (imports) => {
|
|
126
|
+
return imports.filter((imp) => !internalImportPrefixes.some((prefix) => imp.startsWith(prefix)));
|
|
127
|
+
};
|
|
128
|
+
function getExternalImportsFromFiles({ prodSourceFiles, devSourceFiles }) {
|
|
129
|
+
const prodImportPaths = {};
|
|
130
|
+
const prodTypeImportPaths = {};
|
|
131
|
+
const prodImportPairs = prodSourceFiles.map((path3) => getImportsFromFile(path3, prodImportPaths, prodTypeImportPaths));
|
|
132
|
+
const prodImports = prodImportPairs.flatMap((pair) => pair[0]);
|
|
133
|
+
const prodTypeImports = prodImportPairs.flatMap((pair) => pair[1]);
|
|
134
|
+
const devImportPaths = {};
|
|
135
|
+
const devTypeImportPaths = {};
|
|
136
|
+
const devImportPairs = devSourceFiles.map((path3) => getImportsFromFile(path3, devImportPaths, devTypeImportPaths));
|
|
137
|
+
const devImports = devImportPairs.flatMap((pair) => pair[0]);
|
|
138
|
+
const devTypeImports = devImportPairs.flatMap((pair) => pair[1]);
|
|
139
|
+
const externalProdImports = removeInternalImports(prodImports);
|
|
140
|
+
const externalProdTypeImports = removeInternalImports(prodTypeImports);
|
|
141
|
+
const externalDevImports = removeInternalImports(devImports);
|
|
142
|
+
return {
|
|
143
|
+
prodImports,
|
|
144
|
+
devImports,
|
|
145
|
+
prodImportPaths,
|
|
146
|
+
prodTypeImportPaths,
|
|
147
|
+
devImportPaths,
|
|
148
|
+
externalProdImports,
|
|
149
|
+
externalDevImports,
|
|
150
|
+
prodTypeImports,
|
|
151
|
+
devTypeImports,
|
|
152
|
+
externalProdTypeImports
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// src/actions/deplint/checkPackage/getTypesInDependencies.ts
|
|
157
|
+
import chalk from "chalk";
|
|
158
|
+
function getTypesInDependencies({ name, location }, { dependencies }, {}) {
|
|
159
|
+
let typesInDependencies = 0;
|
|
160
|
+
for (const dep of dependencies) {
|
|
161
|
+
if (dep.startsWith("@types/")) {
|
|
162
|
+
typesInDependencies++;
|
|
163
|
+
console.log(`[${chalk.blue(name)}] @types in dependencies in package.json: ${chalk.red(dep)}`);
|
|
164
|
+
console.log(` ${location}/package.json
|
|
165
|
+
`);
|
|
166
|
+
console.log("");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return typesInDependencies;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/actions/deplint/checkPackage/getUnlistedDependencies.ts
|
|
173
|
+
import chalk2 from "chalk";
|
|
174
|
+
function getUnlistedDependencies({ name }, {
|
|
175
|
+
dependencies,
|
|
176
|
+
devDependencies,
|
|
177
|
+
peerDependencies
|
|
178
|
+
}, {
|
|
179
|
+
externalProdTypeImports,
|
|
180
|
+
prodTypeImportPaths,
|
|
181
|
+
externalProdImports,
|
|
182
|
+
prodImportPaths
|
|
183
|
+
}) {
|
|
184
|
+
let unlistedDependencies = 0;
|
|
185
|
+
for (const imp of externalProdTypeImports) {
|
|
186
|
+
if (!dependencies.includes(imp) && !peerDependencies.includes(imp) && !dependencies.includes(`@types/${imp}`) && !peerDependencies.includes(`@types/${imp}`)) {
|
|
187
|
+
unlistedDependencies++;
|
|
188
|
+
console.log(`[${chalk2.blue(name)}] Missing dependency in package.json: ${chalk2.red(imp)}`);
|
|
189
|
+
console.log(` ${prodTypeImportPaths[imp].join("\n")}`);
|
|
190
|
+
console.log("");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
for (const imp of externalProdImports) {
|
|
194
|
+
if (!dependencies.includes(imp) && !peerDependencies.includes(imp)) {
|
|
195
|
+
unlistedDependencies++;
|
|
196
|
+
console.log(`[${chalk2.blue(name)}] Missing dependency in package.json: ${chalk2.red(imp)}`);
|
|
197
|
+
console.log(` ${prodImportPaths[imp].join("\n")}`);
|
|
198
|
+
console.log("");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return unlistedDependencies;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts
|
|
205
|
+
import chalk3 from "chalk";
|
|
206
|
+
function getUnlistedDevDependencies({ name }, {
|
|
207
|
+
devDependencies,
|
|
208
|
+
dependencies,
|
|
209
|
+
peerDependencies
|
|
210
|
+
}, { devImportPaths, externalDevImports }) {
|
|
211
|
+
let unlistedDevDependencies = 0;
|
|
212
|
+
for (const imp of externalDevImports) {
|
|
213
|
+
if (!devDependencies.includes(imp) && !dependencies.includes(imp) && !peerDependencies.includes(imp)) {
|
|
214
|
+
unlistedDevDependencies++;
|
|
215
|
+
console.log(`[${chalk3.blue(name)}] Missing devDependency in package.json: ${chalk3.red(imp)}`);
|
|
216
|
+
console.log(` Found in: ${devImportPaths[imp].join(", ")}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return unlistedDevDependencies;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// src/actions/deplint/checkPackage/getUnusedDependencies.ts
|
|
223
|
+
import chalk4 from "chalk";
|
|
224
|
+
function getUnusedDependencies({ name, location }, { dependencies }, {
|
|
225
|
+
externalProdImports,
|
|
226
|
+
externalProdTypeImports
|
|
227
|
+
}) {
|
|
228
|
+
let unusedDependencies = 0;
|
|
229
|
+
for (const dep of dependencies) {
|
|
230
|
+
if (!externalProdImports.includes(dep) && !externalProdTypeImports.includes(dep)) {
|
|
231
|
+
unusedDependencies++;
|
|
232
|
+
console.log(`[${chalk4.blue(name)}] Unused dependency in package.json: ${chalk4.red(dep)}`);
|
|
233
|
+
console.log(` ${location}/package.json
|
|
234
|
+
`);
|
|
235
|
+
console.log("");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return unusedDependencies;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts
|
|
242
|
+
import chalk5 from "chalk";
|
|
243
|
+
function getUnusedPeerDependencies({ name, location }, { peerDependencies }, { externalProdImports, externalProdTypeImports }) {
|
|
244
|
+
let unusedDependencies = 0;
|
|
245
|
+
for (const dep of peerDependencies) {
|
|
246
|
+
if (!externalProdImports.includes(dep) && !externalProdTypeImports.includes(dep)) {
|
|
247
|
+
unusedDependencies++;
|
|
248
|
+
console.log(`[${chalk5.blue(name)}] Unused peerDependency in package.json: ${chalk5.red(dep)}`);
|
|
249
|
+
console.log(` ${location}/package.json
|
|
250
|
+
`);
|
|
251
|
+
console.log("");
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return unusedDependencies;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// src/actions/deplint/checkPackage/checkPackage.ts
|
|
258
|
+
function checkPackage({
|
|
259
|
+
name,
|
|
260
|
+
location,
|
|
261
|
+
deps = false,
|
|
262
|
+
devDeps = false,
|
|
263
|
+
peerDeps = false
|
|
264
|
+
}) {
|
|
265
|
+
const { prodSourceFiles, devSourceFiles } = findFiles(location);
|
|
266
|
+
const checkDeps = deps || !(deps || devDeps || peerDeps);
|
|
267
|
+
const checkDevDeps = devDeps || !(deps || devDeps || peerDeps);
|
|
268
|
+
const checkPeerDeps = peerDeps || !(deps || devDeps || peerDeps);
|
|
269
|
+
const sourceParams = getExternalImportsFromFiles({ prodSourceFiles, devSourceFiles });
|
|
270
|
+
const packageParams = getDependenciesFromPackageJson(`${location}/package.json`);
|
|
271
|
+
const unlistedDependencies = checkDeps ? getUnlistedDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
272
|
+
const unusedDependencies = checkDeps ? getUnusedDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
273
|
+
const typesInDependencies = checkDeps ? getTypesInDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
274
|
+
const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
275
|
+
const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams) : 0;
|
|
276
|
+
const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + typesInDependencies + unusedPeerDependencies;
|
|
277
|
+
return totalErrors;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// src/actions/deplint/deplint.ts
|
|
281
|
+
var deplint = ({
|
|
282
|
+
pkg,
|
|
283
|
+
deps,
|
|
284
|
+
devDeps,
|
|
285
|
+
peerDeps
|
|
286
|
+
}) => {
|
|
287
|
+
if (pkg) {
|
|
288
|
+
const { location, name } = yarnWorkspace(pkg);
|
|
289
|
+
console.log(`Running Deplint for ${name}`);
|
|
290
|
+
checkPackage({
|
|
291
|
+
name,
|
|
292
|
+
location,
|
|
293
|
+
devDeps,
|
|
294
|
+
deps,
|
|
295
|
+
peerDeps
|
|
296
|
+
});
|
|
297
|
+
} else {
|
|
298
|
+
const workspaces = yarnWorkspaces();
|
|
299
|
+
console.log("Deplint Started...");
|
|
300
|
+
let totalErrors = 0;
|
|
301
|
+
for (const workspace of workspaces) {
|
|
302
|
+
totalErrors += checkPackage({
|
|
303
|
+
...workspace,
|
|
304
|
+
deps,
|
|
305
|
+
devDeps,
|
|
306
|
+
peerDeps
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
if (totalErrors > 0) {
|
|
310
|
+
console.log(`Deplint: Found ${chalk6.red(totalErrors)} dependency problems. ${chalk6.red("\u2716")}`);
|
|
311
|
+
} else {
|
|
312
|
+
console.log(`Deplint: Found no dependency problems. ${chalk6.green("\u2714")}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return 0;
|
|
316
|
+
};
|
|
317
|
+
export {
|
|
318
|
+
deplint
|
|
319
|
+
};
|
|
320
|
+
//# sourceMappingURL=deplint.mjs.map
|