@xylabs/ts-scripts-yarn3 3.2.39 → 3.2.40
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,14 @@ 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
|
-
if (
|
|
105
|
-
missingDepsObject[key] =
|
|
111
|
+
if (missing[key]) {
|
|
112
|
+
missingDepsObject[key] = missing[key];
|
|
106
113
|
}
|
|
107
114
|
});
|
|
108
115
|
const missingDevDepsObject = {};
|
|
109
116
|
missingDevDeps.forEach((key) => {
|
|
110
|
-
if (
|
|
111
|
-
missingDevDepsObject[key] =
|
|
117
|
+
if (missing[key]) {
|
|
118
|
+
missingDevDepsObject[key] = missing[key];
|
|
112
119
|
}
|
|
113
120
|
});
|
|
114
121
|
const errorCounts = [
|
|
@@ -116,8 +123,8 @@ const packageDeps = async () => {
|
|
|
116
123
|
unusedDevDeps.length,
|
|
117
124
|
Object.entries(invalidDirs).length,
|
|
118
125
|
Object.entries(invalidFiles).length,
|
|
119
|
-
Object.entries(
|
|
120
|
-
Object.entries(
|
|
126
|
+
Object.entries(missingDepsObject).length,
|
|
127
|
+
Object.entries(missingDevDepsObject).length
|
|
121
128
|
];
|
|
122
129
|
const errorCount = errorCounts.reduce((prev, count) => prev + count, 0);
|
|
123
130
|
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 if (missing[key]) {\n missingDepsObject[key] = missing[key]\n }\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,14 @@ 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
|
-
if (
|
|
72
|
-
missingDepsObject[key] =
|
|
78
|
+
if (missing[key]) {
|
|
79
|
+
missingDepsObject[key] = missing[key];
|
|
73
80
|
}
|
|
74
81
|
});
|
|
75
82
|
const missingDevDepsObject = {};
|
|
76
83
|
missingDevDeps.forEach((key) => {
|
|
77
|
-
if (
|
|
78
|
-
missingDevDepsObject[key] =
|
|
84
|
+
if (missing[key]) {
|
|
85
|
+
missingDevDepsObject[key] = missing[key];
|
|
79
86
|
}
|
|
80
87
|
});
|
|
81
88
|
const errorCounts = [
|
|
@@ -83,8 +90,8 @@ const packageDeps = async () => {
|
|
|
83
90
|
unusedDevDeps.length,
|
|
84
91
|
Object.entries(invalidDirs).length,
|
|
85
92
|
Object.entries(invalidFiles).length,
|
|
86
|
-
Object.entries(
|
|
87
|
-
Object.entries(
|
|
93
|
+
Object.entries(missingDepsObject).length,
|
|
94
|
+
Object.entries(missingDevDepsObject).length
|
|
88
95
|
];
|
|
89
96
|
const errorCount = errorCounts.reduce((prev, count) => prev + count, 0);
|
|
90
97
|
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 if (missing[key]) {\n missingDepsObject[key] = missing[key]\n }\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.40",
|
|
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.40",
|
|
116
|
+
"@xylabs/tsconfig": "~3.2.40",
|
|
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.40",
|
|
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,15 @@ export const packageDeps = async () => {
|
|
|
85
93
|
|
|
86
94
|
const missingDepsObject: Record<string, string[]> = {}
|
|
87
95
|
missingDeps.forEach((key) => {
|
|
88
|
-
if (
|
|
89
|
-
missingDepsObject[key] =
|
|
96
|
+
if (missing[key]) {
|
|
97
|
+
missingDepsObject[key] = missing[key]
|
|
90
98
|
}
|
|
91
99
|
})
|
|
92
100
|
|
|
93
101
|
const missingDevDepsObject: Record<string, string[]> = {}
|
|
94
102
|
missingDevDeps.forEach((key) => {
|
|
95
|
-
if (
|
|
96
|
-
missingDevDepsObject[key] =
|
|
103
|
+
if (missing[key]) {
|
|
104
|
+
missingDevDepsObject[key] = missing[key]
|
|
97
105
|
}
|
|
98
106
|
})
|
|
99
107
|
|
|
@@ -102,8 +110,8 @@ export const packageDeps = async () => {
|
|
|
102
110
|
unusedDevDeps.length,
|
|
103
111
|
Object.entries(invalidDirs).length,
|
|
104
112
|
Object.entries(invalidFiles).length,
|
|
105
|
-
Object.entries(
|
|
106
|
-
Object.entries(
|
|
113
|
+
Object.entries(missingDepsObject).length,
|
|
114
|
+
Object.entries(missingDevDepsObject).length,
|
|
107
115
|
]
|
|
108
116
|
|
|
109
117
|
const errorCount = errorCounts.reduce((prev, count) => prev + count, 0)
|