@xylabs/ts-scripts-yarn3 3.2.39 → 3.2.41
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.
|
@@ -34,6 +34,7 @@ module.exports = __toCommonJS(deps_exports);
|
|
|
34
34
|
var import_chalk = __toESM(require("chalk"));
|
|
35
35
|
var import_depcheck = __toESM(require("depcheck"));
|
|
36
36
|
var import_fs = require("fs");
|
|
37
|
+
var import_process = require("process");
|
|
37
38
|
var import_lib = require("../../lib");
|
|
38
39
|
const defaultIgnorePatterns = ["*.d.ts", "dist", ".*", "node_modules"];
|
|
39
40
|
const defaultIgnoreDevDeps = [
|
|
@@ -62,18 +63,8 @@ const reportMissing = (name, missing) => {
|
|
|
62
63
|
console.log(import_chalk.default.yellow(message.join("\n")));
|
|
63
64
|
}
|
|
64
65
|
};
|
|
65
|
-
const
|
|
66
|
-
const pkg = process.env.INIT_CWD;
|
|
67
|
-
const pkgName = process.env.npm_package_name;
|
|
66
|
+
const analyzeDeps = async (pkg, ignoreMatches) => {
|
|
68
67
|
const packageContent = (0, import_fs.existsSync)(`${pkg}/package.json`) ? JSON.parse((0, import_fs.readFileSync)(`${pkg}/package.json`, { encoding: "utf8" })) : void 0;
|
|
69
|
-
const rawIgnore = (0, import_fs.existsSync)(`${pkg}/.depcheckrc`) ? (0, import_fs.readFileSync)(`${pkg}/.depcheckrc`, { encoding: "utf8" }).replace("ignores:", '"ignores":') : void 0;
|
|
70
|
-
let ignoreMatches = [];
|
|
71
|
-
try {
|
|
72
|
-
ignoreMatches = rawIgnore ? JSON.parse(`{${rawIgnore}}`).ignores : [];
|
|
73
|
-
} catch (ex) {
|
|
74
|
-
const error = ex;
|
|
75
|
-
console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`);
|
|
76
|
-
}
|
|
77
68
|
const [srcUnused, allUnused] = await Promise.all([
|
|
78
69
|
(0, import_depcheck.default)(`${pkg}/src`, {
|
|
79
70
|
ignoreMatches,
|
|
@@ -91,7 +82,23 @@ const packageDeps = async () => {
|
|
|
91
82
|
const unusedDevDeps = allUnused.devDependencies;
|
|
92
83
|
const usedDeps = srcUnused.using;
|
|
93
84
|
const usedDevDeps = allUnused.using;
|
|
85
|
+
const missing = { ...srcUnused.missing, ...allUnused.missing };
|
|
94
86
|
const { invalidDirs, invalidFiles } = allUnused;
|
|
87
|
+
return { invalidDirs, invalidFiles, missing, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps };
|
|
88
|
+
};
|
|
89
|
+
const packageDeps = async () => {
|
|
90
|
+
const pkg = process.env.INIT_CWD ?? (0, import_process.cwd)();
|
|
91
|
+
const pkgName = process.env.npm_package_name;
|
|
92
|
+
const packageContent = (0, import_fs.existsSync)(`${pkg}/package.json`) ? JSON.parse((0, import_fs.readFileSync)(`${pkg}/package.json`, { encoding: "utf8" })) : void 0;
|
|
93
|
+
const rawIgnore = (0, import_fs.existsSync)(`${pkg}/.depcheckrc`) ? (0, import_fs.readFileSync)(`${pkg}/.depcheckrc`, { encoding: "utf8" }).replace("ignores:", '"ignores":') : void 0;
|
|
94
|
+
let ignoreMatches = [];
|
|
95
|
+
try {
|
|
96
|
+
ignoreMatches = rawIgnore ? JSON.parse(`{${rawIgnore}}`).ignores : [];
|
|
97
|
+
} catch (ex) {
|
|
98
|
+
const error = ex;
|
|
99
|
+
console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`);
|
|
100
|
+
}
|
|
101
|
+
const { invalidDirs, invalidFiles, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps, missing } = await analyzeDeps(pkg, ignoreMatches);
|
|
95
102
|
const declaredDeps = Object.keys(packageContent.dependencies ?? {});
|
|
96
103
|
const declaredPeerDeps = Object.keys(packageContent.peerDependencies ?? {});
|
|
97
104
|
const declaredDevDeps = Object.keys(packageContent.devDependencies ?? {});
|
|
@@ -101,14 +108,12 @@ const packageDeps = async () => {
|
|
|
101
108
|
const missingDevDeps = Object.keys(usedDevDeps).filter((key) => !declaredDevDeps.includes(key) && !declaredDeps.includes(key));
|
|
102
109
|
const missingDepsObject = {};
|
|
103
110
|
missingDeps.forEach((key) => {
|
|
104
|
-
|
|
105
|
-
missingDepsObject[key] = srcUnused.missing[key];
|
|
106
|
-
}
|
|
111
|
+
missingDepsObject[key] = missing[key] ?? [`devDep should be dep [${key}]`];
|
|
107
112
|
});
|
|
108
113
|
const missingDevDepsObject = {};
|
|
109
114
|
missingDevDeps.forEach((key) => {
|
|
110
|
-
if (
|
|
111
|
-
missingDevDepsObject[key] =
|
|
115
|
+
if (missing[key]) {
|
|
116
|
+
missingDevDepsObject[key] = missing[key];
|
|
112
117
|
}
|
|
113
118
|
});
|
|
114
119
|
const errorCounts = [
|
|
@@ -116,8 +121,8 @@ const packageDeps = async () => {
|
|
|
116
121
|
unusedDevDeps.length,
|
|
117
122
|
Object.entries(invalidDirs).length,
|
|
118
123
|
Object.entries(invalidFiles).length,
|
|
119
|
-
Object.entries(
|
|
120
|
-
Object.entries(
|
|
124
|
+
Object.entries(missingDepsObject).length,
|
|
125
|
+
Object.entries(missingDevDepsObject).length
|
|
121
126
|
];
|
|
122
127
|
const errorCount = errorCounts.reduce((prev, count) => prev + count, 0);
|
|
123
128
|
if (errorCount > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/package/deps.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport chalk from 'chalk'\nimport depcheck, { special } from 'depcheck'\nimport { existsSync, readFileSync } from 'fs'\n\nimport { checkResult } from '../../lib'\n\nconst defaultIgnorePatterns = ['*.d.ts', 'dist', '.*', 'node_modules']\nconst defaultIgnoreDevDeps = [\n '@xylabs/ts-scripts-yarn3',\n '@xylabs/tsconfig',\n '@xylabs/tsconfig-dom',\n '@xylabs/tsconfig-react',\n '@xylabs/tsconfig-jest',\n 'typescript',\n]\nconst defaultIgnoreDevPatterns = ['*.stories.*', '*.spec.*', 'spec', 'stories', 'tsconfig.json']\n\nconst reportUnused = (name: string, unused: depcheck.Results['dependencies']) => {\n if (unused.length) {\n const message = [chalk.yellow(`${unused.length} Unused ${name}`)]\n unused.forEach((value) => message.push(chalk.gray(` ${value}`)))\n console.log(message.join('\\n'))\n }\n}\n\nconst reportMissing = (name: string, missing: depcheck.Results['missing']) => {\n if (Object.keys(missing).length) {\n const message = [chalk.yellow(`${Object.entries(missing).length} Missing ${name}`)]\n Object.entries(missing).forEach(([key, value]) => {\n message.push(`${key}`)\n message.push(chalk.gray(` ${value.at(0)}`))\n })\n console.log(chalk.yellow(message.join('\\n')))\n }\n}\n\nexport const packageDeps = async () => {\n const pkg = process.env.INIT_CWD\n const pkgName = process.env.npm_package_name\n\n const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined\n\n const rawIgnore = existsSync(`${pkg}/.depcheckrc`)\n ? readFileSync(`${pkg}/.depcheckrc`, { encoding: 'utf8' }).replace('ignores:', '\"ignores\":')\n : undefined\n let ignoreMatches: string[] = []\n try {\n ignoreMatches = rawIgnore ? (JSON.parse(`{${rawIgnore}}`).ignores as string[]) : []\n } catch (ex) {\n const error = ex as Error\n console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`)\n }\n\n const
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/package/deps.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport chalk from 'chalk'\nimport depcheck, { special } from 'depcheck'\nimport { existsSync, readFileSync } from 'fs'\nimport { cwd } from 'process'\n\nimport { checkResult } from '../../lib'\n\nconst defaultIgnorePatterns = ['*.d.ts', 'dist', '.*', 'node_modules']\nconst defaultIgnoreDevDeps = [\n '@xylabs/ts-scripts-yarn3',\n '@xylabs/tsconfig',\n '@xylabs/tsconfig-dom',\n '@xylabs/tsconfig-react',\n '@xylabs/tsconfig-jest',\n 'typescript',\n]\nconst defaultIgnoreDevPatterns = ['*.stories.*', '*.spec.*', 'spec', 'stories', 'tsconfig.json']\n\nconst reportUnused = (name: string, unused: depcheck.Results['dependencies']) => {\n if (unused.length) {\n const message = [chalk.yellow(`${unused.length} Unused ${name}`)]\n unused.forEach((value) => message.push(chalk.gray(` ${value}`)))\n console.log(message.join('\\n'))\n }\n}\n\nconst reportMissing = (name: string, missing: depcheck.Results['missing']) => {\n if (Object.keys(missing).length) {\n const message = [chalk.yellow(`${Object.entries(missing).length} Missing ${name}`)]\n Object.entries(missing).forEach(([key, value]) => {\n message.push(`${key}`)\n message.push(chalk.gray(` ${value.at(0)}`))\n })\n console.log(chalk.yellow(message.join('\\n')))\n }\n}\n\nconst analyzeDeps = async (pkg: string, ignoreMatches: string[]) => {\n const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined\n const [srcUnused, allUnused] = await Promise.all([\n depcheck(`${pkg}/src`, {\n ignoreMatches,\n ignorePatterns: [...defaultIgnoreDevPatterns, ...defaultIgnorePatterns],\n package: packageContent,\n }),\n depcheck(`${pkg}/.`, {\n ignoreMatches: [...ignoreMatches, ...defaultIgnoreDevDeps],\n ignorePatterns: [...defaultIgnorePatterns],\n package: packageContent,\n specials: [special.eslint, special.babel, special.bin, special.prettier, special.jest, special.mocha],\n }),\n ])\n\n const unusedDeps = srcUnused.dependencies\n const unusedDevDeps = allUnused.devDependencies\n const usedDeps = srcUnused.using\n const usedDevDeps = allUnused.using\n const missing = { ...srcUnused.missing, ...allUnused.missing }\n const { invalidDirs, invalidFiles } = allUnused\n\n return { invalidDirs, invalidFiles, missing, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps }\n}\n\nexport const packageDeps = async () => {\n const pkg = process.env.INIT_CWD ?? cwd()\n const pkgName = process.env.npm_package_name\n\n const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined\n\n const rawIgnore = existsSync(`${pkg}/.depcheckrc`)\n ? readFileSync(`${pkg}/.depcheckrc`, { encoding: 'utf8' }).replace('ignores:', '\"ignores\":')\n : undefined\n let ignoreMatches: string[] = []\n try {\n ignoreMatches = rawIgnore ? (JSON.parse(`{${rawIgnore}}`).ignores as string[]) : []\n } catch (ex) {\n const error = ex as Error\n console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`)\n }\n\n const { invalidDirs, invalidFiles, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps, missing } = await analyzeDeps(pkg, ignoreMatches)\n\n const declaredDeps = Object.keys(packageContent.dependencies ?? {})\n const declaredPeerDeps = Object.keys(packageContent.peerDependencies ?? {})\n const declaredDevDeps = Object.keys(packageContent.devDependencies ?? {})\n\n const missingDeps = Object.keys(usedDeps).filter(\n (key) => !declaredDeps.includes(key) && !declaredPeerDeps.includes(key) && !key.startsWith('@types/'),\n )\n\n const missingDevDeps = Object.keys(usedDevDeps).filter((key) => !declaredDevDeps.includes(key) && !declaredDeps.includes(key))\n\n const missingDepsObject: Record<string, string[]> = {}\n missingDeps.forEach((key) => {\n missingDepsObject[key] = missing[key] ?? [`devDep should be dep [${key}]`]\n })\n\n const missingDevDepsObject: Record<string, string[]> = {}\n missingDevDeps.forEach((key) => {\n if (missing[key]) {\n missingDevDepsObject[key] = missing[key]\n }\n })\n\n const errorCounts = [\n unusedDeps.length,\n unusedDevDeps.length,\n Object.entries(invalidDirs).length,\n Object.entries(invalidFiles).length,\n Object.entries(missingDepsObject).length,\n Object.entries(missingDevDepsObject).length,\n ]\n\n const errorCount = errorCounts.reduce((prev, count) => prev + count, 0)\n\n if (errorCount > 0) {\n console.log(`Deps [${pkgName}] = (${JSON.stringify(errorCounts)})`)\n } else {\n console.log(`Deps [${pkgName}] - Ok`)\n }\n\n reportUnused('dependencies', unusedDeps)\n reportUnused('devDependencies', unusedDevDeps)\n\n if (Object.entries(invalidDirs).length) {\n Object.entries(invalidDirs).forEach(([key, value]) => console.warn(chalk.gray(`Invalid Dir: ${key}: ${value}`)))\n }\n\n if (Object.entries(invalidFiles).length) {\n Object.entries(invalidFiles).forEach(([key, value]) => console.warn(chalk.gray(`Invalid File: ${key}: ${value}`)))\n }\n\n reportMissing('dependencies', missingDepsObject)\n reportMissing('devDependencies', missingDevDepsObject)\n\n checkResult(`Deps [${pkgName}]`, errorCount, 'warn', false)\n\n //returning 0 here since we never want deps to be fatal\n return 0\n}\n"],"mappings":"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","names":["chalk","depcheck"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import depcheck, { special } from "depcheck";
|
|
3
3
|
import { existsSync, readFileSync } from "fs";
|
|
4
|
+
import { cwd } from "process";
|
|
4
5
|
import { checkResult } from "../../lib";
|
|
5
6
|
const defaultIgnorePatterns = ["*.d.ts", "dist", ".*", "node_modules"];
|
|
6
7
|
const defaultIgnoreDevDeps = [
|
|
@@ -29,18 +30,8 @@ const reportMissing = (name, missing) => {
|
|
|
29
30
|
console.log(chalk.yellow(message.join("\n")));
|
|
30
31
|
}
|
|
31
32
|
};
|
|
32
|
-
const
|
|
33
|
-
const pkg = process.env.INIT_CWD;
|
|
34
|
-
const pkgName = process.env.npm_package_name;
|
|
33
|
+
const analyzeDeps = async (pkg, ignoreMatches) => {
|
|
35
34
|
const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: "utf8" })) : void 0;
|
|
36
|
-
const rawIgnore = existsSync(`${pkg}/.depcheckrc`) ? readFileSync(`${pkg}/.depcheckrc`, { encoding: "utf8" }).replace("ignores:", '"ignores":') : void 0;
|
|
37
|
-
let ignoreMatches = [];
|
|
38
|
-
try {
|
|
39
|
-
ignoreMatches = rawIgnore ? JSON.parse(`{${rawIgnore}}`).ignores : [];
|
|
40
|
-
} catch (ex) {
|
|
41
|
-
const error = ex;
|
|
42
|
-
console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`);
|
|
43
|
-
}
|
|
44
35
|
const [srcUnused, allUnused] = await Promise.all([
|
|
45
36
|
depcheck(`${pkg}/src`, {
|
|
46
37
|
ignoreMatches,
|
|
@@ -58,7 +49,23 @@ const packageDeps = async () => {
|
|
|
58
49
|
const unusedDevDeps = allUnused.devDependencies;
|
|
59
50
|
const usedDeps = srcUnused.using;
|
|
60
51
|
const usedDevDeps = allUnused.using;
|
|
52
|
+
const missing = { ...srcUnused.missing, ...allUnused.missing };
|
|
61
53
|
const { invalidDirs, invalidFiles } = allUnused;
|
|
54
|
+
return { invalidDirs, invalidFiles, missing, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps };
|
|
55
|
+
};
|
|
56
|
+
const packageDeps = async () => {
|
|
57
|
+
const pkg = process.env.INIT_CWD ?? cwd();
|
|
58
|
+
const pkgName = process.env.npm_package_name;
|
|
59
|
+
const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: "utf8" })) : void 0;
|
|
60
|
+
const rawIgnore = existsSync(`${pkg}/.depcheckrc`) ? readFileSync(`${pkg}/.depcheckrc`, { encoding: "utf8" }).replace("ignores:", '"ignores":') : void 0;
|
|
61
|
+
let ignoreMatches = [];
|
|
62
|
+
try {
|
|
63
|
+
ignoreMatches = rawIgnore ? JSON.parse(`{${rawIgnore}}`).ignores : [];
|
|
64
|
+
} catch (ex) {
|
|
65
|
+
const error = ex;
|
|
66
|
+
console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`);
|
|
67
|
+
}
|
|
68
|
+
const { invalidDirs, invalidFiles, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps, missing } = await analyzeDeps(pkg, ignoreMatches);
|
|
62
69
|
const declaredDeps = Object.keys(packageContent.dependencies ?? {});
|
|
63
70
|
const declaredPeerDeps = Object.keys(packageContent.peerDependencies ?? {});
|
|
64
71
|
const declaredDevDeps = Object.keys(packageContent.devDependencies ?? {});
|
|
@@ -68,14 +75,12 @@ const packageDeps = async () => {
|
|
|
68
75
|
const missingDevDeps = Object.keys(usedDevDeps).filter((key) => !declaredDevDeps.includes(key) && !declaredDeps.includes(key));
|
|
69
76
|
const missingDepsObject = {};
|
|
70
77
|
missingDeps.forEach((key) => {
|
|
71
|
-
|
|
72
|
-
missingDepsObject[key] = srcUnused.missing[key];
|
|
73
|
-
}
|
|
78
|
+
missingDepsObject[key] = missing[key] ?? [`devDep should be dep [${key}]`];
|
|
74
79
|
});
|
|
75
80
|
const missingDevDepsObject = {};
|
|
76
81
|
missingDevDeps.forEach((key) => {
|
|
77
|
-
if (
|
|
78
|
-
missingDevDepsObject[key] =
|
|
82
|
+
if (missing[key]) {
|
|
83
|
+
missingDevDepsObject[key] = missing[key];
|
|
79
84
|
}
|
|
80
85
|
});
|
|
81
86
|
const errorCounts = [
|
|
@@ -83,8 +88,8 @@ const packageDeps = async () => {
|
|
|
83
88
|
unusedDevDeps.length,
|
|
84
89
|
Object.entries(invalidDirs).length,
|
|
85
90
|
Object.entries(invalidFiles).length,
|
|
86
|
-
Object.entries(
|
|
87
|
-
Object.entries(
|
|
91
|
+
Object.entries(missingDepsObject).length,
|
|
92
|
+
Object.entries(missingDevDepsObject).length
|
|
88
93
|
];
|
|
89
94
|
const errorCount = errorCounts.reduce((prev, count) => prev + count, 0);
|
|
90
95
|
if (errorCount > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/package/deps.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport chalk from 'chalk'\nimport depcheck, { special } from 'depcheck'\nimport { existsSync, readFileSync } from 'fs'\n\nimport { checkResult } from '../../lib'\n\nconst defaultIgnorePatterns = ['*.d.ts', 'dist', '.*', 'node_modules']\nconst defaultIgnoreDevDeps = [\n '@xylabs/ts-scripts-yarn3',\n '@xylabs/tsconfig',\n '@xylabs/tsconfig-dom',\n '@xylabs/tsconfig-react',\n '@xylabs/tsconfig-jest',\n 'typescript',\n]\nconst defaultIgnoreDevPatterns = ['*.stories.*', '*.spec.*', 'spec', 'stories', 'tsconfig.json']\n\nconst reportUnused = (name: string, unused: depcheck.Results['dependencies']) => {\n if (unused.length) {\n const message = [chalk.yellow(`${unused.length} Unused ${name}`)]\n unused.forEach((value) => message.push(chalk.gray(` ${value}`)))\n console.log(message.join('\\n'))\n }\n}\n\nconst reportMissing = (name: string, missing: depcheck.Results['missing']) => {\n if (Object.keys(missing).length) {\n const message = [chalk.yellow(`${Object.entries(missing).length} Missing ${name}`)]\n Object.entries(missing).forEach(([key, value]) => {\n message.push(`${key}`)\n message.push(chalk.gray(` ${value.at(0)}`))\n })\n console.log(chalk.yellow(message.join('\\n')))\n }\n}\n\nexport const packageDeps = async () => {\n const pkg = process.env.INIT_CWD\n const pkgName = process.env.npm_package_name\n\n const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined\n\n const rawIgnore = existsSync(`${pkg}/.depcheckrc`)\n ? readFileSync(`${pkg}/.depcheckrc`, { encoding: 'utf8' }).replace('ignores:', '\"ignores\":')\n : undefined\n let ignoreMatches: string[] = []\n try {\n ignoreMatches = rawIgnore ? (JSON.parse(`{${rawIgnore}}`).ignores as string[]) : []\n } catch (ex) {\n const error = ex as Error\n console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`)\n }\n\n const
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/package/deps.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport chalk from 'chalk'\nimport depcheck, { special } from 'depcheck'\nimport { existsSync, readFileSync } from 'fs'\nimport { cwd } from 'process'\n\nimport { checkResult } from '../../lib'\n\nconst defaultIgnorePatterns = ['*.d.ts', 'dist', '.*', 'node_modules']\nconst defaultIgnoreDevDeps = [\n '@xylabs/ts-scripts-yarn3',\n '@xylabs/tsconfig',\n '@xylabs/tsconfig-dom',\n '@xylabs/tsconfig-react',\n '@xylabs/tsconfig-jest',\n 'typescript',\n]\nconst defaultIgnoreDevPatterns = ['*.stories.*', '*.spec.*', 'spec', 'stories', 'tsconfig.json']\n\nconst reportUnused = (name: string, unused: depcheck.Results['dependencies']) => {\n if (unused.length) {\n const message = [chalk.yellow(`${unused.length} Unused ${name}`)]\n unused.forEach((value) => message.push(chalk.gray(` ${value}`)))\n console.log(message.join('\\n'))\n }\n}\n\nconst reportMissing = (name: string, missing: depcheck.Results['missing']) => {\n if (Object.keys(missing).length) {\n const message = [chalk.yellow(`${Object.entries(missing).length} Missing ${name}`)]\n Object.entries(missing).forEach(([key, value]) => {\n message.push(`${key}`)\n message.push(chalk.gray(` ${value.at(0)}`))\n })\n console.log(chalk.yellow(message.join('\\n')))\n }\n}\n\nconst analyzeDeps = async (pkg: string, ignoreMatches: string[]) => {\n const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined\n const [srcUnused, allUnused] = await Promise.all([\n depcheck(`${pkg}/src`, {\n ignoreMatches,\n ignorePatterns: [...defaultIgnoreDevPatterns, ...defaultIgnorePatterns],\n package: packageContent,\n }),\n depcheck(`${pkg}/.`, {\n ignoreMatches: [...ignoreMatches, ...defaultIgnoreDevDeps],\n ignorePatterns: [...defaultIgnorePatterns],\n package: packageContent,\n specials: [special.eslint, special.babel, special.bin, special.prettier, special.jest, special.mocha],\n }),\n ])\n\n const unusedDeps = srcUnused.dependencies\n const unusedDevDeps = allUnused.devDependencies\n const usedDeps = srcUnused.using\n const usedDevDeps = allUnused.using\n const missing = { ...srcUnused.missing, ...allUnused.missing }\n const { invalidDirs, invalidFiles } = allUnused\n\n return { invalidDirs, invalidFiles, missing, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps }\n}\n\nexport const packageDeps = async () => {\n const pkg = process.env.INIT_CWD ?? cwd()\n const pkgName = process.env.npm_package_name\n\n const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined\n\n const rawIgnore = existsSync(`${pkg}/.depcheckrc`)\n ? readFileSync(`${pkg}/.depcheckrc`, { encoding: 'utf8' }).replace('ignores:', '\"ignores\":')\n : undefined\n let ignoreMatches: string[] = []\n try {\n ignoreMatches = rawIgnore ? (JSON.parse(`{${rawIgnore}}`).ignores as string[]) : []\n } catch (ex) {\n const error = ex as Error\n console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`)\n }\n\n const { invalidDirs, invalidFiles, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps, missing } = await analyzeDeps(pkg, ignoreMatches)\n\n const declaredDeps = Object.keys(packageContent.dependencies ?? {})\n const declaredPeerDeps = Object.keys(packageContent.peerDependencies ?? {})\n const declaredDevDeps = Object.keys(packageContent.devDependencies ?? {})\n\n const missingDeps = Object.keys(usedDeps).filter(\n (key) => !declaredDeps.includes(key) && !declaredPeerDeps.includes(key) && !key.startsWith('@types/'),\n )\n\n const missingDevDeps = Object.keys(usedDevDeps).filter((key) => !declaredDevDeps.includes(key) && !declaredDeps.includes(key))\n\n const missingDepsObject: Record<string, string[]> = {}\n missingDeps.forEach((key) => {\n missingDepsObject[key] = missing[key] ?? [`devDep should be dep [${key}]`]\n })\n\n const missingDevDepsObject: Record<string, string[]> = {}\n missingDevDeps.forEach((key) => {\n if (missing[key]) {\n missingDevDepsObject[key] = missing[key]\n }\n })\n\n const errorCounts = [\n unusedDeps.length,\n unusedDevDeps.length,\n Object.entries(invalidDirs).length,\n Object.entries(invalidFiles).length,\n Object.entries(missingDepsObject).length,\n Object.entries(missingDevDepsObject).length,\n ]\n\n const errorCount = errorCounts.reduce((prev, count) => prev + count, 0)\n\n if (errorCount > 0) {\n console.log(`Deps [${pkgName}] = (${JSON.stringify(errorCounts)})`)\n } else {\n console.log(`Deps [${pkgName}] - Ok`)\n }\n\n reportUnused('dependencies', unusedDeps)\n reportUnused('devDependencies', unusedDevDeps)\n\n if (Object.entries(invalidDirs).length) {\n Object.entries(invalidDirs).forEach(([key, value]) => console.warn(chalk.gray(`Invalid Dir: ${key}: ${value}`)))\n }\n\n if (Object.entries(invalidFiles).length) {\n Object.entries(invalidFiles).forEach(([key, value]) => console.warn(chalk.gray(`Invalid File: ${key}: ${value}`)))\n }\n\n reportMissing('dependencies', missingDepsObject)\n reportMissing('devDependencies', missingDevDepsObject)\n\n checkResult(`Deps [${pkgName}]`, errorCount, 'warn', false)\n\n //returning 0 here since we never want deps to be fatal\n return 0\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@types/yargs": "^17.0.32",
|
|
65
65
|
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
|
66
66
|
"@typescript-eslint/parser": "^6.18.0",
|
|
67
|
-
"@xylabs/tsconfig": "~3.2.
|
|
67
|
+
"@xylabs/tsconfig": "~3.2.41",
|
|
68
68
|
"async-mutex": "^0.4.0",
|
|
69
69
|
"chalk": "^4.1.2",
|
|
70
70
|
"cosmiconfig": "^8.3.6",
|
|
@@ -112,8 +112,8 @@
|
|
|
112
112
|
"@types/license-checker": "^25.0.6",
|
|
113
113
|
"@types/lodash": "^4.14.202",
|
|
114
114
|
"@types/parse-git-config": "^3.0.4",
|
|
115
|
-
"@xylabs/eslint-config": "~3.2.
|
|
116
|
-
"@xylabs/tsconfig": "~3.2.
|
|
115
|
+
"@xylabs/eslint-config": "~3.2.41",
|
|
116
|
+
"@xylabs/tsconfig": "~3.2.41",
|
|
117
117
|
"publint": "^0.2.7",
|
|
118
118
|
"typescript": "^5.3.3"
|
|
119
119
|
},
|
|
@@ -169,6 +169,6 @@
|
|
|
169
169
|
"package-clean": "echo Not cleaning..."
|
|
170
170
|
},
|
|
171
171
|
"sideEffects": false,
|
|
172
|
-
"version": "3.2.
|
|
172
|
+
"version": "3.2.41",
|
|
173
173
|
"type": "commonjs"
|
|
174
174
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import chalk from 'chalk'
|
|
3
3
|
import depcheck, { special } from 'depcheck'
|
|
4
4
|
import { existsSync, readFileSync } from 'fs'
|
|
5
|
+
import { cwd } from 'process'
|
|
5
6
|
|
|
6
7
|
import { checkResult } from '../../lib'
|
|
7
8
|
|
|
@@ -35,23 +36,8 @@ const reportMissing = (name: string, missing: depcheck.Results['missing']) => {
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
const pkg = process.env.INIT_CWD
|
|
40
|
-
const pkgName = process.env.npm_package_name
|
|
41
|
-
|
|
39
|
+
const analyzeDeps = async (pkg: string, ignoreMatches: string[]) => {
|
|
42
40
|
const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined
|
|
43
|
-
|
|
44
|
-
const rawIgnore = existsSync(`${pkg}/.depcheckrc`)
|
|
45
|
-
? readFileSync(`${pkg}/.depcheckrc`, { encoding: 'utf8' }).replace('ignores:', '"ignores":')
|
|
46
|
-
: undefined
|
|
47
|
-
let ignoreMatches: string[] = []
|
|
48
|
-
try {
|
|
49
|
-
ignoreMatches = rawIgnore ? (JSON.parse(`{${rawIgnore}}`).ignores as string[]) : []
|
|
50
|
-
} catch (ex) {
|
|
51
|
-
const error = ex as Error
|
|
52
|
-
console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
41
|
const [srcUnused, allUnused] = await Promise.all([
|
|
56
42
|
depcheck(`${pkg}/src`, {
|
|
57
43
|
ignoreMatches,
|
|
@@ -70,9 +56,31 @@ export const packageDeps = async () => {
|
|
|
70
56
|
const unusedDevDeps = allUnused.devDependencies
|
|
71
57
|
const usedDeps = srcUnused.using
|
|
72
58
|
const usedDevDeps = allUnused.using
|
|
73
|
-
|
|
59
|
+
const missing = { ...srcUnused.missing, ...allUnused.missing }
|
|
74
60
|
const { invalidDirs, invalidFiles } = allUnused
|
|
75
61
|
|
|
62
|
+
return { invalidDirs, invalidFiles, missing, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const packageDeps = async () => {
|
|
66
|
+
const pkg = process.env.INIT_CWD ?? cwd()
|
|
67
|
+
const pkgName = process.env.npm_package_name
|
|
68
|
+
|
|
69
|
+
const packageContent = existsSync(`${pkg}/package.json`) ? JSON.parse(readFileSync(`${pkg}/package.json`, { encoding: 'utf8' })) : undefined
|
|
70
|
+
|
|
71
|
+
const rawIgnore = existsSync(`${pkg}/.depcheckrc`)
|
|
72
|
+
? readFileSync(`${pkg}/.depcheckrc`, { encoding: 'utf8' }).replace('ignores:', '"ignores":')
|
|
73
|
+
: undefined
|
|
74
|
+
let ignoreMatches: string[] = []
|
|
75
|
+
try {
|
|
76
|
+
ignoreMatches = rawIgnore ? (JSON.parse(`{${rawIgnore}}`).ignores as string[]) : []
|
|
77
|
+
} catch (ex) {
|
|
78
|
+
const error = ex as Error
|
|
79
|
+
console.log(`${pkgName} [${error.message}] Failed to parse .depcheckrc [${rawIgnore}]`)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const { invalidDirs, invalidFiles, unusedDeps, unusedDevDeps, usedDeps, usedDevDeps, missing } = await analyzeDeps(pkg, ignoreMatches)
|
|
83
|
+
|
|
76
84
|
const declaredDeps = Object.keys(packageContent.dependencies ?? {})
|
|
77
85
|
const declaredPeerDeps = Object.keys(packageContent.peerDependencies ?? {})
|
|
78
86
|
const declaredDevDeps = Object.keys(packageContent.devDependencies ?? {})
|
|
@@ -85,15 +93,13 @@ export const packageDeps = async () => {
|
|
|
85
93
|
|
|
86
94
|
const missingDepsObject: Record<string, string[]> = {}
|
|
87
95
|
missingDeps.forEach((key) => {
|
|
88
|
-
|
|
89
|
-
missingDepsObject[key] = srcUnused.missing[key]
|
|
90
|
-
}
|
|
96
|
+
missingDepsObject[key] = missing[key] ?? [`devDep should be dep [${key}]`]
|
|
91
97
|
})
|
|
92
98
|
|
|
93
99
|
const missingDevDepsObject: Record<string, string[]> = {}
|
|
94
100
|
missingDevDeps.forEach((key) => {
|
|
95
|
-
if (
|
|
96
|
-
missingDevDepsObject[key] =
|
|
101
|
+
if (missing[key]) {
|
|
102
|
+
missingDevDepsObject[key] = missing[key]
|
|
97
103
|
}
|
|
98
104
|
})
|
|
99
105
|
|
|
@@ -102,8 +108,8 @@ export const packageDeps = async () => {
|
|
|
102
108
|
unusedDevDeps.length,
|
|
103
109
|
Object.entries(invalidDirs).length,
|
|
104
110
|
Object.entries(invalidFiles).length,
|
|
105
|
-
Object.entries(
|
|
106
|
-
Object.entries(
|
|
111
|
+
Object.entries(missingDepsObject).length,
|
|
112
|
+
Object.entries(missingDevDepsObject).length,
|
|
107
113
|
]
|
|
108
114
|
|
|
109
115
|
const errorCount = errorCounts.reduce((prev, count) => prev + count, 0)
|