@shakibkhatri/idiolect-core 0.0.0-stage → 0.0.1

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 (70) hide show
  1. package/data/ai-tells.json +15 -0
  2. package/dist/analyzer-go.d.ts +6 -0
  3. package/dist/analyzer-go.js +146 -0
  4. package/dist/analyzer-go.js.map +1 -0
  5. package/dist/analyzer-py.d.ts +4 -0
  6. package/dist/analyzer-py.js +141 -0
  7. package/dist/analyzer-py.js.map +1 -0
  8. package/dist/analyzer-ts.d.ts +3 -0
  9. package/dist/analyzer-ts.js +164 -0
  10. package/dist/analyzer-ts.js.map +1 -0
  11. package/dist/analyzer.d.ts +136 -0
  12. package/dist/analyzer.js +331 -0
  13. package/dist/analyzer.js.map +1 -0
  14. package/dist/baseline.d.ts +7 -0
  15. package/dist/baseline.js +166 -0
  16. package/dist/baseline.js.map +1 -0
  17. package/dist/check.d.ts +16 -0
  18. package/dist/check.js +97 -0
  19. package/dist/check.js.map +1 -0
  20. package/dist/collector.d.ts +36 -0
  21. package/dist/collector.js +125 -0
  22. package/dist/collector.js.map +1 -0
  23. package/dist/config.d.ts +50 -0
  24. package/dist/config.js +46 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/index.d.ts +18 -0
  27. package/dist/index.js +19 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/languages.d.ts +4 -0
  30. package/dist/languages.js +7 -0
  31. package/dist/languages.js.map +1 -0
  32. package/dist/llm.d.ts +15 -0
  33. package/dist/llm.js +136 -0
  34. package/dist/llm.js.map +1 -0
  35. package/dist/metrics.d.ts +19 -0
  36. package/dist/metrics.js +104 -0
  37. package/dist/metrics.js.map +1 -0
  38. package/dist/parser.d.ts +3 -0
  39. package/dist/parser.js +25 -0
  40. package/dist/parser.js.map +1 -0
  41. package/dist/profile.d.ts +61 -0
  42. package/dist/profile.js +48 -0
  43. package/dist/profile.js.map +1 -0
  44. package/dist/redact.d.ts +1 -0
  45. package/dist/redact.js +24 -0
  46. package/dist/redact.js.map +1 -0
  47. package/dist/render.d.ts +15 -0
  48. package/dist/render.js +56 -0
  49. package/dist/render.js.map +1 -0
  50. package/dist/sampler.d.ts +26 -0
  51. package/dist/sampler.js +71 -0
  52. package/dist/sampler.js.map +1 -0
  53. package/dist/unbot.d.ts +19 -0
  54. package/dist/unbot.js +48 -0
  55. package/dist/unbot.js.map +1 -0
  56. package/dist/writer.d.ts +18 -0
  57. package/dist/writer.js +113 -0
  58. package/dist/writer.js.map +1 -0
  59. package/grammars/go.LICENSE +21 -0
  60. package/grammars/go.wasm +0 -0
  61. package/grammars/kotlin.LICENSE +21 -0
  62. package/grammars/kotlin.wasm +0 -0
  63. package/grammars/python.LICENSE +21 -0
  64. package/grammars/python.wasm +0 -0
  65. package/grammars/tsx.LICENSE +21 -0
  66. package/grammars/tsx.wasm +0 -0
  67. package/grammars/typescript.LICENSE +21 -0
  68. package/grammars/typescript.wasm +0 -0
  69. package/package.json +26 -3
  70. package/README.md +0 -3
