@xylabs/ts-scripts-yarn3 7.4.10 → 7.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/actions/deplint/checkPackage/checkPackage.mjs +115 -16
  2. package/dist/actions/deplint/checkPackage/checkPackage.mjs.map +1 -1
  3. package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs +2 -1
  4. package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs.map +1 -1
  5. package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs +114 -20
  6. package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs.map +1 -1
  7. package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs +2 -1
  8. package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs.map +1 -1
  9. package/dist/actions/deplint/checkPackage/index.mjs +115 -16
  10. package/dist/actions/deplint/checkPackage/index.mjs.map +1 -1
  11. package/dist/actions/deplint/deplint.mjs +166 -38
  12. package/dist/actions/deplint/deplint.mjs.map +1 -1
  13. package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs +140 -0
  14. package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs.map +1 -0
  15. package/dist/actions/deplint/getScriptReferencedPackages.mjs +3 -1
  16. package/dist/actions/deplint/getScriptReferencedPackages.mjs.map +1 -1
  17. package/dist/actions/deplint/index.mjs +166 -38
  18. package/dist/actions/deplint/index.mjs.map +1 -1
  19. package/dist/actions/index.mjs +441 -188
  20. package/dist/actions/index.mjs.map +1 -1
  21. package/dist/actions/readme-gen.mjs +173 -0
  22. package/dist/actions/readme-gen.mjs.map +1 -0
  23. package/dist/bin/xy.mjs +432 -130
  24. package/dist/bin/xy.mjs.map +1 -1
  25. package/dist/index.d.ts +39 -2
  26. package/dist/index.mjs +490 -207
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/lib/generateReadmeFiles.mjs +160 -0
  29. package/dist/lib/generateReadmeFiles.mjs.map +1 -0
  30. package/dist/lib/index.mjs +145 -14
  31. package/dist/lib/index.mjs.map +1 -1
  32. package/dist/xy/index.mjs +432 -130
  33. package/dist/xy/index.mjs.map +1 -1
  34. package/dist/xy/xy.mjs +432 -130
  35. package/dist/xy/xy.mjs.map +1 -1
  36. package/dist/xy/xyCommonCommands.mjs +210 -42
  37. package/dist/xy/xyCommonCommands.mjs.map +1 -1
  38. package/dist/xy/xyLintCommands.mjs +205 -71
  39. package/dist/xy/xyLintCommands.mjs.map +1 -1
  40. package/package.json +2 -2
