@kongyo2/ts-comment-scanner 0.0.0 → 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.
package/dist/scanner.js CHANGED
@@ -1,7 +1,10 @@
1
1
  import ts from "typescript";
2
+ import { detectDirective } from "./directives.js";
2
3
  export function scanComments(source, options = {}) {
3
- const scriptKind = options.jsx === true ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
4
- const sourceFile = ts.createSourceFile("module.ts", source, ts.ScriptTarget.Latest, true, scriptKind);
4
+ const jsx = options.jsx === true;
5
+ const fileName = jsx ? "module.tsx" : "module.ts";
6
+ const scriptKind = jsx ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
7
+ const sourceFile = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, scriptKind);
5
8
  const jsxTextSpans = [];
6
9
  const ranges = [];
7
10
  const seen = new Set();
@@ -16,7 +19,10 @@ export function scanComments(source, options = {}) {
16
19
  }
17
20
  };
18
21
  const visit = (node) => {
19
- const children = node.getChildren(sourceFile);
22
+ // JSDoc nodes start inside the comment text itself; descending into them
23
+ // would hide the comment (e.g. a trailing JSDoc attached to the
24
+ // end-of-file token). Treat them as trivia like any other comment.
25
+ const children = node.getChildren(sourceFile).filter((child) => !ts.isJSDoc(child));
20
26
  if (children.length === 0) {
21
27
  if (node.kind === ts.SyntaxKind.JsxText) {
22
28
  jsxTextSpans.push([node.getFullStart(), node.getEnd()]);
@@ -31,19 +37,37 @@ export function scanComments(source, options = {}) {
31
37
  };
32
38
  visit(sourceFile);
33
39
  const insideJsxText = (pos) => jsxTextSpans.some(([start, end]) => pos >= start && pos < end);
40
+ // File-wide pragmas (check pragmas, triple-slash directives, docblock
41
+ // test-environment pragmas, Deno's *-ignore-file forms) only count before
42
+ // the first token; anywhere later the tools treat them as ordinary text.
43
+ const firstTokenStart = sourceFile.getStart(sourceFile);
44
+ const isHeaderOnlyDirective = (directive) => directive === "@ts-nocheck" ||
45
+ directive === "@ts-check" ||
46
+ directive === "@jest-environment" ||
47
+ directive === "@vitest-environment" ||
48
+ directive.endsWith("-ignore-file") ||
49
+ directive.startsWith("triple-slash-");
50
+ const isActiveDirective = (directive, pos) => !isHeaderOnlyDirective(directive) || pos < firstTokenStart;
34
51
  return ranges
35
52
  .filter((range) => !insideJsxText(range.pos))
36
53
  .sort((a, b) => a.pos - b.pos)
37
54
  .map((range) => {
38
55
  const kind = range.kind === ts.SyntaxKind.SingleLineCommentTrivia ? "line" : "block";
39
- const position = sourceFile.getLineAndCharacterOfPosition(range.pos);
56
+ const text = source.slice(range.pos, range.end);
57
+ const startPosition = sourceFile.getLineAndCharacterOfPosition(range.pos);
58
+ const endPosition = sourceFile.getLineAndCharacterOfPosition(range.end);
59
+ const detected = detectDirective(kind, text);
60
+ const directive = detected !== undefined && isActiveDirective(detected, range.pos) ? detected : undefined;
40
61
  return {
41
62
  kind,
42
- text: source.slice(range.pos, range.end),
63
+ text,
43
64
  start: range.pos,
44
65
  end: range.end,
45
- line: position.line + 1,
46
- column: position.character + 1,
66
+ line: startPosition.line + 1,
67
+ column: startPosition.character + 1,
68
+ endLine: endPosition.line + 1,
69
+ endColumn: endPosition.character + 1,
70
+ ...(directive === undefined ? {} : { directive }),
47
71
  };
48
72
  });
49
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,6 +6,10 @@ export interface Comment {
6
6
  end: number;
7
7
  line: number;
8
8
  column: number;
9
+ endLine: number;
10
+ endColumn: number;
11
+ /** Canonical name of the compiler/linter directive this comment represents, if any. */
12
+ directive?: string;
9
13
  }
10
14
  export interface FileScanResult {
11
15
  file: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kongyo2/ts-comment-scanner",
3
- "version": "0.0.0",
4
- "description": "CLI to detect and report comments across a TypeScript project.",
3
+ "version": "1.1.0",
4
+ "description": "CLI to detect, report and safely remove comments across a TypeScript project.",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "comments",
@@ -10,6 +10,9 @@
10
10
  "scanner",
11
11
  "ast",
12
12
  "code-analysis",
13
+ "comment-removal",
14
+ "code-cleanup",
15
+ "github-actions",
13
16
  "kongyo2"
14
17
  ],
15
18
  "license": "MIT",
@@ -57,10 +60,12 @@
57
60
  "access": "public"
58
61
  },
59
62
  "dependencies": {
63
+ "picomatch": "^4.0.4",
60
64
  "typescript": "^6.0.3"
61
65
  },
62
66
  "devDependencies": {
63
67
  "@types/node": "^25.9.3",
68
+ "@types/picomatch": "^4.0.3",
64
69
  "oxlint": "^1.70.0",
65
70
  "prettier": "^3.8.4",
66
71
  "vitest": "^4.1.9"