@@ -0,0 +1,15 @@
1
+ [
2
+ { "id": "comments.buzzwords", "metric": "comments.buzzword-ratio", "text": "Do not use words like robust, seamless, leverage, comprehensive, utilize, streamline, crucial or delve in comments." },
3
+ { "id": "comments.restating", "metric": "comments.restates-ratio", "text": "Do not start comments with \"This function\", \"This method\" or \"This class\". Say what is not obvious from the code, or write nothing." },
4
+ { "id": "comments.emoji", "metric": "comments.emoji-ratio", "text": "No emoji in comments." },
5
+ { "id": "comments.private-docblocks", "metric": "comments.private-doc-ratio", "text": "Do not write doc comments on private functions and properties." },
6
+ { "id": "naming.generic", "metric": "naming.generic-ratio", "text": "No generic names like handleData, processItem, result2 or helper. Name the thing after what it is." },
7
+ { "id": "errors.try-everything", "metric": "errors.try-per-kloc", "text": "Do not wrap code in try/catch defensively. Let errors propagate unless there is a specific recovery.", "language": ["kotlin", "typescript", "python"] },
8
+ { "id": "errors.force-unwrap", "metric": "errors.force-unwrap-per-kloc", "text": "Do not use !! to force-unwrap nullable values.", "language": "kotlin" },
9
+ { "id": "errors.non-null-assertion", "metric": "errors.force-unwrap-per-kloc", "text": "Do not use the ! non-null assertion. Narrow the type or handle the undefined case.", "language": "typescript" },
10
+ { "id": "types.any", "metric": "typescript.any-per-kloc", "text": "Do not use any. Type the value or use unknown.", "language": "typescript" },
11
+ { "id": "errors.bare-except", "metric": "python.bare-except-per-kloc", "text": "Do not use a bare except. Catch the exception you expect.", "language": "python" },
12
+ { "id": "errors.panic", "metric": "go.panic-per-kloc", "text": "Do not panic. Return the error.", "language": "go" },
13
+ { "id": "errors.unchecked-assertion", "metric": "errors.force-unwrap-per-kloc", "text": "Use the two-value form of type assertions, v, ok := x.(T), so a wrong type does not panic.", "language": "go" },
14
+ { "id": "comments.todo", "metric": "comments.todo-ratio", "text": "Do not leave TODO comments." }
15
+ ]
@@ -0,0 +1,6 @@
1
+ import type { Node } from "web-tree-sitter";
2
+ import { type AnalyzeOptions, type LanguageStats } from "./analyzer.js";
3
+ import type { LineRange } from "./collector.js";
4
+ export declare const analyzeGo: (code: string, owned?: LineRange[], opts?: AnalyzeOptions) => Promise<LanguageStats>;
5
+ /** Comments that sit right above a top-level declaration are its doc, Go has no separate syntax for that. */
6
+ export declare function isGoDocComment(n: Node): boolean;
@@ -0,0 +1,146 @@
1
+ import { analyzeTree, bump, commentText, countComment, countCommentText, countName, firstWord, GENERIC_NAME, testNameStyle } from "./analyzer.js";
2
+ const NEST = new Set(["if_statement", "for_statement", "expression_switch_statement", "type_switch_statement", "select_statement", "func_literal"]);
3
+ const DECLS = new Set(["function_declaration", "method_declaration", "type_declaration", "var_declaration", "const_declaration", "package_clause"]);
4
+ export const analyzeGo = (code, owned, opts = {}) => analyzeTree(code, "go", count, owned, opts);
5
+ const field = (n, name) => n.childForFieldName(name);
6
+ const exported = (id) => /^[A-Z]/.test(id);
7
+ function count(n, s, test) {
8
+ switch (n.type) {
9
+ case "function_declaration":
10
+ case "method_declaration": return countFunction(n, s, test);
11
+ case "type_spec": {
12
+ const id = field(n, "name")?.text, type = field(n, "type");
13
+ if (type?.type === "struct_type")
14
+ s.go.structs++;
15
+ if (type?.type === "interface_type")
16
+ s.go.interfaces++;
17
+ countName(id, "class", s);
18
+ return countDoc(n.parent, id, s);
19
+ }
20
+ case "const_spec":
21
+ case "var_spec": {
22
+ const id = field(n, "name")?.text;
23
+ const top = n.parent?.parent?.type === "source_file";
24
+ countName(id, top ? (n.type === "const_spec" ? "constant" : "property") : "local", s);
25
+ if (top)
26
+ countDoc(n.parent, id, s);
27
+ return;
28
+ }
29
+ case "short_var_declaration": {
30
+ for (const c of field(n, "left")?.namedChildren ?? [])
31
+ if (c?.type === "identifier" && c.text !== "_")
32
+ countName(c.text, "local", s);
33
+ return;
34
+ }
35
+ case "field_declaration": {
36
+ const id = field(n, "name")?.text;
37
+ countName(id, "property", s);
38
+ if (id && field(n, "type")?.text === "bool")
39
+ bump(s.naming.booleanPrefix, firstWord(id));
40
+ return;
41
+ }
42
+ case "parameter_declaration": {
43
+ const id = field(n, "name")?.text;
44
+ if (id && n.parent?.parent?.type !== "method_elem")
45
+ countName(id, "parameter", s);
46
+ return;
47
+ }
48
+ case "comment": {
49
+ // Go doc comments are plain // comments above a declaration, so they count as doc, not line
50
+ if (!isGoDocComment(n))
51
+ return countComment(n, s);
52
+ s.comments.doc++;
53
+ return countCommentText(commentText(n.text), s);
54
+ }
55
+ case "if_statement":
56
+ if (/\berr\s*!=\s*nil\b/.test(field(n, "condition")?.text ?? ""))
57
+ s.go.errChecks++;
58
+ return;
59
+ case "type_assertion_expression": {
60
+ // v, ok := x.(T) is checked, anything else can panic
61
+ const list = n.parent;
62
+ const lhs = list?.parent?.childForFieldName("left");
63
+ if (!(list?.type === "expression_list" && lhs?.namedChildren.length === 2))
64
+ s.errors.forceUnwrap++;
65
+ return;
66
+ }
67
+ case "call_expression":
68
+ if (field(n, "function")?.text === "panic")
69
+ s.go.panics++;
70
+ return;
71
+ }
72
+ }
73
+ function countFunction(n, s, test) {
74
+ const f = s.functions;
75
+ f.count++;
76
+ const fname = field(n, "name")?.text;
77
+ if (test) {
78
+ s.tests.functions++;
79
+ if (fname)
80
+ bump(s.naming.testNames, testNameStyle(fname));
81
+ }
82
+ else {
83
+ countName(fname, "function", s);
84
+ if (fname && GENERIC_NAME.test(fname))
85
+ s.naming.genericNames++;
86
+ }
87
+ if (fname && !test)
88
+ bump(s.naming.functionVerb, firstWord(fname));
89
+ countDoc(n, fname, s);
90
+ bump(f.params, field(n, "parameters")?.namedChildren.length ?? 0);
91
+ const result = field(n, "result");
92
+ if (result?.type === "parameter_list" && result.namedChildren.some((c) => c?.childForFieldName("name")))
93
+ s.go.namedReturns++;
94
+ if (fname && !test && result?.text === "bool")
95
+ bump(s.naming.booleanPrefix, firstWord(fname));
96
+ const body = field(n, "body");
97
+ if (!body)
98
+ return;
99
+ f.blockBody++;
100
+ bump(f.lengthLines, n.endPosition.row - n.startPosition.row + 1);
101
+ let maxDepth = 0;
102
+ let early = false;
103
+ const walk = (x, depth, inner) => {
104
+ if (x.type === "return_statement" && depth > 0 && !inner)
105
+ early = true;
106
+ const d = NEST.has(x.type) ? depth + 1 : depth;
107
+ maxDepth = Math.max(maxDepth, d);
108
+ for (const c of x.namedChildren)
109
+ if (c)
110
+ walk(c, d, inner || x.type === "func_literal");
111
+ };
112
+ walk(body, 0, false);
113
+ bump(f.maxNesting, maxDepth);
114
+ if (early)
115
+ f.earlyReturn++;
116
+ }
117
+ /** Top-level declarations only. Exported means public. The doc comment is the comment block ending on the line above. */
118
+ function countDoc(decl, id, s) {
119
+ if (decl.parent?.type !== "source_file" || !id)
120
+ return;
121
+ const isPrivate = !exported(id);
122
+ let prev = decl.previousNamedSibling;
123
+ let documented = false;
124
+ let row = decl.startPosition.row;
125
+ while (prev?.type === "comment" && prev.endPosition.row === row - 1) {
126
+ documented = true;
127
+ row = prev.startPosition.row;
128
+ prev = prev.previousNamedSibling;
129
+ }
130
+ s.comments[isPrivate ? "privateDecls" : "publicDecls"]++;
131
+ if (documented)
132
+ s.comments[isPrivate ? "privateDocumented" : "publicDocumented"]++;
133
+ }
134
+ /** Comments that sit right above a top-level declaration are its doc, Go has no separate syntax for that. */
135
+ export function isGoDocComment(n) {
136
+ if (n.parent?.type !== "source_file")
137
+ return false;
138
+ let next = n.nextNamedSibling;
139
+ let row = n.endPosition.row;
140
+ while (next?.type === "comment" && next.startPosition.row === row + 1) {
141
+ row = next.endPosition.row;
142
+ next = next.nextNamedSibling;
143
+ }
144
+ return !!next && DECLS.has(next.type) && next.startPosition.row === row + 1;
145
+ }
146
+ //# sourceMappingURL=analyzer-go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer-go.js","sourceRoot":"","sources":["../src/analyzer-go.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type AnalyzeOptions, type LanguageStats } from "./analyzer.js";
2
+ import type { LineRange } from "./collector.js";
3
+ export declare const analyzePython: (code: string, owned?: LineRange[], opts?: AnalyzeOptions) => Promise<LanguageStats>;
4
+ export declare const docstringText: (raw: string) => string;
@@ -0,0 +1,141 @@
1
+ import { analyzeTree, bump, countComment, countCommentText, countName, firstWord, GENERIC_NAME, testNameStyle } from "./analyzer.js";
2
+ const NEST = new Set(["if_statement", "for_statement", "while_statement", "try_statement", "with_statement", "match_statement", "lambda"]);
3
+ const LITERAL = new Set(["string", "concatenated_string", "integer", "float", "true", "false", "none", "list", "tuple", "dictionary", "set"]);
4
+ const COMPREHENSIONS = new Set(["list_comprehension", "dictionary_comprehension", "set_comprehension", "generator_expression"]);
5
+ const PARAMS = new Set(["identifier", "typed_parameter", "default_parameter", "typed_default_parameter", "list_splat_pattern", "dictionary_splat_pattern"]);
6
+ export const analyzePython = (code, owned, opts = {}) => analyzeTree(code, "python", count, owned, opts);
7
+ const field = (n, name) => n.childForFieldName(name);
8
+ const isPrivateName = (id) => id.startsWith("_") && !id.startsWith("__");
9
+ /** A decorated definition is one statement, so docs and scope are read from the wrapper. */
10
+ const statementOf = (n) => (n.parent?.type === "decorated_definition" ? n.parent : n);
11
+ const isModuleLevel = (n) => statementOf(n).parent?.type === "module";
12
+ const docstring = (body) => {
13
+ const first = body?.namedChildren[0];
14
+ return first?.type === "expression_statement" && first.namedChildren[0]?.type === "string" ? first.namedChildren[0] : undefined;
15
+ };
16
+ export const docstringText = (raw) => raw.replace(/^[a-zA-Z]*("""|\'\'\'|"|')|("""|\'\'\'|"|')$/g, "").split("\n").map((l) => l.trim()).filter(Boolean).join(" ");
17
+ function count(n, s, test) {
18
+ switch (n.type) {
19
+ case "module": {
20
+ const d = docstring(n);
21
+ if (d) {
22
+ s.comments.doc++;
23
+ countCommentText(docstringText(d.text), s);
24
+ }
25
+ return;
26
+ }
27
+ case "function_definition": return countFunction(n, s, test);
28
+ case "class_definition": {
29
+ countName(field(n, "name")?.text, "class", s);
30
+ if (n.parent?.type === "decorated_definition" && n.parent.namedChildren.some((c) => c?.type === "decorator" && /\bdataclass\b/.test(c.text)))
31
+ s.python.dataclasses++;
32
+ return countDoc(n, field(n, "name")?.text, docstring(field(n, "body")), s);
33
+ }
34
+ case "assignment": {
35
+ if (n.parent?.type !== "expression_statement")
36
+ return;
37
+ const left = field(n, "left"), right = field(n, "right");
38
+ // self.x = ... in a method is a property, a bare name is a local, module level is a constant when it holds a literal
39
+ if (left?.type === "attribute" && left.namedChildren[0]?.text === "self") {
40
+ const id = left.namedChildren[1]?.text;
41
+ countName(id, "property", s);
42
+ if (id && (right?.type === "true" || right?.type === "false"))
43
+ bump(s.naming.booleanPrefix, firstWord(id));
44
+ return;
45
+ }
46
+ if (left?.type !== "identifier")
47
+ return;
48
+ const scope = n.parent.parent?.type;
49
+ const kind = scope === "module" ? (right && LITERAL.has(right.type) ? "constant" : "property") : scope === "block" && n.parent.parent?.parent?.type === "class_definition" ? "property" : "local";
50
+ countName(left.text, kind, s);
51
+ if (right?.type === "true" || right?.type === "false" || field(n, "type")?.text === "bool")
52
+ bump(s.naming.booleanPrefix, firstWord(left.text));
53
+ if (kind !== "local")
54
+ countDoc(n.parent, left.text, undefined, s);
55
+ return;
56
+ }
57
+ case "comment": return countComment(n, s);
58
+ case "try_statement":
59
+ s.errors.tryCatch++;
60
+ return;
61
+ case "except_clause":
62
+ if (n.namedChildren.every((c) => c?.type === "block" || c?.type === "comment"))
63
+ s.python.bareExcepts++;
64
+ return;
65
+ case "string":
66
+ if (/^[a-zA-Z]*[fF]/.test(n.firstChild?.text ?? ""))
67
+ s.python.fStrings++;
68
+ return;
69
+ case "call": {
70
+ const fn = field(n, "function");
71
+ if (fn?.type === "attribute" && fn.namedChildren[0]?.type === "string" && fn.namedChildren[1]?.text === "format")
72
+ s.python.formatCalls++;
73
+ return;
74
+ }
75
+ default: if (COMPREHENSIONS.has(n.type))
76
+ s.python.comprehensions++;
77
+ }
78
+ }
79
+ function countFunction(n, s, test) {
80
+ const f = s.functions;
81
+ f.count++;
82
+ const fname = field(n, "name")?.text;
83
+ const magic = !!fname && fname.startsWith("__");
84
+ if (test) {
85
+ s.tests.functions++;
86
+ if (fname)
87
+ bump(s.naming.testNames, testNameStyle(fname));
88
+ }
89
+ else if (!magic) {
90
+ countName(fname, "function", s);
91
+ if (fname && GENERIC_NAME.test(fname))
92
+ s.naming.genericNames++;
93
+ }
94
+ if (fname && !test && !magic)
95
+ bump(s.naming.functionVerb, firstWord(fname));
96
+ const body = field(n, "body");
97
+ countDoc(n, fname, docstring(body), s);
98
+ const params = field(n, "parameters")?.namedChildren.filter((c) => c && PARAMS.has(c.type) && c.text !== "self" && c.text !== "cls") ?? [];
99
+ bump(f.params, params.length);
100
+ const ret = field(n, "return_type");
101
+ if (ret || params.some((c) => c.type.startsWith("typed_")))
102
+ s.python.typeHinted++;
103
+ if (fname && !test && ret?.text === "bool")
104
+ bump(s.naming.booleanPrefix, firstWord(fname));
105
+ if (!body)
106
+ return;
107
+ f.blockBody++;
108
+ bump(f.lengthLines, n.endPosition.row - n.startPosition.row + 1);
109
+ let maxDepth = 0;
110
+ let early = false;
111
+ const walk = (x, depth, inner) => {
112
+ if (x.type === "function_definition" || x.type === "class_definition")
113
+ return;
114
+ if (x.type === "return_statement" && depth > 0 && !inner)
115
+ early = true;
116
+ const d = NEST.has(x.type) ? depth + 1 : depth;
117
+ maxDepth = Math.max(maxDepth, d);
118
+ for (const c of x.namedChildren)
119
+ if (c)
120
+ walk(c, d, inner || x.type === "lambda");
121
+ };
122
+ walk(body, 0, false);
123
+ bump(f.maxNesting, maxDepth);
124
+ if (early)
125
+ f.earlyReturn++;
126
+ }
127
+ /** Module and class level only. A leading underscore makes it private, a docstring documents it. */
128
+ function countDoc(n, id, documented, s) {
129
+ const stmt = statementOf(n);
130
+ const scope = stmt.parent?.type;
131
+ if (scope !== "module" && !(scope === "block" && stmt.parent?.parent?.type === "class_definition"))
132
+ return;
133
+ const isPrivate = !!id && isPrivateName(id);
134
+ s.comments[isPrivate ? "privateDecls" : "publicDecls"]++;
135
+ if (documented) {
136
+ s.comments[isPrivate ? "privateDocumented" : "publicDocumented"]++;
137
+ s.comments.doc++;
138
+ countCommentText(docstringText(documented.text), s);
139
+ }
140
+ }
141
+ //# sourceMappingURL=analyzer-py.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer-py.js","sourceRoot":"","sources":["../src/analyzer-py.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type AnalyzeOptions, type LanguageStats } from "./analyzer.js";
2
+ import type { LineRange } from "./collector.js";
3
+ export declare const analyzeTypeScript: (code: string, owned?: LineRange[], opts?: AnalyzeOptions) => Promise<LanguageStats>;
@@ -0,0 +1,164 @@
1
+ import { analyzeTree, bump, countComment, countName, firstWord, GENERIC_NAME, grammarFor, testNameStyle, testStringStyle } from "./analyzer.js";
2
+ const FUNCTION_LIKE = new Set(["function_declaration", "generator_function_declaration", "function_expression", "arrow_function", "method_definition"]);
3
+ const NEST = new Set(["if_statement", "switch_statement", "for_statement", "for_in_statement", "while_statement", "do_statement", "try_statement", "arrow_function", "function_expression"]);
4
+ const LITERAL = new Set(["string", "number", "template_string", "true", "false", "null", "array", "object", "regex"]);
5
+ const TYPE_DECLS = new Set(["class_declaration", "abstract_class_declaration", "interface_declaration", "type_alias_declaration", "enum_declaration"]);
6
+ export const analyzeTypeScript = (code, owned, opts = {}) => analyzeTree(code, grammarFor("typescript", opts.path), count, owned, opts);
7
+ const field = (n, name) => n.childForFieldName(name);
8
+ const isBoolean = (type, value) => type?.namedChildren[0]?.text === "boolean" || value?.type === "true" || value?.type === "false";
9
+ /** The statement a declaration sits in: its export wrapper when exported, so docs and scope are read from the right node. */
10
+ const statementOf = (n) => (n.parent?.type === "export_statement" ? n.parent : n);
11
+ const isModuleLevel = (n) => statementOf(n).parent?.type === "program";
12
+ function count(n, s, test) {
13
+ switch (n.type) {
14
+ case "function_declaration":
15
+ case "generator_function_declaration":
16
+ s.typescript.functionDeclarations++;
17
+ return countFunction(n, n, field(n, "name")?.text, s, test);
18
+ case "method_definition": {
19
+ // a constructor is not a name the developer chose
20
+ const fname = field(n, "name")?.text;
21
+ return countFunction(n, n, fname === "constructor" ? undefined : fname, s, test);
22
+ }
23
+ case "arrow_function":
24
+ case "function_expression": {
25
+ // only named ones count as functions: a callback passed to a call is a lambda, like Kotlin's lambda_literal
26
+ const p = n.parent;
27
+ if (p?.type !== "variable_declarator" && p?.type !== "public_field_definition")
28
+ return;
29
+ if (n.type === "arrow_function")
30
+ s.typescript.arrowFunctions++;
31
+ return countFunction(n, p.type === "variable_declarator" ? p.parent : p, field(p, "name")?.text, s, test);
32
+ }
33
+ case "variable_declarator": {
34
+ const decl = n.parent;
35
+ if (!decl || (decl.type !== "lexical_declaration" && decl.type !== "variable_declaration"))
36
+ return;
37
+ const id = field(n, "name"), value = field(n, "value");
38
+ if (id?.type !== "identifier" || (value && FUNCTION_LIKE.has(value.type)))
39
+ return;
40
+ const top = isModuleLevel(decl);
41
+ const kind = !top ? "local" : decl.firstChild?.text === "const" && value && LITERAL.has(value.type) ? "constant" : "property";
42
+ countName(id.text, kind, s);
43
+ if (isBoolean(field(n, "type"), value))
44
+ bump(s.naming.booleanPrefix, firstWord(id.text));
45
+ if (top)
46
+ countDoc(decl, s);
47
+ return;
48
+ }
49
+ case "public_field_definition": {
50
+ const id = field(n, "name")?.text, value = field(n, "value");
51
+ if (value && FUNCTION_LIKE.has(value.type))
52
+ return;
53
+ countName(id, "property", s);
54
+ if (id && isBoolean(field(n, "type"), value))
55
+ bump(s.naming.booleanPrefix, firstWord(id));
56
+ return countDoc(n, s);
57
+ }
58
+ case "required_parameter":
59
+ case "optional_parameter":
60
+ case "rest_parameter": {
61
+ const pattern = field(n, "pattern");
62
+ if (pattern?.type === "identifier")
63
+ countName(pattern.text, "parameter", s);
64
+ return;
65
+ }
66
+ case "comment": return countComment(n, s);
67
+ case "call_expression": {
68
+ // it("does x", () => ...) is the test function in Vitest, Jest and Mocha, its name is the string
69
+ if (!test)
70
+ return;
71
+ const callee = field(n, "function")?.text;
72
+ const first = field(n, "arguments")?.namedChildren[0];
73
+ if ((callee === "it" || callee === "test") && (first?.type === "string" || first?.type === "template_string")) {
74
+ s.tests.functions++;
75
+ bump(s.naming.testNames, testStringStyle(first.text.slice(1, -1)));
76
+ }
77
+ return;
78
+ }
79
+ case "try_statement":
80
+ s.errors.tryCatch++;
81
+ return;
82
+ case "non_null_expression":
83
+ s.errors.forceUnwrap++;
84
+ return;
85
+ case "optional_chain":
86
+ s.typescript.optionalChains++;
87
+ return;
88
+ case "predefined_type":
89
+ if (n.text === "any")
90
+ s.typescript.anyTypes++;
91
+ return;
92
+ default:
93
+ if (TYPE_DECLS.has(n.type)) {
94
+ if (n.type === "interface_declaration")
95
+ s.typescript.interfaces++;
96
+ if (n.type === "type_alias_declaration")
97
+ s.typescript.typeAliases++;
98
+ countName(field(n, "name")?.text, "class", s);
99
+ countDoc(n, s);
100
+ }
101
+ }
102
+ }
103
+ /** `anchor` is the node whose lines and doc comment belong to the function: the const declaration for an arrow. */
104
+ function countFunction(n, anchor, fname, s, test) {
105
+ const f = s.functions;
106
+ f.count++;
107
+ if (test) {
108
+ s.tests.functions++;
109
+ if (fname)
110
+ bump(s.naming.testNames, testNameStyle(fname));
111
+ }
112
+ else {
113
+ countName(fname, "function", s);
114
+ if (fname && GENERIC_NAME.test(fname))
115
+ s.naming.genericNames++;
116
+ }
117
+ if (fname && !test)
118
+ bump(s.naming.functionVerb, firstWord(fname));
119
+ countDoc(anchor, s);
120
+ const params = field(n, "parameters")?.namedChildren.length ?? (field(n, "parameter") ? 1 : 0);
121
+ bump(f.params, params);
122
+ if (fname && !test && field(n, "return_type")?.namedChildren[0]?.text === "boolean")
123
+ bump(s.naming.booleanPrefix, firstWord(fname));
124
+ const body = field(n, "body");
125
+ if (!body)
126
+ return;
127
+ if (body.type !== "statement_block") {
128
+ f.expressionBody++;
129
+ return;
130
+ }
131
+ f.blockBody++;
132
+ bump(f.lengthLines, anchor.endPosition.row - anchor.startPosition.row + 1);
133
+ let maxDepth = 0;
134
+ let early = false;
135
+ const walk = (x, depth, inner) => {
136
+ if (x.type === "function_declaration" || x.type === "method_definition")
137
+ return;
138
+ if (x.type === "return_statement" && depth > 0 && !inner)
139
+ early = true;
140
+ const d = NEST.has(x.type) ? depth + 1 : depth;
141
+ maxDepth = Math.max(maxDepth, d);
142
+ for (const c of x.namedChildren)
143
+ if (c)
144
+ walk(c, d, inner || FUNCTION_LIKE.has(x.type));
145
+ };
146
+ walk(body, 0, false);
147
+ bump(f.maxNesting, maxDepth);
148
+ if (early)
149
+ f.earlyReturn++;
150
+ }
151
+ /** Module level: exported is public, the rest is private to the file. Class members: private or protected modifier. */
152
+ function countDoc(n, s) {
153
+ const stmt = statementOf(n);
154
+ const scope = stmt.parent?.type;
155
+ if (scope !== "program" && scope !== "class_body")
156
+ return;
157
+ const isPrivate = scope === "program" ? stmt.type !== "export_statement" : n.namedChildren.some((c) => c?.type === "accessibility_modifier" && c.text !== "public");
158
+ const prev = stmt.previousNamedSibling;
159
+ const documented = prev?.type === "comment" && prev.text.startsWith("/**");
160
+ s.comments[isPrivate ? "privateDecls" : "publicDecls"]++;
161
+ if (documented)
162
+ s.comments[isPrivate ? "privateDocumented" : "publicDocumented"]++;
163
+ }
164
+ //# sourceMappingURL=analyzer-ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer-ts.js","sourceRoot":"","sources":["../src/analyzer-ts.ts"],"names":[],"mappings":"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"}