@@ -172,11 +172,11 @@ function getExternalImportsFromFiles({
172
172
  const allImportPaths = {};
173
173
  const distImportPaths = {};
174
174
  const distTypeImportPaths = {};
175
- for (const path5 of allFiles) getImportsFromFile(path5, allImportPaths, allImportPaths).flat();
175
+ for (const path6 of allFiles) getImportsFromFile(path6, allImportPaths, allImportPaths).flat();
176
176
  const distTypeFiles = distFiles.filter(isDeclarationFile);
177
177
  const distCodeFiles = distFiles.filter((file) => !isDeclarationFile(file));
178
- for (const path5 of distCodeFiles) getImportsFromFile(path5, distImportPaths, distImportPaths).flat();
179
- for (const path5 of distTypeFiles) getImportsFromFile(path5, distTypeImportPaths, distTypeImportPaths).flat();
178
+ for (const path6 of distCodeFiles) getImportsFromFile(path6, distImportPaths, distImportPaths).flat();
179
+ for (const path6 of distTypeFiles) getImportsFromFile(path6, distTypeImportPaths, distTypeImportPaths).flat();
180
180
  const allImports = Object.keys(allImportPaths);
181
181
  const distImports = Object.keys(distImportPaths);
182
182
  const externalAllImports = removeInternalImports(allImports);
@@ -270,9 +270,10 @@ function getUnusedDependencies({ name, location }, { dependencies }, {
270
270
  externalDistImports,
271
271
  externalDistTypeImports,
272
272
  externalAllImports
273
- }) {
273
+ }, exclude) {
274
274
  let unusedDependencies = 0;
275
275
  for (const dep of dependencies) {
276
+ if (exclude?.has(dep)) continue;
276
277
  if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\//, "")) && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\//, ""))) {
277
278
  unusedDependencies++;
278
279
  if (externalAllImports.includes(dep)) {
@@ -293,6 +294,15 @@ function getUnusedDependencies({ name, location }, { dependencies }, {
293
294
  // src/actions/deplint/checkPackage/getUnusedDevDependencies.ts
294
295
  import chalk4 from "chalk";
295
296
 
297
+ // src/actions/deplint/getCliReferencedPackagesFromFiles.ts
298
+ import fs7 from "fs";
299
+ import path5 from "path";
300
+ import ts2 from "typescript";
301
+
302
+ // src/actions/deplint/getScriptReferencedPackages.ts
303
+ import fs6 from "fs";
304
+ import path4 from "path";
305
+
296
306
  // src/actions/deplint/getRequiredPeerDependencies.ts
297
307
  import fs5 from "fs";
298
308
  import path3 from "path";
@@ -326,8 +336,6 @@ function getRequiredPeerDependencies(location, allDeps) {
326
336
  }
327
337
 
328
338
  // src/actions/deplint/getScriptReferencedPackages.ts
329
- import fs6 from "fs";
330
- import path4 from "path";
331
339
  function getBinNames(location, dep) {
332
340
  const depPkgPath = findDepPackageJson(location, dep);
333
341
  if (!depPkgPath) return [];
@@ -377,15 +385,101 @@ function getScriptReferencedPackages(location, allDeps) {
377
385
  return referenced;
378
386
  }
379
387
 
388
+ // src/actions/deplint/getCliReferencedPackagesFromFiles.ts
389
+ var shellCommandFunctions = /* @__PURE__ */ new Set(["execSync", "exec"]);
390
+ var directExecFunctions = /* @__PURE__ */ new Set(["spawn", "spawnSync", "execFile", "execFileSync"]);
391
+ var allExecFunctions = /* @__PURE__ */ new Set([...shellCommandFunctions, ...directExecFunctions]);
392
+ function getCommandTokensFromFile(filePath) {
393
+ const tokens = /* @__PURE__ */ new Set();
394
+ let sourceCode;
395
+ try {
396
+ sourceCode = fs7.readFileSync(filePath, "utf8");
397
+ } catch {
398
+ return tokens;
399
+ }
400
+ const isMjsFile = filePath.endsWith(".mjs");
401
+ const sourceFile = ts2.createSourceFile(
402
+ path5.basename(filePath),
403
+ sourceCode,
404
+ ts2.ScriptTarget.Latest,
405
+ true,
406
+ isMjsFile ? ts2.ScriptKind.JS : void 0
407
+ );
408
+ function visit(node) {
409
+ if (ts2.isCallExpression(node) && node.arguments.length > 0) {
410
+ const fnName = getFunctionName(node.expression);
411
+ if (fnName && allExecFunctions.has(fnName)) {
412
+ const firstArg = node.arguments[0];
413
+ if (ts2.isStringLiteral(firstArg) || ts2.isNoSubstitutionTemplateLiteral(firstArg)) {
414
+ const value = firstArg.text;
415
+ if (shellCommandFunctions.has(fnName)) {
416
+ for (const token of tokenizeScript(value)) {
417
+ tokens.add(token);
418
+ }
419
+ } else {
420
+ tokens.add(value);
421
+ }
422
+ } else if (ts2.isTemplateExpression(firstArg)) {
423
+ const head = firstArg.head.text;
424
+ if (head) {
425
+ for (const token of tokenizeScript(head)) {
426
+ tokens.add(token);
427
+ }
428
+ }
429
+ }
430
+ }
431
+ }
432
+ ts2.forEachChild(node, visit);
433
+ }
434
+ visit(sourceFile);
435
+ return tokens;
436
+ }
437
+ function getFunctionName(expr) {
438
+ if (ts2.isIdentifier(expr)) {
439
+ return expr.text;
440
+ }
441
+ if (ts2.isPropertyAccessExpression(expr) && ts2.isIdentifier(expr.name)) {
442
+ return expr.name.text;
443
+ }
444
+ return void 0;
445
+ }
446
+ function getCliReferencedPackagesFromFiles(allFiles, location, allDeps) {
447
+ const allTokens = /* @__PURE__ */ new Set();
448
+ for (const file of allFiles) {
449
+ for (const token of getCommandTokensFromFile(file)) {
450
+ allTokens.add(token);
451
+ }
452
+ }
453
+ if (allTokens.size === 0) return /* @__PURE__ */ new Set();
454
+ const binToPackage = /* @__PURE__ */ new Map();
455
+ for (const dep of allDeps) {
456
+ for (const bin of getBinNames(location, dep)) {
457
+ binToPackage.set(bin, dep);
458
+ }
459
+ }
460
+ const referenced = /* @__PURE__ */ new Set();
461
+ for (const token of allTokens) {
462
+ const baseName = getBasePackageName(token);
463
+ if (allDeps.includes(baseName)) {
464
+ referenced.add(baseName);
465
+ }
466
+ const pkg = binToPackage.get(token);
467
+ if (pkg) {
468
+ referenced.add(pkg);
469
+ }
470
+ }
471
+ return referenced;
472
+ }
473
+
380
474
  // src/actions/deplint/implicitDevDependencies.ts
381
- import fs7 from "fs";
475
+ import fs8 from "fs";
382
476
  var hasFileWithExtension = (files, extensions) => files.some((f) => extensions.some((ext) => f.endsWith(ext)));
383
477
  var tsExtensions = [".ts", ".tsx", ".mts", ".cts"];
384
478
  var hasTypescriptFiles = ({ allFiles }) => hasFileWithExtension(allFiles, tsExtensions);
385
479
  var decoratorPattern = /^\s*@[a-zA-Z]\w*/m;
386
480
  var hasDecorators = ({ allFiles }) => allFiles.filter((f) => tsExtensions.some((ext) => f.endsWith(ext))).some((file) => {
387
481
  try {
388
- const content = fs7.readFileSync(file, "utf8");
482
+ const content = fs8.readFileSync(file, "utf8");
389
483
  return decoratorPattern.test(content);
390
484
  } catch {
391
485
  return false;
@@ -398,7 +492,7 @@ function hasImportPlugin({ location, allDependencies }) {
398
492
  const pkgPath = findDepPackageJson(location, dep);
399
493
  if (!pkgPath) continue;
400
494
  try {
401
- const pkg = JSON.parse(fs7.readFileSync(pkgPath, "utf8"));
495
+ const pkg = JSON.parse(fs8.readFileSync(pkgPath, "utf8"));
402
496
  const transitiveDeps = [
403
497
  ...Object.keys(pkg.dependencies ?? {}),
404
498
  ...Object.keys(pkg.peerDependencies ?? {})
@@ -450,10 +544,11 @@ var allExternalImports = ({
450
544
  ...externalDistTypeImports
451
545
  ]);
452
546
  };
453
- function isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs) {
547
+ function isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs) {
454
548
  if (implicitDeps.has(dep)) return true;
455
549
  if (requiredPeers.has(dep)) return true;
456
550
  if (scriptRefs.has(dep)) return true;
551
+ if (cliRefs.has(dep)) return true;
457
552
  if (dep.startsWith("@types/")) {
458
553
  const baseName = dep.replace(/^@types\//, "");
459
554
  return allImports.has(baseName) || allImports.has(dep) || implicitDeps.has(baseName);
@@ -464,7 +559,7 @@ function getUnusedDevDependencies({ name, location }, {
464
559
  devDependencies,
465
560
  dependencies,
466
561
  peerDependencies
467
- }, sourceParams, fileContext) {
562
+ }, sourceParams, fileContext, exclude) {
468
563
  const allImports = allExternalImports(sourceParams);
469
564
  const allDeps = [...dependencies, ...devDependencies, ...peerDependencies];
470
565
  const implicitDeps = getImplicitDevDependencies({
@@ -474,10 +569,12 @@ function getUnusedDevDependencies({ name, location }, {
474
569
  });
475
570
  const requiredPeers = getRequiredPeerDependencies(location, allDeps);
476
571
  const scriptRefs = getScriptReferencedPackages(location, allDeps);
572
+ const cliRefs = getCliReferencedPackagesFromFiles(fileContext.allFiles, location, allDeps);
477
573
  let unusedDevDependencies = 0;
478
574
  for (const dep of devDependencies) {
575
+ if (exclude?.has(dep)) continue;
479
576
  if (dependencies.includes(dep) || peerDependencies.includes(dep)) continue;
480
- if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs)) {
577
+ if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs)) {
481
578
  unusedDevDependencies++;
482
579
  console.log(`[${chalk4.blue(name)}] Unused devDependency in package.json: ${chalk4.red(dep)}`);
483
580
  }
@@ -492,9 +589,10 @@ function getUnusedDevDependencies({ name, location }, {
492
589
 
493
590
  // src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts
494
591
  import chalk5 from "chalk";
495
- function getUnusedPeerDependencies({ name, location }, { peerDependencies, dependencies }, { externalDistImports, externalDistTypeImports }) {
592
+ function getUnusedPeerDependencies({ name, location }, { peerDependencies, dependencies }, { externalDistImports, externalDistTypeImports }, exclude) {
496
593
  let unusedDependencies = 0;
497
594
  for (const dep of peerDependencies) {
595
+ if (exclude?.has(dep)) continue;
498
596
  if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\//, "")) && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\//, ""))) {
499
597
  unusedDependencies++;
500
598
  if (dependencies.includes(dep)) {
@@ -531,6 +629,7 @@ function checkPackage({
531
629
  location,
532
630
  deps = false,
533
631
  devDeps = false,
632
+ exclude,
534
633
  peerDeps = false,
535
634
  verbose = false
536
635
  }) {
@@ -549,11 +648,11 @@ function checkPackage({
549
648
  });
550
649
  const packageParams = getDependenciesFromPackageJson(`${location}/package.json`);
551
650
  const unlistedDependencies = checkDeps ? getUnlistedDependencies({ name, location }, packageParams, sourceParams) : 0;
552
- const unusedDependencies = checkDeps ? getUnusedDependencies({ name, location }, packageParams, sourceParams) : 0;
651
+ const unusedDependencies = checkDeps ? getUnusedDependencies({ name, location }, packageParams, sourceParams, exclude) : 0;
553
652
  const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0;
554
653
  const fileContext = { allFiles, distFiles };
555
- const unusedDevDependencies = checkDevDeps ? getUnusedDevDependencies({ name, location }, packageParams, sourceParams, fileContext) : 0;
556
- const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams) : 0;
654
+ const unusedDevDependencies = checkDevDeps ? getUnusedDevDependencies({ name, location }, packageParams, sourceParams, fileContext, exclude) : 0;
655
+ const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams, exclude) : 0;
557
656
  const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + unusedDevDependencies + unusedPeerDependencies;
558
657
  return totalErrors;
559
658
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/actions/deplint/findFiles.ts","../../../../src/actions/deplint/findFilesByGlob.ts","../../../../src/actions/deplint/getDependenciesFromPackageJson.ts","../../../../src/actions/deplint/getExtendsFromTsconfigs.ts","../../../../src/actions/deplint/getBasePackageName.ts","../../../../src/actions/deplint/getImportsFromFile.ts","../../../../src/actions/deplint/getExternalImportsFromFiles.ts","../../../../src/actions/deplint/checkPackage/getUnlistedDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedDevDependencies.ts","../../../../src/actions/deplint/getRequiredPeerDependencies.ts","../../../../src/actions/deplint/getScriptReferencedPackages.ts","../../../../src/actions/deplint/implicitDevDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts","../../../../src/actions/deplint/checkPackage/checkPackage.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { findFilesByGlob } from './findFilesByGlob.ts'\n\nconst codeExtensions = '*.{ts,tsx,mts,cts,js,mjs,cjs}'\n\nfunction getWorkspaceIgnores(location: string): string[] {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw)\n return pkg.workspaces ?? []\n } catch {\n return []\n }\n}\n\nexport function findFiles(location: string) {\n const workspaceIgnores = getWorkspaceIgnores(location).map(w => `${w}/**`)\n const ignore = ['**/node_modules/**', 'dist/**', ...workspaceIgnores]\n const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore)\n const distFiles = [\n ...findFilesByGlob(location, './dist/**/*.d.ts'),\n ...findFilesByGlob(location, `./dist/**/${codeExtensions}`),\n ]\n\n return { allFiles, distFiles }\n}\n","import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string, ignore?: string[]) {\n return globSync(pattern, {\n cwd, absolute: true, ignore, nodir: true,\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'\n\nimport { globSync } from 'glob'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nconst isExternalReference = (ref: string) => !ref.startsWith('.') && !ref.startsWith('/')\n\nfunction parseExtendsField(value: unknown): string[] {\n if (typeof value === 'string') return [value]\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string')\n return []\n}\n\nexport function getExtendsFromTsconfigs(location: string): string[] {\n const tsconfigFiles = globSync('./tsconfig*.json', { cwd: location, absolute: true })\n const packages = new Set<string>()\n\n for (const file of tsconfigFiles) {\n try {\n const content = fs.readFileSync(file, 'utf8')\n // Strip single-line comments (tsconfig allows them) and trailing commas before parsing\n const cleaned = content\n .replaceAll(/\\/\\/.*/g, '')\n .replaceAll(/,\\s*([}\\]])/g, '$1')\n const parsed = JSON.parse(cleaned)\n const refs = parseExtendsField(parsed.extends)\n for (const ref of refs) {\n if (isExternalReference(ref)) {\n packages.add(getBasePackageName(ref))\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n\n return [...packages]\n}\n","export function getBasePackageName(importName: string) {\n const importNameScrubbed = importName.replaceAll('\"', '').trim()\n if (importNameScrubbed.startsWith('@')) {\n const parts = importNameScrubbed.split('/')\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed\n }\n return importNameScrubbed.split('/')[0]\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 isTypeOnlyImportClause(clause?: ts.ImportClause): boolean {\n if (clause === undefined) {\n return false\n }\n // Newer TS: clause.phaseModifier -> token or number\n if ('phaseModifier' in clause) {\n const mod = clause.phaseModifier\n // handle number enum or token node with .kind\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kind: number | undefined = typeof mod === 'number' ? mod : (mod as any)?.kind\n return kind === ts.SyntaxKind.TypeKeyword\n }\n // Older TS fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (clause as any).isTypeOnly\n}\n\nexport function getImportsFromFile(filePath: string, importPaths: Record<string, string[]>, typeImportPaths: Record<string, string[]>) {\n const sourceCode = fs.readFileSync(filePath, 'utf8')\n\n const isMjsFile = filePath.endsWith('.mjs')\n\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n isMjsFile ? ts.ScriptKind.JS : undefined,\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) ? isTypeOnlyImportClause(node.importClause) : false\n if (typeof moduleSpecifier === 'string') {\n const trimmed = moduleSpecifier.replaceAll(\"'\", '').replaceAll('\"', '').trim()\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 imports.push(arg.text)\n }\n } else if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'require'\n && node.arguments.length > 0\n && ts.isStringLiteral(node.arguments[0])\n ) {\n imports.push(node.arguments[0].text)\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n const importsStartsWithExcludes = ['.', '#', 'node:']\n\n const isValidImport = (imp: string) =>\n !importsStartsWithExcludes.some(exc => imp.startsWith(exc))\n && !imp.includes('*')\n && !imp.includes('!')\n\n const cleanedImports = imports.filter(isValidImport).map(getBasePackageName)\n const cleanedTypeImports = typeImports.filter(isValidImport).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","import type { CheckSourceParams } from './checkPackage/index.ts'\nimport { 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\nconst isDeclarationFile = (file: string) =>\n file.endsWith('.d.ts') || file.endsWith('.d.cts') || file.endsWith('.d.mts')\n\nexport function getExternalImportsFromFiles({\n allFiles, distFiles, tsconfigExtends = [],\n}: {\n allFiles: string[]\n distFiles: string[]\n tsconfigExtends?: string[]\n}): CheckSourceParams {\n const allImportPaths: Record<string, string[]> = {}\n const distImportPaths: Record<string, string[]> = {}\n const distTypeImportPaths: Record<string, string[]> = {}\n\n for (const path of allFiles) getImportsFromFile(path, allImportPaths, allImportPaths).flat()\n\n const distTypeFiles = distFiles.filter(isDeclarationFile)\n const distCodeFiles = distFiles.filter(file => !isDeclarationFile(file))\n for (const path of distCodeFiles) getImportsFromFile(path, distImportPaths, distImportPaths).flat()\n for (const path of distTypeFiles) getImportsFromFile(path, distTypeImportPaths, distTypeImportPaths).flat()\n\n const allImports = Object.keys(allImportPaths)\n const distImports = Object.keys(distImportPaths)\n\n const externalAllImports = removeInternalImports(allImports)\n const externalDistImports = removeInternalImports(distImports)\n const externalDistTypeImports = removeInternalImports(Object.keys(distTypeImportPaths))\n\n // Tsconfig extends references count as used imports\n for (const ext of tsconfigExtends) {\n if (!externalAllImports.includes(ext)) externalAllImports.push(ext)\n }\n\n return {\n allImportPaths,\n allImports,\n distImportPaths,\n distImports,\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n }\n}\n","import { builtinModules } from 'node:module'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nfunction isListedOrBuiltin(\n imp: string,\n name: string,\n dependencies: string[],\n peerDependencies: string[],\n) {\n return dependencies.includes(imp)\n || imp === name\n || dependencies.includes(`@types/${imp}`)\n || peerDependencies.includes(imp)\n || peerDependencies.includes(`@types/${imp}`)\n || builtinModules.includes(imp)\n || builtinModules.includes(`@types/${imp}`)\n}\n\nfunction logMissing(name: string, imp: string, importPaths: Record<string, string[]>) {\n console.log(`[${chalk.blue(name)}] Missing dependency in package.json: ${chalk.red(imp)}`)\n if (importPaths[imp]) {\n console.log(` ${importPaths[imp].join('\\n ')}`)\n }\n}\n\nexport function getUnlistedDependencies(\n { name, location }: Workspace,\n { dependencies, peerDependencies }: CheckPackageParams,\n {\n externalDistImports, externalDistTypeImports, distImportPaths,\n }: CheckSourceParams,\n) {\n let unlistedDependencies = 0\n\n for (const imp of externalDistImports) {\n if (!isListedOrBuiltin(imp, name, dependencies, peerDependencies)) {\n unlistedDependencies++\n logMissing(name, imp, distImportPaths)\n }\n }\n\n for (const imp of externalDistTypeImports) {\n if (!isListedOrBuiltin(imp, name, dependencies, peerDependencies)) {\n unlistedDependencies++\n logMissing(name, imp, distImportPaths)\n }\n }\n\n if (unlistedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unlistedDependencies\n}\n","import { builtinModules } from 'node:module'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getUnlistedDevDependencies(\n { name, location }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n {\n allImportPaths, externalAllImports, distImports,\n }: CheckSourceParams,\n) {\n let unlistedDevDependencies = 0\n for (const imp of externalAllImports) {\n if (!distImports.includes(imp)\n && imp !== name\n && !dependencies.includes(imp)\n && !dependencies.includes(`@types/${imp}`)\n && !peerDependencies.includes(imp)\n && !peerDependencies.includes(`@types/${imp}`)\n && !devDependencies.includes(imp)\n && !devDependencies.includes(`@types/${imp}`)\n && !builtinModules.includes(imp)\n ) {\n unlistedDevDependencies++\n console.log(`[${chalk.blue(name)}] Missing devDependency in package.json: ${chalk.red(imp)}`)\n if (allImportPaths[imp]) {\n console.log(` ${allImportPaths[imp].join('\\n ')}`)\n }\n }\n }\n if (unlistedDevDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\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 externalDistImports,\n externalDistTypeImports,\n externalAllImports,\n }: CheckSourceParams,\n) {\n let unusedDependencies = 0\n for (const dep of dependencies) {\n if (!externalDistImports.includes(dep)\n && !externalDistImports.includes(dep.replace(/^@types\\//, ''))\n && !externalDistTypeImports.includes(dep)\n && !externalDistTypeImports.includes(dep.replace(/^@types\\//, ''))) {\n unusedDependencies++\n if (externalAllImports.includes(dep)) {\n console.log(`[${chalk.blue(name)}] dependency should be devDependency in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused dependency in package.json: ${chalk.red(dep)}`)\n }\n }\n }\n if (unusedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unusedDependencies\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport { getRequiredPeerDependencies } from '../getRequiredPeerDependencies.ts'\nimport { getScriptReferencedPackages } from '../getScriptReferencedPackages.ts'\nimport type { FileContext } from '../implicitDevDependencies.ts'\nimport { getImplicitDevDependencies } from '../implicitDevDependencies.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nconst allExternalImports = ({\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n}: CheckSourceParams) => {\n return new Set<string>([\n ...externalAllImports,\n ...externalDistImports,\n ...externalDistTypeImports,\n ])\n}\n\nfunction isDevDepUsed(\n dep: string,\n allImports: Set<string>,\n implicitDeps: Set<string>,\n requiredPeers: Set<string>,\n scriptRefs: Set<string>,\n) {\n if (implicitDeps.has(dep)) return true\n if (requiredPeers.has(dep)) return true\n if (scriptRefs.has(dep)) return true\n\n if (dep.startsWith('@types/')) {\n const baseName = dep.replace(/^@types\\//, '')\n return allImports.has(baseName) || allImports.has(dep) || implicitDeps.has(baseName)\n }\n\n return allImports.has(dep)\n}\n\nexport function getUnusedDevDependencies(\n { name, location }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n sourceParams: CheckSourceParams,\n fileContext: FileContext,\n) {\n const allImports = allExternalImports(sourceParams)\n const allDeps = [...dependencies, ...devDependencies, ...peerDependencies]\n const implicitDeps = getImplicitDevDependencies({\n ...fileContext, allDependencies: allDeps, location,\n })\n const requiredPeers = getRequiredPeerDependencies(location, allDeps)\n const scriptRefs = getScriptReferencedPackages(location, allDeps)\n let unusedDevDependencies = 0\n for (const dep of devDependencies) {\n // Skip devDeps that are also declared as dependencies or peerDependencies\n if (dependencies.includes(dep) || peerDependencies.includes(dep)) continue\n\n if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs)) {\n unusedDevDependencies++\n console.log(`[${chalk.blue(name)}] Unused devDependency in package.json: ${chalk.red(dep)}`)\n }\n }\n if (unusedDevDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unusedDevDependencies\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function findDepPackageJson(location: string, dep: string): string | undefined {\n let dir = location\n while (true) {\n const candidate = path.join(dir, 'node_modules', dep, 'package.json')\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\n/**\n * Collects the peerDependencies declared by all of a package's\n * dependencies and devDependencies. A devDependency that satisfies\n * one of these peer requirements should not be flagged as unused.\n */\nexport function getRequiredPeerDependencies(\n location: string,\n allDeps: string[],\n): Set<string> {\n const required = new Set<string>()\n for (const dep of allDeps) {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) continue\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n if (pkg.peerDependencies) {\n for (const peer of Object.keys(pkg.peerDependencies)) {\n required.add(peer)\n }\n }\n } catch {\n // Package not readable — skip\n }\n }\n return required\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nfunction getBinNames(location: string, dep: string): string[] {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) return []\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n if (!pkg.bin) return []\n if (typeof pkg.bin === 'string') return [pkg.name?.split('/').pop() ?? dep]\n return Object.keys(pkg.bin)\n } catch {\n return []\n }\n}\n\nfunction tokenizeScript(script: string): string[] {\n // Split on shell operators and whitespace to get command tokens\n return script\n .split(/[&|;$()\"`\\s]+/)\n .map(t => t.trim())\n .filter(Boolean)\n}\n\n/**\n * Scans package.json scripts for references to installed packages,\n * either by package name or by binary name they provide.\n */\nexport function getScriptReferencedPackages(\n location: string,\n allDeps: string[],\n): Set<string> {\n const pkgPath = path.join(location, 'package.json')\n let scripts: Record<string, string> = {}\n try {\n const raw = fs.readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n scripts = pkg.scripts ?? {}\n } catch {\n return new Set()\n }\n\n const scriptText = Object.values(scripts).join(' ')\n const tokens = new Set(tokenizeScript(scriptText))\n\n // Build a map from bin name -> package name\n const binToPackage = new Map<string, string>()\n for (const dep of allDeps) {\n const bins = getBinNames(location, dep)\n for (const bin of bins) {\n binToPackage.set(bin, dep)\n }\n }\n\n const referenced = new Set<string>()\n for (const token of tokens) {\n // Direct package name match (e.g. \"yarn rimraf\" -> token \"rimraf\")\n const baseName = getBasePackageName(token)\n if (allDeps.includes(baseName)) {\n referenced.add(baseName)\n }\n // Binary name match (e.g. \"tsup\" -> @xylabs/ts-scripts-yarn3 provides \"tsup\"? no, tsup provides \"tsup\")\n const pkg = binToPackage.get(token)\n if (pkg) {\n referenced.add(pkg)\n }\n }\n\n return referenced\n}\n","import fs from 'node:fs'\n\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nexport interface ImplicitDevDependencyRule {\n isNeeded: (context: ImplicitDepContext) => boolean\n package: string\n}\n\nexport interface FileContext {\n allFiles: string[]\n distFiles: string[]\n}\n\nexport interface ImplicitDepContext extends FileContext {\n allDependencies: string[]\n location: string\n}\n\nconst hasFileWithExtension = (files: string[], extensions: string[]) =>\n files.some(f => extensions.some(ext => f.endsWith(ext)))\n\nconst tsExtensions = ['.ts', '.tsx', '.mts', '.cts']\n\nconst hasTypescriptFiles = ({ allFiles }: ImplicitDepContext) =>\n hasFileWithExtension(allFiles, tsExtensions)\n\n// Matches decorator usage: @something at the start of a line (after optional whitespace).\n// Safe from JSDoc false positives since those appear after * in comment blocks.\nconst decoratorPattern = /^\\s*@[a-zA-Z]\\w*/m\n\nconst hasDecorators = ({ allFiles }: ImplicitDepContext) =>\n allFiles\n .filter(f => tsExtensions.some(ext => f.endsWith(ext)))\n .some((file) => {\n try {\n const content = fs.readFileSync(file, 'utf8')\n return decoratorPattern.test(content)\n } catch {\n return false\n }\n })\n\nconst importPlugins = new Set(['eslint-plugin-import-x', 'eslint-plugin-import'])\n\n/**\n * Checks whether any dependency (direct or transitive) pulls in\n * one of the eslint import plugins that require a resolver.\n */\nfunction hasImportPlugin({ location, allDependencies }: ImplicitDepContext): boolean {\n // Direct dependency on the plugin\n if (allDependencies.some(d => importPlugins.has(d))) return true\n\n // Transitive: a dependency bundles the plugin as a dep or peer\n for (const dep of allDependencies) {\n const pkgPath = findDepPackageJson(location, dep)\n if (!pkgPath) continue\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))\n const transitiveDeps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.peerDependencies ?? {}),\n ]\n if (transitiveDeps.some(d => importPlugins.has(d))) return true\n } catch {\n // skip unreadable packages\n }\n }\n return false\n}\n\nconst hasVitest = ({ allDependencies }: ImplicitDepContext) =>\n allDependencies.includes('vitest')\n\nconst rules: ImplicitDevDependencyRule[] = [\n {\n package: 'typescript',\n isNeeded: hasTypescriptFiles,\n },\n {\n package: 'eslint-import-resolver-typescript',\n isNeeded: context =>\n hasTypescriptFiles(context)\n && context.allDependencies.includes('eslint')\n && hasImportPlugin(context),\n },\n {\n package: 'tslib',\n isNeeded: hasDecorators,\n },\n {\n package: '@vitest/coverage-v8',\n isNeeded: hasVitest,\n },\n]\n\nexport function getImplicitDevDependencies(context: ImplicitDepContext): Set<string> {\n const implicit = new Set<string>()\n for (const rule of rules) {\n if (rule.isNeeded(context)) {\n implicit.add(rule.package)\n }\n }\n return implicit\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, dependencies }: CheckPackageParams,\n { externalDistImports, externalDistTypeImports }: CheckSourceParams,\n) {\n let unusedDependencies = 0\n for (const dep of peerDependencies) {\n if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\\//, ''))\n && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\\//, ''))) {\n unusedDependencies++\n if (dependencies.includes(dep)) {\n console.log(`[${chalk.blue(name)}] Unused peerDependency [already a dependency] in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused peerDependency in package.json: ${chalk.red(dep)}`)\n }\n }\n }\n if (unusedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\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 { getExtendsFromTsconfigs } from '../getExtendsFromTsconfigs.ts'\nimport { getExternalImportsFromFiles } from '../getExternalImportsFromFiles.ts'\nimport { getUnlistedDependencies } from './getUnlistedDependencies.ts'\nimport { getUnlistedDevDependencies } from './getUnlistedDevDependencies.ts'\nimport { getUnusedDependencies } from './getUnusedDependencies.ts'\nimport { getUnusedDevDependencies } from './getUnusedDevDependencies.ts'\nimport { getUnusedPeerDependencies } from './getUnusedPeerDependencies.ts'\n\nexport interface CheckPackageOptions {\n deps?: boolean\n devDeps?: boolean\n peerDeps?: boolean\n verbose?: boolean\n}\n\nfunction logVerbose(\n name: string,\n location: string,\n allFiles: string[],\n distFiles: string[],\n tsconfigExtends: string[],\n) {\n console.info(`Checking package: ${name} at ${location}`)\n console.info(`All files: ${allFiles.length}, Distribution files: ${distFiles.length}`)\n for (const file of allFiles) {\n console.info(`File: ${file}`)\n }\n for (const file of distFiles) {\n console.info(`Distribution file: ${file}`)\n }\n for (const ext of tsconfigExtends) {\n console.info(`Tsconfig extends: ${ext}`)\n }\n}\n\nexport function checkPackage({\n name, location, deps = false, devDeps = false, peerDeps = false, verbose = false,\n}: CheckPackageOptions & Workspace) {\n const { allFiles, distFiles } = findFiles(location)\n const tsconfigExtends = getExtendsFromTsconfigs(location)\n if (verbose) {\n logVerbose(name, location, allFiles, distFiles, tsconfigExtends)\n }\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({\n allFiles, distFiles, tsconfigExtends,\n })\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 unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0\n const fileContext = { allFiles, distFiles }\n const unusedDevDependencies = checkDevDeps\n ? getUnusedDevDependencies({ name, location }, packageParams, sourceParams, fileContext)\n : 0\n const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams) : 0\n\n const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + unusedDevDependencies + unusedPeerDependencies\n return totalErrors\n}\n"],"mappings":"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","names":["fs","fs","globSync","globSync","fs","fs","path","fs","path","isDeclarationFile","path","builtinModules","chalk","chalk","chalk","fs","path","fs","path","fs","path","fs","fs","chalk","chalk"]}
1
+ {"version":3,"sources":["../../../../src/actions/deplint/findFiles.ts","../../../../src/actions/deplint/findFilesByGlob.ts","../../../../src/actions/deplint/getDependenciesFromPackageJson.ts","../../../../src/actions/deplint/getExtendsFromTsconfigs.ts","../../../../src/actions/deplint/getBasePackageName.ts","../../../../src/actions/deplint/getImportsFromFile.ts","../../../../src/actions/deplint/getExternalImportsFromFiles.ts","../../../../src/actions/deplint/checkPackage/getUnlistedDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedDevDependencies.ts","../../../../src/actions/deplint/getCliReferencedPackagesFromFiles.ts","../../../../src/actions/deplint/getScriptReferencedPackages.ts","../../../../src/actions/deplint/getRequiredPeerDependencies.ts","../../../../src/actions/deplint/implicitDevDependencies.ts","../../../../src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts","../../../../src/actions/deplint/checkPackage/checkPackage.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { findFilesByGlob } from './findFilesByGlob.ts'\n\nconst codeExtensions = '*.{ts,tsx,mts,cts,js,mjs,cjs}'\n\nfunction getWorkspaceIgnores(location: string): string[] {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw)\n return pkg.workspaces ?? []\n } catch {\n return []\n }\n}\n\nexport function findFiles(location: string) {\n const workspaceIgnores = getWorkspaceIgnores(location).map(w => `${w}/**`)\n const ignore = ['**/node_modules/**', 'dist/**', ...workspaceIgnores]\n const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore)\n const distFiles = [\n ...findFilesByGlob(location, './dist/**/*.d.ts'),\n ...findFilesByGlob(location, `./dist/**/${codeExtensions}`),\n ]\n\n return { allFiles, distFiles }\n}\n","import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string, ignore?: string[]) {\n return globSync(pattern, {\n cwd, absolute: true, ignore, nodir: true,\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'\n\nimport { globSync } from 'glob'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nconst isExternalReference = (ref: string) => !ref.startsWith('.') && !ref.startsWith('/')\n\nfunction parseExtendsField(value: unknown): string[] {\n if (typeof value === 'string') return [value]\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string')\n return []\n}\n\nexport function getExtendsFromTsconfigs(location: string): string[] {\n const tsconfigFiles = globSync('./tsconfig*.json', { cwd: location, absolute: true })\n const packages = new Set<string>()\n\n for (const file of tsconfigFiles) {\n try {\n const content = fs.readFileSync(file, 'utf8')\n // Strip single-line comments (tsconfig allows them) and trailing commas before parsing\n const cleaned = content\n .replaceAll(/\\/\\/.*/g, '')\n .replaceAll(/,\\s*([}\\]])/g, '$1')\n const parsed = JSON.parse(cleaned)\n const refs = parseExtendsField(parsed.extends)\n for (const ref of refs) {\n if (isExternalReference(ref)) {\n packages.add(getBasePackageName(ref))\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n\n return [...packages]\n}\n","export function getBasePackageName(importName: string) {\n const importNameScrubbed = importName.replaceAll('\"', '').trim()\n if (importNameScrubbed.startsWith('@')) {\n const parts = importNameScrubbed.split('/')\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed\n }\n return importNameScrubbed.split('/')[0]\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 isTypeOnlyImportClause(clause?: ts.ImportClause): boolean {\n if (clause === undefined) {\n return false\n }\n // Newer TS: clause.phaseModifier -> token or number\n if ('phaseModifier' in clause) {\n const mod = clause.phaseModifier\n // handle number enum or token node with .kind\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kind: number | undefined = typeof mod === 'number' ? mod : (mod as any)?.kind\n return kind === ts.SyntaxKind.TypeKeyword\n }\n // Older TS fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (clause as any).isTypeOnly\n}\n\nexport function getImportsFromFile(filePath: string, importPaths: Record<string, string[]>, typeImportPaths: Record<string, string[]>) {\n const sourceCode = fs.readFileSync(filePath, 'utf8')\n\n const isMjsFile = filePath.endsWith('.mjs')\n\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n isMjsFile ? ts.ScriptKind.JS : undefined,\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) ? isTypeOnlyImportClause(node.importClause) : false\n if (typeof moduleSpecifier === 'string') {\n const trimmed = moduleSpecifier.replaceAll(\"'\", '').replaceAll('\"', '').trim()\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 imports.push(arg.text)\n }\n } else if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'require'\n && node.arguments.length > 0\n && ts.isStringLiteral(node.arguments[0])\n ) {\n imports.push(node.arguments[0].text)\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n const importsStartsWithExcludes = ['.', '#', 'node:']\n\n const isValidImport = (imp: string) =>\n !importsStartsWithExcludes.some(exc => imp.startsWith(exc))\n && !imp.includes('*')\n && !imp.includes('!')\n\n const cleanedImports = imports.filter(isValidImport).map(getBasePackageName)\n const cleanedTypeImports = typeImports.filter(isValidImport).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","import type { CheckSourceParams } from './checkPackage/index.ts'\nimport { 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\nconst isDeclarationFile = (file: string) =>\n file.endsWith('.d.ts') || file.endsWith('.d.cts') || file.endsWith('.d.mts')\n\nexport function getExternalImportsFromFiles({\n allFiles, distFiles, tsconfigExtends = [],\n}: {\n allFiles: string[]\n distFiles: string[]\n tsconfigExtends?: string[]\n}): CheckSourceParams {\n const allImportPaths: Record<string, string[]> = {}\n const distImportPaths: Record<string, string[]> = {}\n const distTypeImportPaths: Record<string, string[]> = {}\n\n for (const path of allFiles) getImportsFromFile(path, allImportPaths, allImportPaths).flat()\n\n const distTypeFiles = distFiles.filter(isDeclarationFile)\n const distCodeFiles = distFiles.filter(file => !isDeclarationFile(file))\n for (const path of distCodeFiles) getImportsFromFile(path, distImportPaths, distImportPaths).flat()\n for (const path of distTypeFiles) getImportsFromFile(path, distTypeImportPaths, distTypeImportPaths).flat()\n\n const allImports = Object.keys(allImportPaths)\n const distImports = Object.keys(distImportPaths)\n\n const externalAllImports = removeInternalImports(allImports)\n const externalDistImports = removeInternalImports(distImports)\n const externalDistTypeImports = removeInternalImports(Object.keys(distTypeImportPaths))\n\n // Tsconfig extends references count as used imports\n for (const ext of tsconfigExtends) {\n if (!externalAllImports.includes(ext)) externalAllImports.push(ext)\n }\n\n return {\n allImportPaths,\n allImports,\n distImportPaths,\n distImports,\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n }\n}\n","import { builtinModules } from 'node:module'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nfunction isListedOrBuiltin(\n imp: string,\n name: string,\n dependencies: string[],\n peerDependencies: string[],\n) {\n return dependencies.includes(imp)\n || imp === name\n || dependencies.includes(`@types/${imp}`)\n || peerDependencies.includes(imp)\n || peerDependencies.includes(`@types/${imp}`)\n || builtinModules.includes(imp)\n || builtinModules.includes(`@types/${imp}`)\n}\n\nfunction logMissing(name: string, imp: string, importPaths: Record<string, string[]>) {\n console.log(`[${chalk.blue(name)}] Missing dependency in package.json: ${chalk.red(imp)}`)\n if (importPaths[imp]) {\n console.log(` ${importPaths[imp].join('\\n ')}`)\n }\n}\n\nexport function getUnlistedDependencies(\n { name, location }: Workspace,\n { dependencies, peerDependencies }: CheckPackageParams,\n {\n externalDistImports, externalDistTypeImports, distImportPaths,\n }: CheckSourceParams,\n) {\n let unlistedDependencies = 0\n\n for (const imp of externalDistImports) {\n if (!isListedOrBuiltin(imp, name, dependencies, peerDependencies)) {\n unlistedDependencies++\n logMissing(name, imp, distImportPaths)\n }\n }\n\n for (const imp of externalDistTypeImports) {\n if (!isListedOrBuiltin(imp, name, dependencies, peerDependencies)) {\n unlistedDependencies++\n logMissing(name, imp, distImportPaths)\n }\n }\n\n if (unlistedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unlistedDependencies\n}\n","import { builtinModules } from 'node:module'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function getUnlistedDevDependencies(\n { name, location }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n {\n allImportPaths, externalAllImports, distImports,\n }: CheckSourceParams,\n) {\n let unlistedDevDependencies = 0\n for (const imp of externalAllImports) {\n if (!distImports.includes(imp)\n && imp !== name\n && !dependencies.includes(imp)\n && !dependencies.includes(`@types/${imp}`)\n && !peerDependencies.includes(imp)\n && !peerDependencies.includes(`@types/${imp}`)\n && !devDependencies.includes(imp)\n && !devDependencies.includes(`@types/${imp}`)\n && !builtinModules.includes(imp)\n ) {\n unlistedDevDependencies++\n console.log(`[${chalk.blue(name)}] Missing devDependency in package.json: ${chalk.red(imp)}`)\n if (allImportPaths[imp]) {\n console.log(` ${allImportPaths[imp].join('\\n ')}`)\n }\n }\n }\n if (unlistedDevDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\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 externalDistImports,\n externalDistTypeImports,\n externalAllImports,\n }: CheckSourceParams,\n // Package names to skip (from xy.config deplint.exclude)\n exclude?: Set<string>,\n) {\n let unusedDependencies = 0\n for (const dep of dependencies) {\n if (exclude?.has(dep)) continue\n if (!externalDistImports.includes(dep)\n && !externalDistImports.includes(dep.replace(/^@types\\//, ''))\n && !externalDistTypeImports.includes(dep)\n && !externalDistTypeImports.includes(dep.replace(/^@types\\//, ''))) {\n unusedDependencies++\n if (externalAllImports.includes(dep)) {\n console.log(`[${chalk.blue(name)}] dependency should be devDependency in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused dependency in package.json: ${chalk.red(dep)}`)\n }\n }\n }\n if (unusedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unusedDependencies\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../lib/index.ts'\nimport { getCliReferencedPackagesFromFiles } from '../getCliReferencedPackagesFromFiles.ts'\nimport { getRequiredPeerDependencies } from '../getRequiredPeerDependencies.ts'\nimport { getScriptReferencedPackages } from '../getScriptReferencedPackages.ts'\nimport type { FileContext } from '../implicitDevDependencies.ts'\nimport { getImplicitDevDependencies } from '../implicitDevDependencies.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nconst allExternalImports = ({\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n}: CheckSourceParams) => {\n return new Set<string>([\n ...externalAllImports,\n ...externalDistImports,\n ...externalDistTypeImports,\n ])\n}\n\nfunction isDevDepUsed(\n dep: string,\n allImports: Set<string>,\n implicitDeps: Set<string>,\n requiredPeers: Set<string>,\n scriptRefs: Set<string>,\n cliRefs: Set<string>,\n) {\n if (implicitDeps.has(dep)) return true\n if (requiredPeers.has(dep)) return true\n if (scriptRefs.has(dep)) return true\n if (cliRefs.has(dep)) return true\n\n if (dep.startsWith('@types/')) {\n const baseName = dep.replace(/^@types\\//, '')\n return allImports.has(baseName) || allImports.has(dep) || implicitDeps.has(baseName)\n }\n\n return allImports.has(dep)\n}\n\nexport function getUnusedDevDependencies(\n { name, location }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n sourceParams: CheckSourceParams,\n fileContext: FileContext,\n // Package names to skip (from xy.config deplint.exclude)\n exclude?: Set<string>,\n) {\n const allImports = allExternalImports(sourceParams)\n const allDeps = [...dependencies, ...devDependencies, ...peerDependencies]\n const implicitDeps = getImplicitDevDependencies({\n ...fileContext, allDependencies: allDeps, location,\n })\n const requiredPeers = getRequiredPeerDependencies(location, allDeps)\n const scriptRefs = getScriptReferencedPackages(location, allDeps)\n // Detect packages referenced via child_process calls (execSync, spawn, etc.)\n // in source files, e.g. execSync('npx typedoc ...') marks typedoc as used.\n const cliRefs = getCliReferencedPackagesFromFiles(fileContext.allFiles, location, allDeps)\n let unusedDevDependencies = 0\n for (const dep of devDependencies) {\n if (exclude?.has(dep)) continue\n // Skip devDeps that are also declared as dependencies or peerDependencies\n if (dependencies.includes(dep) || peerDependencies.includes(dep)) continue\n\n if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs)) {\n unusedDevDependencies++\n console.log(`[${chalk.blue(name)}] Unused devDependency in package.json: ${chalk.red(dep)}`)\n }\n }\n if (unusedDevDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unusedDevDependencies\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport ts from 'typescript'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\nimport { getBinNames, tokenizeScript } from './getScriptReferencedPackages.ts'\n\n/**\n * Names of child_process functions that execute shell commands as a single\n * string (first argument is a command string to tokenize).\n */\nconst shellCommandFunctions = new Set(['execSync', 'exec'])\n\n/**\n * Names of child_process functions where the first argument is the\n * executable name directly (not a full shell command string).\n */\nconst directExecFunctions = new Set(['spawn', 'spawnSync', 'execFile', 'execFileSync'])\n\n/**\n * All child_process function names we scan for.\n */\nconst allExecFunctions = new Set([...shellCommandFunctions, ...directExecFunctions])\n\n/**\n * Extracts command strings from child_process calls (execSync, spawn, etc.)\n * found in a single source file.\n *\n * For shell-style calls (execSync, exec) the first argument is a command\n * string like \"npx typedoc --options foo\" — we tokenize it and return the\n * tokens. For direct-exec calls (spawn, spawnSync, execFile, execFileSync)\n * the first argument is the executable name itself.\n */\nfunction getCommandTokensFromFile(filePath: string): Set<string> {\n const tokens = new Set<string>()\n let sourceCode: string\n try {\n sourceCode = fs.readFileSync(filePath, 'utf8')\n } catch {\n return tokens\n }\n\n const isMjsFile = filePath.endsWith('.mjs')\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n isMjsFile ? ts.ScriptKind.JS : undefined,\n )\n\n function visit(node: ts.Node) {\n if (ts.isCallExpression(node) && node.arguments.length > 0) {\n const fnName = getFunctionName(node.expression)\n if (fnName && allExecFunctions.has(fnName)) {\n const firstArg = node.arguments[0]\n if (ts.isStringLiteral(firstArg) || ts.isNoSubstitutionTemplateLiteral(firstArg)) {\n const value = firstArg.text\n if (shellCommandFunctions.has(fnName)) {\n // Shell command string — tokenize to extract the executable and args\n for (const token of tokenizeScript(value)) {\n tokens.add(token)\n }\n } else {\n // Direct exec — first arg is the executable name\n tokens.add(value)\n }\n } else if (ts.isTemplateExpression(firstArg)) {\n // Template literal like `npx typedoc --options ${path}` — extract\n // the static head which usually contains the command name\n const head = firstArg.head.text\n if (head) {\n for (const token of tokenizeScript(head)) {\n tokens.add(token)\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return tokens\n}\n\n/**\n * Resolves the function name from a call expression, handling both direct\n * calls like `execSync(...)` and qualified calls like `child_process.execSync(...)`.\n */\nfunction getFunctionName(expr: ts.Expression): string | undefined {\n if (ts.isIdentifier(expr)) {\n return expr.text\n }\n if (ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.name)) {\n return expr.name.text\n }\n return undefined\n}\n\n/**\n * Scans source files for child_process calls (execSync, spawn, etc.) and\n * resolves referenced packages by matching command tokens against known\n * dependency binary names.\n *\n * This complements getScriptReferencedPackages (which scans package.json\n * scripts) by catching CLI usage in actual source code, e.g.:\n * execSync(`npx typedoc --options ${configPath}`)\n * spawnSync('eslint', ['--fix', '.'])\n */\nexport function getCliReferencedPackagesFromFiles(\n allFiles: string[],\n location: string,\n allDeps: string[],\n): Set<string> {\n // Collect all command tokens from every source file\n const allTokens = new Set<string>()\n for (const file of allFiles) {\n for (const token of getCommandTokensFromFile(file)) {\n allTokens.add(token)\n }\n }\n\n if (allTokens.size === 0) return new Set()\n\n // Build bin-name -> package-name map (same approach as getScriptReferencedPackages)\n const binToPackage = new Map<string, string>()\n for (const dep of allDeps) {\n for (const bin of getBinNames(location, dep)) {\n binToPackage.set(bin, dep)\n }\n }\n\n const referenced = new Set<string>()\n for (const token of allTokens) {\n // Direct package name match\n const baseName = getBasePackageName(token)\n if (allDeps.includes(baseName)) {\n referenced.add(baseName)\n }\n // Binary name match (e.g. token \"typedoc\" -> package \"typedoc\")\n const pkg = binToPackage.get(token)\n if (pkg) {\n referenced.add(pkg)\n }\n }\n\n return referenced\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nexport function getBinNames(location: string, dep: string): string[] {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) return []\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n if (!pkg.bin) return []\n if (typeof pkg.bin === 'string') return [pkg.name?.split('/').pop() ?? dep]\n return Object.keys(pkg.bin)\n } catch {\n return []\n }\n}\n\nexport function tokenizeScript(script: string): string[] {\n // Split on shell operators and whitespace to get command tokens\n return script\n .split(/[&|;$()\"`\\s]+/)\n .map(t => t.trim())\n .filter(Boolean)\n}\n\n/**\n * Scans package.json scripts for references to installed packages,\n * either by package name or by binary name they provide.\n */\nexport function getScriptReferencedPackages(\n location: string,\n allDeps: string[],\n): Set<string> {\n const pkgPath = path.join(location, 'package.json')\n let scripts: Record<string, string> = {}\n try {\n const raw = fs.readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n scripts = pkg.scripts ?? {}\n } catch {\n return new Set()\n }\n\n const scriptText = Object.values(scripts).join(' ')\n const tokens = new Set(tokenizeScript(scriptText))\n\n // Build a map from bin name -> package name\n const binToPackage = new Map<string, string>()\n for (const dep of allDeps) {\n const bins = getBinNames(location, dep)\n for (const bin of bins) {\n binToPackage.set(bin, dep)\n }\n }\n\n const referenced = new Set<string>()\n for (const token of tokens) {\n // Direct package name match (e.g. \"yarn rimraf\" -> token \"rimraf\")\n const baseName = getBasePackageName(token)\n if (allDeps.includes(baseName)) {\n referenced.add(baseName)\n }\n // Binary name match (e.g. \"tsup\" -> @xylabs/ts-scripts-yarn3 provides \"tsup\"? no, tsup provides \"tsup\")\n const pkg = binToPackage.get(token)\n if (pkg) {\n referenced.add(pkg)\n }\n }\n\n return referenced\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function findDepPackageJson(location: string, dep: string): string | undefined {\n let dir = location\n while (true) {\n const candidate = path.join(dir, 'node_modules', dep, 'package.json')\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\n/**\n * Collects the peerDependencies declared by all of a package's\n * dependencies and devDependencies. A devDependency that satisfies\n * one of these peer requirements should not be flagged as unused.\n */\nexport function getRequiredPeerDependencies(\n location: string,\n allDeps: string[],\n): Set<string> {\n const required = new Set<string>()\n for (const dep of allDeps) {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) continue\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n if (pkg.peerDependencies) {\n for (const peer of Object.keys(pkg.peerDependencies)) {\n required.add(peer)\n }\n }\n } catch {\n // Package not readable — skip\n }\n }\n return required\n}\n","import fs from 'node:fs'\n\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nexport interface ImplicitDevDependencyRule {\n isNeeded: (context: ImplicitDepContext) => boolean\n package: string\n}\n\nexport interface FileContext {\n allFiles: string[]\n distFiles: string[]\n}\n\nexport interface ImplicitDepContext extends FileContext {\n allDependencies: string[]\n location: string\n}\n\nconst hasFileWithExtension = (files: string[], extensions: string[]) =>\n files.some(f => extensions.some(ext => f.endsWith(ext)))\n\nconst tsExtensions = ['.ts', '.tsx', '.mts', '.cts']\n\nconst hasTypescriptFiles = ({ allFiles }: ImplicitDepContext) =>\n hasFileWithExtension(allFiles, tsExtensions)\n\n// Matches decorator usage: @something at the start of a line (after optional whitespace).\n// Safe from JSDoc false positives since those appear after * in comment blocks.\nconst decoratorPattern = /^\\s*@[a-zA-Z]\\w*/m\n\nconst hasDecorators = ({ allFiles }: ImplicitDepContext) =>\n allFiles\n .filter(f => tsExtensions.some(ext => f.endsWith(ext)))\n .some((file) => {\n try {\n const content = fs.readFileSync(file, 'utf8')\n return decoratorPattern.test(content)\n } catch {\n return false\n }\n })\n\nconst importPlugins = new Set(['eslint-plugin-import-x', 'eslint-plugin-import'])\n\n/**\n * Checks whether any dependency (direct or transitive) pulls in\n * one of the eslint import plugins that require a resolver.\n */\nfunction hasImportPlugin({ location, allDependencies }: ImplicitDepContext): boolean {\n // Direct dependency on the plugin\n if (allDependencies.some(d => importPlugins.has(d))) return true\n\n // Transitive: a dependency bundles the plugin as a dep or peer\n for (const dep of allDependencies) {\n const pkgPath = findDepPackageJson(location, dep)\n if (!pkgPath) continue\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))\n const transitiveDeps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.peerDependencies ?? {}),\n ]\n if (transitiveDeps.some(d => importPlugins.has(d))) return true\n } catch {\n // skip unreadable packages\n }\n }\n return false\n}\n\nconst hasVitest = ({ allDependencies }: ImplicitDepContext) =>\n allDependencies.includes('vitest')\n\nconst rules: ImplicitDevDependencyRule[] = [\n {\n package: 'typescript',\n isNeeded: hasTypescriptFiles,\n },\n {\n package: 'eslint-import-resolver-typescript',\n isNeeded: context =>\n hasTypescriptFiles(context)\n && context.allDependencies.includes('eslint')\n && hasImportPlugin(context),\n },\n {\n package: 'tslib',\n isNeeded: hasDecorators,\n },\n {\n package: '@vitest/coverage-v8',\n isNeeded: hasVitest,\n },\n]\n\nexport function getImplicitDevDependencies(context: ImplicitDepContext): Set<string> {\n const implicit = new Set<string>()\n for (const rule of rules) {\n if (rule.isNeeded(context)) {\n implicit.add(rule.package)\n }\n }\n return implicit\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, dependencies }: CheckPackageParams,\n { externalDistImports, externalDistTypeImports }: CheckSourceParams,\n // Package names to skip (from xy.config deplint.exclude)\n exclude?: Set<string>,\n) {\n let unusedDependencies = 0\n for (const dep of peerDependencies) {\n if (exclude?.has(dep)) continue\n if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\\//, ''))\n && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\\//, ''))) {\n unusedDependencies++\n if (dependencies.includes(dep)) {\n console.log(`[${chalk.blue(name)}] Unused peerDependency [already a dependency] in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused peerDependency in package.json: ${chalk.red(dep)}`)\n }\n }\n }\n if (unusedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\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 { getExtendsFromTsconfigs } from '../getExtendsFromTsconfigs.ts'\nimport { getExternalImportsFromFiles } from '../getExternalImportsFromFiles.ts'\nimport { getUnlistedDependencies } from './getUnlistedDependencies.ts'\nimport { getUnlistedDevDependencies } from './getUnlistedDevDependencies.ts'\nimport { getUnusedDependencies } from './getUnusedDependencies.ts'\nimport { getUnusedDevDependencies } from './getUnusedDevDependencies.ts'\nimport { getUnusedPeerDependencies } from './getUnusedPeerDependencies.ts'\n\nexport interface CheckPackageOptions {\n deps?: boolean\n devDeps?: boolean\n /**\n * Set of package names to exclude from unused-dependency checks.\n * Loaded from xy.config's deplint.exclude field.\n */\n exclude?: Set<string>\n peerDeps?: boolean\n verbose?: boolean\n}\n\nfunction logVerbose(\n name: string,\n location: string,\n allFiles: string[],\n distFiles: string[],\n tsconfigExtends: string[],\n) {\n console.info(`Checking package: ${name} at ${location}`)\n console.info(`All files: ${allFiles.length}, Distribution files: ${distFiles.length}`)\n for (const file of allFiles) {\n console.info(`File: ${file}`)\n }\n for (const file of distFiles) {\n console.info(`Distribution file: ${file}`)\n }\n for (const ext of tsconfigExtends) {\n console.info(`Tsconfig extends: ${ext}`)\n }\n}\n\nexport function checkPackage({\n name, location, deps = false, devDeps = false, exclude, peerDeps = false, verbose = false,\n}: CheckPackageOptions & Workspace) {\n const { allFiles, distFiles } = findFiles(location)\n const tsconfigExtends = getExtendsFromTsconfigs(location)\n if (verbose) {\n logVerbose(name, location, allFiles, distFiles, tsconfigExtends)\n }\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({\n allFiles, distFiles, tsconfigExtends,\n })\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, exclude) : 0\n const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0\n const fileContext = { allFiles, distFiles }\n const unusedDevDependencies = checkDevDeps\n ? getUnusedDevDependencies({ name, location }, packageParams, sourceParams, fileContext, exclude)\n : 0\n const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams, exclude) : 0\n\n const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + unusedDevDependencies + unusedPeerDependencies\n return totalErrors\n}\n"],"mappings":";AAAA,OAAO,QAAQ;;;ACAf,SAAS,gBAAgB;AAElB,SAAS,gBAAgB,KAAa,SAAiB,QAAmB;AAC/E,SAAO,SAAS,SAAS;AAAA,IACvB;AAAA,IAAK,UAAU;AAAA,IAAM;AAAA,IAAQ,OAAO;AAAA,EACtC,CAAC;AACH;;;ADFA,IAAM,iBAAiB;AAEvB,SAAS,oBAAoB,UAA4B;AACvD,MAAI;AACF,UAAM,MAAM,GAAG,aAAa,GAAG,QAAQ,iBAAiB,MAAM;AAC9D,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAO,IAAI,cAAc,CAAC;AAAA,EAC5B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,UAAU,UAAkB;AAC1C,QAAM,mBAAmB,oBAAoB,QAAQ,EAAE,IAAI,OAAK,GAAG,CAAC,KAAK;AACzE,QAAM,SAAS,CAAC,sBAAsB,WAAW,GAAG,gBAAgB;AACpE,QAAM,WAAW,gBAAgB,UAAU,QAAQ,cAAc,IAAI,MAAM;AAC3E,QAAM,YAAY;AAAA,IAChB,GAAG,gBAAgB,UAAU,kBAAkB;AAAA,IAC/C,GAAG,gBAAgB,UAAU,aAAa,cAAc,EAAE;AAAA,EAC5D;AAEA,SAAO,EAAE,UAAU,UAAU;AAC/B;;;AE1BA,OAAOA,SAAQ;AACf,OAAO,UAAU;AAEV,SAAS,+BAA+B,iBAAyB;AACtE,QAAM,sBAAsB,KAAK,QAAQ,eAAe;AACxD,QAAM,aAAaA,IAAG,aAAa,qBAAqB,MAAM;AAC9D,QAAM,cAAc,KAAK,MAAM,UAAU;AAEzC,QAAM,eAAe,YAAY,eAC7B,OAAO,KAAK,YAAY,YAAY,IACpC,CAAC;AAEL,QAAM,kBAAkB,YAAY,kBAChC,OAAO,KAAK,YAAY,eAAe,IACvC,CAAC;AAEL,QAAM,mBAAmB,YAAY,mBACjC,OAAO,KAAK,YAAY,gBAAgB,IACxC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IAAc;AAAA,IAAiB;AAAA,EACjC;AACF;;;ACvBA,OAAOC,SAAQ;AAEf,SAAS,YAAAC,iBAAgB;;;ACFlB,SAAS,mBAAmB,YAAoB;AACrD,QAAM,qBAAqB,WAAW,WAAW,KAAK,EAAE,EAAE,KAAK;AAC/D,MAAI,mBAAmB,WAAW,GAAG,GAAG;AACtC,UAAM,QAAQ,mBAAmB,MAAM,GAAG;AAC1C,WAAO,MAAM,UAAU,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK;AAAA,EACzD;AACA,SAAO,mBAAmB,MAAM,GAAG,EAAE,CAAC;AACxC;;;ADDA,IAAM,sBAAsB,CAAC,QAAgB,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,WAAW,GAAG;AAExF,SAAS,kBAAkB,OAA0B;AACnD,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC5C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACvF,SAAO,CAAC;AACV;AAEO,SAAS,wBAAwB,UAA4B;AAClE,QAAM,gBAAgBC,UAAS,oBAAoB,EAAE,KAAK,UAAU,UAAU,KAAK,CAAC;AACpF,QAAM,WAAW,oBAAI,IAAY;AAEjC,aAAW,QAAQ,eAAe;AAChC,QAAI;AACF,YAAM,UAAUC,IAAG,aAAa,MAAM,MAAM;AAE5C,YAAM,UAAU,QACb,WAAW,WAAW,EAAE,EACxB,WAAW,gBAAgB,IAAI;AAClC,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,YAAM,OAAO,kBAAkB,OAAO,OAAO;AAC7C,iBAAW,OAAO,MAAM;AACtB,YAAI,oBAAoB,GAAG,GAAG;AAC5B,mBAAS,IAAI,mBAAmB,GAAG,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,QAAQ;AACrB;;;AEtCA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,OAAO,QAAQ;AAIR,SAAS,uBAAuB,QAAmC;AACxE,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,QAAQ;AAC7B,UAAM,MAAM,OAAO;AAGnB,UAAM,OAA2B,OAAO,QAAQ,WAAW,MAAO,KAAa;AAC/E,WAAO,SAAS,GAAG,WAAW;AAAA,EAChC;AAGA,SAAQ,OAAe;AACzB;AAEO,SAAS,mBAAmB,UAAkB,aAAuC,iBAA2C;AACrI,QAAM,aAAaC,IAAG,aAAa,UAAU,MAAM;AAEnD,QAAM,YAAY,SAAS,SAAS,MAAM;AAE1C,QAAM,aAAa,GAAG;AAAA,IACpBC,MAAK,SAAS,QAAQ;AAAA,IACtB;AAAA,IACA,GAAG,aAAa;AAAA,IAChB;AAAA,IACA,YAAY,GAAG,WAAW,KAAK;AAAA,EACjC;AAEA,QAAM,UAAoB,CAAC;AAC3B,QAAM,cAAwB,CAAC;AAE/B,QAAMC,qBAAoB,SAAS,SAAS,OAAO;AAEnD,WAAS,MAAM,MAAe;AAC5B,QAAI,GAAG,oBAAoB,IAAI,KAAK,GAAG,oBAAoB,IAAI,GAAG;AAChE,YAAM,kBAAmB,KAAK,iBAAkB,YAAY;AAC5D,YAAM,eAAe,GAAG,oBAAoB,IAAI,IAAI,uBAAuB,KAAK,YAAY,IAAI;AAChG,UAAI,OAAO,oBAAoB,UAAU;AACvC,cAAM,UAAU,gBAAgB,WAAW,KAAK,EAAE,EAAE,WAAW,KAAK,EAAE,EAAE,KAAK;AAE7E,YAAI,gBAAgBA,oBAAmB;AACrC,sBAAY,KAAK,OAAO;AAAA,QAC1B,OAAO;AACL,kBAAQ,KAAK,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,IACF,WAAW,GAAG,iBAAiB,IAAI,KAAK,KAAK,WAAW,SAAS,GAAG,WAAW,eAAe;AAC5F,YAAM,CAAC,GAAG,IAAI,KAAK;AACnB,UAAI,GAAG,gBAAgB,GAAG,GAAG;AAC3B,gBAAQ,KAAK,IAAI,IAAI;AAAA,MACvB;AAAA,IACF,WACE,GAAG,iBAAiB,IAAI,KACrB,GAAG,aAAa,KAAK,UAAU,KAC/B,KAAK,WAAW,SAAS,aACzB,KAAK,UAAU,SAAS,KACxB,GAAG,gBAAgB,KAAK,UAAU,CAAC,CAAC,GACvC;AACA,cAAQ,KAAK,KAAK,UAAU,CAAC,EAAE,IAAI;AAAA,IACrC;AACA,OAAG,aAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU;AAEhB,QAAM,4BAA4B,CAAC,KAAK,KAAK,OAAO;AAEpD,QAAM,gBAAgB,CAAC,QACrB,CAAC,0BAA0B,KAAK,SAAO,IAAI,WAAW,GAAG,CAAC,KACvD,CAAC,IAAI,SAAS,GAAG,KACjB,CAAC,IAAI,SAAS,GAAG;AAEtB,QAAM,iBAAiB,QAAQ,OAAO,aAAa,EAAE,IAAI,kBAAkB;AAC3E,QAAM,qBAAqB,YAAY,OAAO,aAAa,EAAE,IAAI,kBAAkB;AAEnF,aAAW,OAAO,gBAAgB;AAChC,gBAAY,GAAG,IAAI,YAAY,GAAG,KAAK,CAAC;AACxC,gBAAY,GAAG,EAAE,KAAK,QAAQ;AAAA,EAChC;AAEA,aAAW,OAAO,oBAAoB;AACpC,oBAAgB,GAAG,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAChD,oBAAgB,GAAG,EAAE,KAAK,QAAQ;AAAA,EACpC;AAEA,SAAO,CAAC,gBAAgB,kBAAkB;AAC5C;;;AC5FA,IAAM,yBAAyB,CAAC,KAAK,KAAK,OAAO;AAEjD,IAAM,wBAAwB,CAAC,YAAsB;AACnD,SAAO,QAAQ,OAAO,SAAO,CAAC,uBAAuB,KAAK,YAAU,IAAI,WAAW,MAAM,CAAC,CAAC;AAC7F;AAEA,IAAM,oBAAoB,CAAC,SACzB,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,QAAQ;AAEtE,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EAAU;AAAA,EAAW,kBAAkB,CAAC;AAC1C,GAIsB;AACpB,QAAM,iBAA2C,CAAC;AAClD,QAAM,kBAA4C,CAAC;AACnD,QAAM,sBAAgD,CAAC;AAEvD,aAAWC,SAAQ,SAAU,oBAAmBA,OAAM,gBAAgB,cAAc,EAAE,KAAK;AAE3F,QAAM,gBAAgB,UAAU,OAAO,iBAAiB;AACxD,QAAM,gBAAgB,UAAU,OAAO,UAAQ,CAAC,kBAAkB,IAAI,CAAC;AACvE,aAAWA,SAAQ,cAAe,oBAAmBA,OAAM,iBAAiB,eAAe,EAAE,KAAK;AAClG,aAAWA,SAAQ,cAAe,oBAAmBA,OAAM,qBAAqB,mBAAmB,EAAE,KAAK;AAE1G,QAAM,aAAa,OAAO,KAAK,cAAc;AAC7C,QAAM,cAAc,OAAO,KAAK,eAAe;AAE/C,QAAM,qBAAqB,sBAAsB,UAAU;AAC3D,QAAM,sBAAsB,sBAAsB,WAAW;AAC7D,QAAM,0BAA0B,sBAAsB,OAAO,KAAK,mBAAmB,CAAC;AAGtF,aAAW,OAAO,iBAAiB;AACjC,QAAI,CAAC,mBAAmB,SAAS,GAAG,EAAG,oBAAmB,KAAK,GAAG;AAAA,EACpE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnDA,SAAS,sBAAsB;AAE/B,OAAO,WAAW;AAKlB,SAAS,kBACP,KACA,MACA,cACA,kBACA;AACA,SAAO,aAAa,SAAS,GAAG,KAC3B,QAAQ,QACR,aAAa,SAAS,UAAU,GAAG,EAAE,KACrC,iBAAiB,SAAS,GAAG,KAC7B,iBAAiB,SAAS,UAAU,GAAG,EAAE,KACzC,eAAe,SAAS,GAAG,KAC3B,eAAe,SAAS,UAAU,GAAG,EAAE;AAC9C;AAEA,SAAS,WAAW,MAAc,KAAa,aAAuC;AACpF,UAAQ,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,yCAAyC,MAAM,IAAI,GAAG,CAAC,EAAE;AACzF,MAAI,YAAY,GAAG,GAAG;AACpB,YAAQ,IAAI,KAAK,YAAY,GAAG,EAAE,KAAK,KAAK,CAAC,EAAE;AAAA,EACjD;AACF;AAEO,SAAS,wBACd,EAAE,MAAM,SAAS,GACjB,EAAE,cAAc,iBAAiB,GACjC;AAAA,EACE;AAAA,EAAqB;AAAA,EAAyB;AAChD,GACA;AACA,MAAI,uBAAuB;AAE3B,aAAW,OAAO,qBAAqB;AACrC,QAAI,CAAC,kBAAkB,KAAK,MAAM,cAAc,gBAAgB,GAAG;AACjE;AACA,iBAAW,MAAM,KAAK,eAAe;AAAA,IACvC;AAAA,EACF;AAEA,aAAW,OAAO,yBAAyB;AACzC,QAAI,CAAC,kBAAkB,KAAK,MAAM,cAAc,gBAAgB,GAAG;AACjE;AACA,iBAAW,MAAM,KAAK,eAAe;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,uBAAuB,GAAG;AAC5B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAK,MAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;;;ACzDA,SAAS,kBAAAC,uBAAsB;AAE/B,OAAOC,YAAW;AAKX,SAAS,2BACd,EAAE,MAAM,SAAS,GACjB;AAAA,EACE;AAAA,EAAiB;AAAA,EAAc;AACjC,GACA;AAAA,EACE;AAAA,EAAgB;AAAA,EAAoB;AACtC,GACA;AACA,MAAI,0BAA0B;AAC9B,aAAW,OAAO,oBAAoB;AACpC,QAAI,CAAC,YAAY,SAAS,GAAG,KACxB,QAAQ,QACR,CAAC,aAAa,SAAS,GAAG,KAC1B,CAAC,aAAa,SAAS,UAAU,GAAG,EAAE,KACtC,CAAC,iBAAiB,SAAS,GAAG,KAC9B,CAAC,iBAAiB,SAAS,UAAU,GAAG,EAAE,KAC1C,CAAC,gBAAgB,SAAS,GAAG,KAC7B,CAAC,gBAAgB,SAAS,UAAU,GAAG,EAAE,KACzC,CAACD,gBAAe,SAAS,GAAG,GAC/B;AACA;AACA,cAAQ,IAAI,IAAIC,OAAM,KAAK,IAAI,CAAC,4CAA4CA,OAAM,IAAI,GAAG,CAAC,EAAE;AAC5F,UAAI,eAAe,GAAG,GAAG;AACvB,gBAAQ,IAAI,KAAK,eAAe,GAAG,EAAE,KAAK,KAAK,CAAC,EAAE;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACA,MAAI,0BAA0B,GAAG;AAC/B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAKA,OAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;;;ACxCA,OAAOC,YAAW;AAKX,SAAS,sBACd,EAAE,MAAM,SAAS,GACjB,EAAE,aAAa,GACf;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAEA,SACA;AACA,MAAI,qBAAqB;AACzB,aAAW,OAAO,cAAc;AAC9B,QAAI,SAAS,IAAI,GAAG,EAAG;AACvB,QAAI,CAAC,oBAAoB,SAAS,GAAG,KAChC,CAAC,oBAAoB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,KAC1D,CAAC,wBAAwB,SAAS,GAAG,KACrC,CAAC,wBAAwB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,GAAG;AACpE;AACA,UAAI,mBAAmB,SAAS,GAAG,GAAG;AACpC,gBAAQ,IAAI,IAAIA,OAAM,KAAK,IAAI,CAAC,yDAAyDA,OAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC3G,OAAO;AACL,gBAAQ,IAAI,IAAIA,OAAM,KAAK,IAAI,CAAC,wCAAwCA,OAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,MAAI,qBAAqB,GAAG;AAC1B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAKA,OAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;;;ACpCA,OAAOC,YAAW;;;ACAlB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,OAAOC,SAAQ;;;ACHf,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACDjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEV,SAAS,mBAAmB,UAAkB,KAAiC;AACpF,MAAI,MAAM;AACV,SAAO,MAAM;AACX,UAAM,YAAYA,MAAK,KAAK,KAAK,gBAAgB,KAAK,cAAc;AACpE,QAAID,IAAG,WAAW,SAAS,EAAG,QAAO;AACrC,UAAM,SAASC,MAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAOO,SAAS,4BACd,UACA,SACa;AACb,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,OAAO,SAAS;AACzB,UAAM,aAAa,mBAAmB,UAAU,GAAG;AACnD,QAAI,CAAC,WAAY;AACjB,QAAI;AACF,YAAM,MAAMD,IAAG,aAAa,YAAY,MAAM;AAC9C,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,UAAI,IAAI,kBAAkB;AACxB,mBAAW,QAAQ,OAAO,KAAK,IAAI,gBAAgB,GAAG;AACpD,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;ADlCO,SAAS,YAAY,UAAkB,KAAuB;AACnE,QAAM,aAAa,mBAAmB,UAAU,GAAG;AACnD,MAAI,CAAC,WAAY,QAAO,CAAC;AACzB,MAAI;AACF,UAAM,MAAME,IAAG,aAAa,YAAY,MAAM;AAC9C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,QAAI,CAAC,IAAI,IAAK,QAAO,CAAC;AACtB,QAAI,OAAO,IAAI,QAAQ,SAAU,QAAO,CAAC,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK,GAAG;AAC1E,WAAO,OAAO,KAAK,IAAI,GAAG;AAAA,EAC5B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,eAAe,QAA0B;AAEvD,SAAO,OACJ,MAAM,eAAe,EACrB,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AACnB;AAMO,SAAS,4BACd,UACA,SACa;AACb,QAAM,UAAUC,MAAK,KAAK,UAAU,cAAc;AAClD,MAAI,UAAkC,CAAC;AACvC,MAAI;AACF,UAAM,MAAMD,IAAG,aAAa,SAAS,MAAM;AAC3C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,cAAU,IAAI,WAAW,CAAC;AAAA,EAC5B,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,aAAa,OAAO,OAAO,OAAO,EAAE,KAAK,GAAG;AAClD,QAAM,SAAS,IAAI,IAAI,eAAe,UAAU,CAAC;AAGjD,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,OAAO,SAAS;AACzB,UAAM,OAAO,YAAY,UAAU,GAAG;AACtC,eAAW,OAAO,MAAM;AACtB,mBAAa,IAAI,KAAK,GAAG;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,SAAS,QAAQ;AAE1B,UAAM,WAAW,mBAAmB,KAAK;AACzC,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,iBAAW,IAAI,QAAQ;AAAA,IACzB;AAEA,UAAM,MAAM,aAAa,IAAI,KAAK;AAClC,QAAI,KAAK;AACP,iBAAW,IAAI,GAAG;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;;;AD7DA,IAAM,wBAAwB,oBAAI,IAAI,CAAC,YAAY,MAAM,CAAC;AAM1D,IAAM,sBAAsB,oBAAI,IAAI,CAAC,SAAS,aAAa,YAAY,cAAc,CAAC;AAKtF,IAAM,mBAAmB,oBAAI,IAAI,CAAC,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;AAWnF,SAAS,yBAAyB,UAA+B;AAC/D,QAAM,SAAS,oBAAI,IAAY;AAC/B,MAAI;AACJ,MAAI;AACF,iBAAaE,IAAG,aAAa,UAAU,MAAM;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,SAAS,MAAM;AAC1C,QAAM,aAAaC,IAAG;AAAA,IACpBC,MAAK,SAAS,QAAQ;AAAA,IACtB;AAAA,IACAD,IAAG,aAAa;AAAA,IAChB;AAAA,IACA,YAAYA,IAAG,WAAW,KAAK;AAAA,EACjC;AAEA,WAAS,MAAM,MAAe;AAC5B,QAAIA,IAAG,iBAAiB,IAAI,KAAK,KAAK,UAAU,SAAS,GAAG;AAC1D,YAAM,SAAS,gBAAgB,KAAK,UAAU;AAC9C,UAAI,UAAU,iBAAiB,IAAI,MAAM,GAAG;AAC1C,cAAM,WAAW,KAAK,UAAU,CAAC;AACjC,YAAIA,IAAG,gBAAgB,QAAQ,KAAKA,IAAG,gCAAgC,QAAQ,GAAG;AAChF,gBAAM,QAAQ,SAAS;AACvB,cAAI,sBAAsB,IAAI,MAAM,GAAG;AAErC,uBAAW,SAAS,eAAe,KAAK,GAAG;AACzC,qBAAO,IAAI,KAAK;AAAA,YAClB;AAAA,UACF,OAAO;AAEL,mBAAO,IAAI,KAAK;AAAA,UAClB;AAAA,QACF,WAAWA,IAAG,qBAAqB,QAAQ,GAAG;AAG5C,gBAAM,OAAO,SAAS,KAAK;AAC3B,cAAI,MAAM;AACR,uBAAW,SAAS,eAAe,IAAI,GAAG;AACxC,qBAAO,IAAI,KAAK;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAAA,IAAG,aAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU;AAChB,SAAO;AACT;AAMA,SAAS,gBAAgB,MAAyC;AAChE,MAAIA,IAAG,aAAa,IAAI,GAAG;AACzB,WAAO,KAAK;AAAA,EACd;AACA,MAAIA,IAAG,2BAA2B,IAAI,KAAKA,IAAG,aAAa,KAAK,IAAI,GAAG;AACrE,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO;AACT;AAYO,SAAS,kCACd,UACA,UACA,SACa;AAEb,QAAM,YAAY,oBAAI,IAAY;AAClC,aAAW,QAAQ,UAAU;AAC3B,eAAW,SAAS,yBAAyB,IAAI,GAAG;AAClD,gBAAU,IAAI,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,EAAG,QAAO,oBAAI,IAAI;AAGzC,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,OAAO,SAAS;AACzB,eAAW,OAAO,YAAY,UAAU,GAAG,GAAG;AAC5C,mBAAa,IAAI,KAAK,GAAG;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,SAAS,WAAW;AAE7B,UAAM,WAAW,mBAAmB,KAAK;AACzC,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,iBAAW,IAAI,QAAQ;AAAA,IACzB;AAEA,UAAM,MAAM,aAAa,IAAI,KAAK;AAClC,QAAI,KAAK;AACP,iBAAW,IAAI,GAAG;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;;;AGrJA,OAAOE,SAAQ;AAmBf,IAAM,uBAAuB,CAAC,OAAiB,eAC7C,MAAM,KAAK,OAAK,WAAW,KAAK,SAAO,EAAE,SAAS,GAAG,CAAC,CAAC;AAEzD,IAAM,eAAe,CAAC,OAAO,QAAQ,QAAQ,MAAM;AAEnD,IAAM,qBAAqB,CAAC,EAAE,SAAS,MACrC,qBAAqB,UAAU,YAAY;AAI7C,IAAM,mBAAmB;AAEzB,IAAM,gBAAgB,CAAC,EAAE,SAAS,MAChC,SACG,OAAO,OAAK,aAAa,KAAK,SAAO,EAAE,SAAS,GAAG,CAAC,CAAC,EACrD,KAAK,CAAC,SAAS;AACd,MAAI;AACF,UAAM,UAAUC,IAAG,aAAa,MAAM,MAAM;AAC5C,WAAO,iBAAiB,KAAK,OAAO;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF,CAAC;AAEL,IAAM,gBAAgB,oBAAI,IAAI,CAAC,0BAA0B,sBAAsB,CAAC;AAMhF,SAAS,gBAAgB,EAAE,UAAU,gBAAgB,GAAgC;AAEnF,MAAI,gBAAgB,KAAK,OAAK,cAAc,IAAI,CAAC,CAAC,EAAG,QAAO;AAG5D,aAAW,OAAO,iBAAiB;AACjC,UAAM,UAAU,mBAAmB,UAAU,GAAG;AAChD,QAAI,CAAC,QAAS;AACd,QAAI;AACF,YAAM,MAAM,KAAK,MAAMA,IAAG,aAAa,SAAS,MAAM,CAAC;AACvD,YAAM,iBAAiB;AAAA,QACrB,GAAG,OAAO,KAAK,IAAI,gBAAgB,CAAC,CAAC;AAAA,QACrC,GAAG,OAAO,KAAK,IAAI,oBAAoB,CAAC,CAAC;AAAA,MAC3C;AACA,UAAI,eAAe,KAAK,OAAK,cAAc,IAAI,CAAC,CAAC,EAAG,QAAO;AAAA,IAC7D,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,EAAE,gBAAgB,MACnC,gBAAgB,SAAS,QAAQ;AAEnC,IAAM,QAAqC;AAAA,EACzC;AAAA,IACE,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,UAAU,aACR,mBAAmB,OAAO,KACvB,QAAQ,gBAAgB,SAAS,QAAQ,KACzC,gBAAgB,OAAO;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,2BAA2B,SAA0C;AACnF,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,eAAS,IAAI,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;;;AJ9FA,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,SAAO,oBAAI,IAAY;AAAA,IACrB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AACH;AAEA,SAAS,aACP,KACA,YACA,cACA,eACA,YACA,SACA;AACA,MAAI,aAAa,IAAI,GAAG,EAAG,QAAO;AAClC,MAAI,cAAc,IAAI,GAAG,EAAG,QAAO;AACnC,MAAI,WAAW,IAAI,GAAG,EAAG,QAAO;AAChC,MAAI,QAAQ,IAAI,GAAG,EAAG,QAAO;AAE7B,MAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,UAAM,WAAW,IAAI,QAAQ,aAAa,EAAE;AAC5C,WAAO,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,QAAQ;AAAA,EACrF;AAEA,SAAO,WAAW,IAAI,GAAG;AAC3B;AAEO,SAAS,yBACd,EAAE,MAAM,SAAS,GACjB;AAAA,EACE;AAAA,EAAiB;AAAA,EAAc;AACjC,GACA,cACA,aAEA,SACA;AACA,QAAM,aAAa,mBAAmB,YAAY;AAClD,QAAM,UAAU,CAAC,GAAG,cAAc,GAAG,iBAAiB,GAAG,gBAAgB;AACzE,QAAM,eAAe,2BAA2B;AAAA,IAC9C,GAAG;AAAA,IAAa,iBAAiB;AAAA,IAAS;AAAA,EAC5C,CAAC;AACD,QAAM,gBAAgB,4BAA4B,UAAU,OAAO;AACnE,QAAM,aAAa,4BAA4B,UAAU,OAAO;AAGhE,QAAM,UAAU,kCAAkC,YAAY,UAAU,UAAU,OAAO;AACzF,MAAI,wBAAwB;AAC5B,aAAW,OAAO,iBAAiB;AACjC,QAAI,SAAS,IAAI,GAAG,EAAG;AAEvB,QAAI,aAAa,SAAS,GAAG,KAAK,iBAAiB,SAAS,GAAG,EAAG;AAElE,QAAI,CAAC,aAAa,KAAK,YAAY,cAAc,eAAe,YAAY,OAAO,GAAG;AACpF;AACA,cAAQ,IAAI,IAAIC,OAAM,KAAK,IAAI,CAAC,2CAA2CA,OAAM,IAAI,GAAG,CAAC,EAAE;AAAA,IAC7F;AAAA,EACF;AACA,MAAI,wBAAwB,GAAG;AAC7B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAKA,OAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;;;AK/EA,OAAOC,YAAW;AAKX,SAAS,0BACd,EAAE,MAAM,SAAS,GACjB,EAAE,kBAAkB,aAAa,GACjC,EAAE,qBAAqB,wBAAwB,GAE/C,SACA;AACA,MAAI,qBAAqB;AACzB,aAAW,OAAO,kBAAkB;AAClC,QAAI,SAAS,IAAI,GAAG,EAAG;AACvB,QAAI,CAAC,oBAAoB,SAAS,GAAG,KAAK,CAAC,oBAAoB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,KAC/F,CAAC,wBAAwB,SAAS,GAAG,KAAK,CAAC,wBAAwB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,GAAG;AAC9G;AACA,UAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,gBAAQ,IAAI,IAAIA,OAAM,KAAK,IAAI,CAAC,mEAAmEA,OAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MACrH,OAAO;AACL,gBAAQ,IAAI,IAAIA,OAAM,KAAK,IAAI,CAAC,4CAA4CA,OAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,MAAI,qBAAqB,GAAG;AAC1B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAKA,OAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;;;ACPA,SAAS,WACP,MACA,UACA,UACA,WACA,iBACA;AACA,UAAQ,KAAK,qBAAqB,IAAI,OAAO,QAAQ,EAAE;AACvD,UAAQ,KAAK,cAAc,SAAS,MAAM,yBAAyB,UAAU,MAAM,EAAE;AACrF,aAAW,QAAQ,UAAU;AAC3B,YAAQ,KAAK,SAAS,IAAI,EAAE;AAAA,EAC9B;AACA,aAAW,QAAQ,WAAW;AAC5B,YAAQ,KAAK,sBAAsB,IAAI,EAAE;AAAA,EAC3C;AACA,aAAW,OAAO,iBAAiB;AACjC,YAAQ,KAAK,qBAAqB,GAAG,EAAE;AAAA,EACzC;AACF;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EAAM;AAAA,EAAU,OAAO;AAAA,EAAO,UAAU;AAAA,EAAO;AAAA,EAAS,WAAW;AAAA,EAAO,UAAU;AACtF,GAAoC;AAClC,QAAM,EAAE,UAAU,UAAU,IAAI,UAAU,QAAQ;AAClD,QAAM,kBAAkB,wBAAwB,QAAQ;AACxD,MAAI,SAAS;AACX,eAAW,MAAM,UAAU,UAAU,WAAW,eAAe;AAAA,EACjE;AACA,QAAM,YAAY,QAAQ,EAAE,QAAQ,WAAW;AAC/C,QAAM,eAAe,WAAW,EAAE,QAAQ,WAAW;AACrD,QAAM,gBAAgB;AACtB,QAAM,eAAe,4BAA4B;AAAA,IAC/C;AAAA,IAAU;AAAA,IAAW;AAAA,EACvB,CAAC;AAED,QAAM,gBAAgB,+BAA+B,GAAG,QAAQ,eAAe;AAE/E,QAAM,uBAAuB,YAAY,wBAAwB,EAAE,MAAM,SAAS,GAAG,eAAe,YAAY,IAAI;AACpH,QAAM,qBAAqB,YAAY,sBAAsB,EAAE,MAAM,SAAS,GAAG,eAAe,cAAc,OAAO,IAAI;AACzH,QAAM,0BAA0B,eAAe,2BAA2B,EAAE,MAAM,SAAS,GAAG,eAAe,YAAY,IAAI;AAC7H,QAAM,cAAc,EAAE,UAAU,UAAU;AAC1C,QAAM,wBAAwB,eAC1B,yBAAyB,EAAE,MAAM,SAAS,GAAG,eAAe,cAAc,aAAa,OAAO,IAC9F;AACJ,QAAM,yBAAyB,gBAAgB,0BAA0B,EAAE,MAAM,SAAS,GAAG,eAAe,cAAc,OAAO,IAAI;AAErI,QAAM,cAAc,uBAAuB,0BAA0B,qBAAqB,wBAAwB;AAClH,SAAO;AACT;","names":["fs","fs","globSync","globSync","fs","fs","path","fs","path","isDeclarationFile","path","builtinModules","chalk","chalk","chalk","fs","path","ts","fs","path","fs","path","fs","path","fs","ts","path","fs","fs","chalk","chalk"]}
@@ -4,9 +4,10 @@ function getUnusedDependencies({ name, location }, { dependencies }, {
4
4
  externalDistImports,
5
5
  externalDistTypeImports,
6
6
  externalAllImports
7
- }) {
7
+ }, exclude) {
8
8
  let unusedDependencies = 0;
9
9
  for (const dep of dependencies) {
10
+ if (exclude?.has(dep)) continue;
10
11
  if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\//, "")) && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\//, ""))) {
11
12
  unusedDependencies++;
12
13
  if (externalAllImports.includes(dep)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts"],"sourcesContent":["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 externalDistImports,\n externalDistTypeImports,\n externalAllImports,\n }: CheckSourceParams,\n) {\n let unusedDependencies = 0\n for (const dep of dependencies) {\n if (!externalDistImports.includes(dep)\n && !externalDistImports.includes(dep.replace(/^@types\\//, ''))\n && !externalDistTypeImports.includes(dep)\n && !externalDistTypeImports.includes(dep.replace(/^@types\\//, ''))) {\n unusedDependencies++\n if (externalAllImports.includes(dep)) {\n console.log(`[${chalk.blue(name)}] dependency should be devDependency in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused dependency in package.json: ${chalk.red(dep)}`)\n }\n }\n }\n if (unusedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unusedDependencies\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAKX,SAAS,sBACd,EAAE,MAAM,SAAS,GACjB,EAAE,aAAa,GACf;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GACA;AACA,MAAI,qBAAqB;AACzB,aAAW,OAAO,cAAc;AAC9B,QAAI,CAAC,oBAAoB,SAAS,GAAG,KAChC,CAAC,oBAAoB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,KAC1D,CAAC,wBAAwB,SAAS,GAAG,KACrC,CAAC,wBAAwB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,GAAG;AACpE;AACA,UAAI,mBAAmB,SAAS,GAAG,GAAG;AACpC,gBAAQ,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,yDAAyD,MAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC3G,OAAO;AACL,gBAAQ,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,wCAAwC,MAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,MAAI,qBAAqB,GAAG;AAC1B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAK,MAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts"],"sourcesContent":["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 externalDistImports,\n externalDistTypeImports,\n externalAllImports,\n }: CheckSourceParams,\n // Package names to skip (from xy.config deplint.exclude)\n exclude?: Set<string>,\n) {\n let unusedDependencies = 0\n for (const dep of dependencies) {\n if (exclude?.has(dep)) continue\n if (!externalDistImports.includes(dep)\n && !externalDistImports.includes(dep.replace(/^@types\\//, ''))\n && !externalDistTypeImports.includes(dep)\n && !externalDistTypeImports.includes(dep.replace(/^@types\\//, ''))) {\n unusedDependencies++\n if (externalAllImports.includes(dep)) {\n console.log(`[${chalk.blue(name)}] dependency should be devDependency in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused dependency in package.json: ${chalk.red(dep)}`)\n }\n }\n }\n if (unusedDependencies > 0) {\n const packageLocation = `${location}/package.json`\n console.log(` ${chalk.yellow(packageLocation)}\\n`)\n }\n return unusedDependencies\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAKX,SAAS,sBACd,EAAE,MAAM,SAAS,GACjB,EAAE,aAAa,GACf;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAEA,SACA;AACA,MAAI,qBAAqB;AACzB,aAAW,OAAO,cAAc;AAC9B,QAAI,SAAS,IAAI,GAAG,EAAG;AACvB,QAAI,CAAC,oBAAoB,SAAS,GAAG,KAChC,CAAC,oBAAoB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,KAC1D,CAAC,wBAAwB,SAAS,GAAG,KACrC,CAAC,wBAAwB,SAAS,IAAI,QAAQ,aAAa,EAAE,CAAC,GAAG;AACpE;AACA,UAAI,mBAAmB,SAAS,GAAG,GAAG;AACpC,gBAAQ,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,yDAAyD,MAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC3G,OAAO;AACL,gBAAQ,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,wCAAwC,MAAM,IAAI,GAAG,CAAC,EAAE;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,MAAI,qBAAqB,GAAG;AAC1B,UAAM,kBAAkB,GAAG,QAAQ;AACnC,YAAQ,IAAI,KAAK,MAAM,OAAO,eAAe,CAAC;AAAA,CAAI;AAAA,EACpD;AACA,SAAO;AACT;","names":[]}