@m4x_7/type-debt 1.0.13 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,3 @@
1
+ import { Project } from "ts-morph";
1
2
  import { FileReport } from "../types.js";
2
- export declare function processChunk(chunk: string[]): FileReport[];
3
+ export declare function processChunk(chunkPaths: string[], project: Project): FileReport[];
@@ -1,20 +1,17 @@
1
- import { Project } from "ts-morph";
2
1
  import { getTypeDebt } from "./typeDebt.js";
3
- export function processChunk(chunk) {
4
- const project = new Project({ skipAddingFilesFromTsConfig: true });
5
- project.addSourceFilesAtPaths(chunk);
2
+ export function processChunk(chunkPaths, project) {
6
3
  const chunkResults = [];
7
4
  project.forgetNodesCreatedInBlock(() => {
8
- for (const file of project.getSourceFiles()) {
9
- chunkResults.push({
10
- filePath: file.getFilePath(),
11
- typeDebtMetrics: getTypeDebt(file)
12
- });
5
+ for (const filePath of chunkPaths) {
6
+ const file = project.getSourceFile(filePath);
7
+ if (file) {
8
+ chunkResults.push({
9
+ filePath: file.getFilePath(),
10
+ typeDebtMetrics: getTypeDebt(file)
11
+ });
12
+ }
13
13
  }
14
14
  });
15
- for (const file of project.getSourceFiles()) {
16
- project.removeSourceFile(file);
17
- }
18
15
  return chunkResults;
19
16
  }
20
17
  //# sourceMappingURL=chunkProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunkProcessor.js","sourceRoot":"","sources":["../../core/chunkProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,UAAU,YAAY,CAAC,KAAe;IAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,YAAY,GAAiB,EAAE,CAAC;IAEtC,OAAO,CAAC,yBAAyB,CAAC,GAAG,EAAE;QACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5C,YAAY,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;gBAC5B,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"chunkProcessor.js","sourceRoot":"","sources":["../../core/chunkProcessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,UAAU,YAAY,CAAC,UAAoB,EAAE,OAAgB;IAEjE,MAAM,YAAY,GAAiB,EAAE,CAAC;IAEtC,OAAO,CAAC,yBAAyB,CAAC,GAAG,EAAE;QACrC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAElC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,IAAI,EAAE,CAAC;gBACT,YAAY,CAAC,IAAI,CAAC;oBAChB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;oBAC5B,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -13,14 +13,14 @@ export async function generateMarkdownReport(results, targetDir, outputPath = "t
13
13
  md += `- Total Files Scanned: ${totalFiles}\n`;
14
14
  md += `- Average Score: ${averageScore}/100\n\n`;
15
15
  md += `## Top 10 Worst Offenders\n\n`;
16
- md += `| Score | File Path | Valid Types | Suppressions | Implicit \`any\` | Explicit \`any\` | \`as any\` | Non-Null (\`!\`) |\n`;
16
+ md += `| Score | File Path | Typed Nodes | Suppressions | Implicit \`any\` | Explicit \`any\` | \`as any\` | Non-Null (\`!\`) |\n`;
17
17
  md += `| :---: | :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n`;
18
18
  const worstOffenders = sortedResults.slice(0, 10);
19
19
  const absoluteTargetDir = path.resolve(targetDir);
20
20
  for (const result of worstOffenders) {
21
21
  const metrics = result.typeDebtMetrics;
22
22
  const cleanPath = path.relative(absoluteTargetDir, result.filePath);
23
- md += `| ${metrics.score} | \`${cleanPath}\` | ${metrics.validTypes} | ${metrics.suppressions} | ${metrics.implicitAny} | ${metrics.explicitAny} | ${metrics.asAny} | ${metrics.nonNullAssertions} |\n`;
23
+ md += `| ${metrics.score} | \`${cleanPath}\` | ${metrics.typedNodes} | ${metrics.suppressions} | ${metrics.implicitAny} | ${metrics.explicitAny} | ${metrics.asAny} | ${metrics.nonNullAssertions} |\n`;
24
24
  }
25
25
  try {
26
26
  await fs.writeFile(outputPath, md, "utf-8");
@@ -1,20 +1,6 @@
1
- import { SyntaxKind } from "ts-morph";
1
+ import { SyntaxKind, Node } from "ts-morph";
2
2
  import { CONSTANTS } from "../constants.js";
3
3
  const SUPPRESSION_REGEX = /(?:\/\/|\/\*)\s*@ts-(ignore|expect-error|nocheck)/g;
4
- const VALID_TYPES = new Set([
5
- SyntaxKind.TypeReference,
6
- SyntaxKind.ArrayType,
7
- SyntaxKind.UnionType,
8
- SyntaxKind.IntersectionType,
9
- SyntaxKind.TypeLiteral,
10
- SyntaxKind.TupleType,
11
- SyntaxKind.TypeOperator,
12
- SyntaxKind.FunctionType,
13
- SyntaxKind.ConditionalType,
14
- SyntaxKind.MappedType,
15
- SyntaxKind.IndexedAccessType,
16
- SyntaxKind.LiteralType
17
- ]);
18
4
  export function getTypeDebt(sourceFile) {
19
5
  const metrics = {
20
6
  explicitAny: 0,
@@ -22,47 +8,43 @@ export function getTypeDebt(sourceFile) {
22
8
  asAny: 0,
23
9
  suppressions: 0,
24
10
  nonNullAssertions: 0,
25
- validTypes: 0,
11
+ typedNodes: 0,
26
12
  score: 0
27
13
  };
14
+ const typeChecker = sourceFile.getProject().getTypeChecker();
28
15
  sourceFile.forEachDescendant(node => {
29
16
  const kind = node.getKind();
30
- // explicit any
31
- if (kind === SyntaxKind.AnyKeyword) {
32
- const parent = node.getParent();
33
- if (parent?.getKind() !== SyntaxKind.AsExpression) {
34
- metrics.explicitAny++;
35
- }
36
- }
37
17
  // as any
38
- else if (kind === SyntaxKind.AsExpression) {
18
+ if (kind === SyntaxKind.AsExpression) {
39
19
  const asExpression = node.asKindOrThrow(SyntaxKind.AsExpression);
40
20
  if (asExpression.getTypeNode()?.getKind() === SyntaxKind.AnyKeyword) {
41
21
  metrics.asAny++;
42
22
  }
43
23
  }
44
- // implicit any
45
- if (kind === SyntaxKind.Parameter) {
46
- const parameter = node.asKindOrThrow(SyntaxKind.Parameter);
47
- if (!parameter.getTypeNode() && !parameter.getInitializer()) {
48
- const parentFunction = parameter.getParent();
49
- const grandParent = parentFunction?.getParent();
50
- // Ignore parameters in callbacks (e.g., .map(item => ...))
51
- const isCallback = (parentFunction?.getKind() === SyntaxKind.ArrowFunction ||
52
- parentFunction?.getKind() === SyntaxKind.FunctionExpression) &&
53
- grandParent?.getKind() === SyntaxKind.CallExpression;
54
- if (!isCallback) {
55
- metrics.implicitAny++;
56
- }
57
- }
58
- }
59
24
  // not null expression
60
25
  if (kind === SyntaxKind.NonNullExpression) {
61
26
  metrics.nonNullAssertions++;
62
27
  }
63
- // valid types
64
- else if (isValidTypeNode(node)) {
65
- metrics.validTypes++;
28
+ // declarations
29
+ else if (Node.isVariableDeclaration(node) ||
30
+ Node.isParameterDeclaration(node) ||
31
+ Node.isPropertyDeclaration(node)) {
32
+ const typeNode = node.getTypeNode();
33
+ if (typeNode && typeNode.getKind() === SyntaxKind.AnyKeyword) {
34
+ metrics.explicitAny++;
35
+ }
36
+ else if (!typeNode) {
37
+ const type = node.getType();
38
+ if (type.isAny()) {
39
+ metrics.implicitAny++;
40
+ }
41
+ else {
42
+ metrics.typedNodes++;
43
+ }
44
+ }
45
+ else {
46
+ metrics.typedNodes++;
47
+ }
66
48
  }
67
49
  });
68
50
  //suppressions
@@ -74,10 +56,10 @@ export function getTypeDebt(sourceFile) {
74
56
  }
75
57
  export function calculateScore(metrics) {
76
58
  const penalty = calculatePenalty(metrics);
77
- if (metrics.validTypes === 0 && penalty === 0) {
59
+ if (metrics.typedNodes + penalty === 0) {
78
60
  return 100;
79
61
  }
80
- const score = Math.round(100 * metrics.validTypes / (metrics.validTypes + penalty));
62
+ const score = Math.round(100 * metrics.typedNodes / (metrics.typedNodes + penalty));
81
63
  return Math.max(0, score);
82
64
  }
83
65
  export function calculatePenalty(metrics) {
@@ -87,7 +69,4 @@ export function calculatePenalty(metrics) {
87
69
  + metrics.nonNullAssertions * CONSTANTS.TYPE_DEBT_METRICS.NON_NULL_ASSERTION_WEIGHT
88
70
  + metrics.suppressions * CONSTANTS.TYPE_DEBT_METRICS.SUPPRESSION_WEIGHT;
89
71
  }
90
- function isValidTypeNode(node) {
91
- return VALID_TYPES.has(node.getKind());
92
- }
93
72
  //# sourceMappingURL=typeDebt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"typeDebt.js","sourceRoot":"","sources":["../../core/typeDebt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typeDebt.js","sourceRoot":"","sources":["../../core/typeDebt.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import { chunkArray, validateDirectory } from "./utils.js";
4
4
  import { processChunk } from "./core/chunkProcessor.js";
5
5
  import { CONSTANTS } from "./constants.js";
6
6
  import { generateMarkdownReport } from "./core/reporter.js";
7
+ import { Project } from "ts-morph";
7
8
  const args = process.argv.slice(2);
8
9
  if (args.includes('--help') || args.includes('-h')) {
9
10
  printHelp();
@@ -17,6 +18,10 @@ runCLI(target).catch((err) => {
17
18
  async function runCLI(targetDir) {
18
19
  await validateDirectory(targetDir);
19
20
  console.log(`\nScanning directory: ${targetDir}`);
21
+ console.log("Initializing TypeScript compiler...");
22
+ const project = new Project({
23
+ tsConfigFilePath: "tsconfig.json",
24
+ });
20
25
  const allFiles = getTargetFiles(targetDir);
21
26
  if (allFiles.length === 0) {
22
27
  throw new Error(`No TypeScript files found to process.`);
@@ -24,7 +29,7 @@ async function runCLI(targetDir) {
24
29
  const fileChunks = chunkArray(allFiles, CONSTANTS.CHUNK_SIZE);
25
30
  let allResults = [];
26
31
  for (const [index, chunk] of fileChunks.entries()) {
27
- const chunkResults = processChunk(chunk);
32
+ const chunkResults = processChunk(chunk, project);
28
33
  allResults = allResults.concat(chunkResults);
29
34
  process.stdout.write(`\rProcessed chunk ${index + 1}/${fileChunks.length}`);
30
35
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAI5D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAE9B,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAGH,KAAK,UAAU,MAAM,CAAC,SAAiB;IAErC,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAE9D,IAAI,UAAU,GAAiB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAElD,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACzC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,sBAAsB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAEtD,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;GAQX,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAE9B,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAGH,KAAK,UAAU,MAAM,CAAC,SAAiB;IAErC,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,gBAAgB,EAAE,eAAe;KAClC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAE9D,IAAI,UAAU,GAAiB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAElD,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,sBAAsB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;GAQX,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -8,6 +8,6 @@ export interface TypeDebtMetrics {
8
8
  asAny: number;
9
9
  suppressions: number;
10
10
  nonNullAssertions: number;
11
- validTypes: number;
11
+ typedNodes: number;
12
12
  score: number;
13
13
  }
package/dist/utils.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { fdir } from "fdir";
2
2
  import { stat } from "fs/promises";
3
+ import { resolve } from "path";
3
4
  export function getTargetFiles(directoryPath) {
4
5
  const crawler = new fdir()
5
6
  .withFullPaths()
@@ -9,7 +10,8 @@ export function getTargetFiles(directoryPath) {
9
10
  dirName === ".git")
10
11
  .filter((path) => path.endsWith(".ts") || path.endsWith(".tsx"))
11
12
  .crawl(directoryPath);
12
- return crawler.sync();
13
+ const files = crawler.sync();
14
+ return files.map(file => resolve(file).split('\\').join('/'));
13
15
  }
14
16
  export function chunkArray(array, chunkSize) {
15
17
  const chunks = [];
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE;SACvB,aAAa,EAAE;SACf,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,KAAK,cAAc;QAC1B,OAAO,KAAK,MAAM;QAClB,OAAO,KAAK,OAAO;QACnB,OAAO,KAAK,MAAM,CACnB;SACA,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAC/D,KAAK,CAAC,aAAa,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC,IAAI,EAAc,CAAC;AACpC,CAAC;AAGD,MAAM,UAAU,UAAU,CAAI,KAAU,EAAE,SAAiB;IACzD,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAElD,IAAI,KAAK,CAAC;IAEV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,mBAAmB,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,uBAAuB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAG7B,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE;SACvB,aAAa,EAAE;SACf,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,KAAK,cAAc;QAC1B,OAAO,KAAK,MAAM;QAClB,OAAO,KAAK,OAAO;QACnB,OAAO,KAAK,MAAM,CACnB;SACA,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAC/D,KAAK,CAAC,aAAa,CAAC,CAAC;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAc,CAAC;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAGD,MAAM,UAAU,UAAU,CAAI,KAAU,EAAE,SAAiB;IACzD,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAElD,IAAI,KAAK,CAAC;IAEV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,mBAAmB,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,uBAAuB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m4x_7/type-debt",
3
- "version": "1.0.13",
3
+ "version": "1.1.0",
4
4
  "type": "module",
5
5
  "description": "A high-performance TypeScript static analyzer that calculates Type Debt and generates reports.",
6
6
  "main": "./dist/index.js",