semantic-change-tracker 0.3.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.
Files changed (42) hide show
  1. package/README.md +122 -0
  2. package/dist/analyzer/functionDiff.d.ts +14 -0
  3. package/dist/analyzer/functionDiff.d.ts.map +1 -0
  4. package/dist/analyzer/functionDiff.js +173 -0
  5. package/dist/analyzer/functionDiff.js.map +1 -0
  6. package/dist/analyzer/reasonAggregator.d.ts +8 -0
  7. package/dist/analyzer/reasonAggregator.d.ts.map +1 -0
  8. package/dist/analyzer/reasonAggregator.js +269 -0
  9. package/dist/analyzer/reasonAggregator.js.map +1 -0
  10. package/dist/analyzer/ruleEngine.d.ts +5 -0
  11. package/dist/analyzer/ruleEngine.d.ts.map +1 -0
  12. package/dist/analyzer/ruleEngine.js +129 -0
  13. package/dist/analyzer/ruleEngine.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +124 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/config/default.d.ts +18 -0
  19. package/dist/config/default.d.ts.map +1 -0
  20. package/dist/config/default.js +20 -0
  21. package/dist/config/default.js.map +1 -0
  22. package/dist/config/loader.d.ts +3 -0
  23. package/dist/config/loader.d.ts.map +1 -0
  24. package/dist/config/loader.js +63 -0
  25. package/dist/config/loader.js.map +1 -0
  26. package/dist/git/diff.d.ts +10 -0
  27. package/dist/git/diff.d.ts.map +1 -0
  28. package/dist/git/diff.js +58 -0
  29. package/dist/git/diff.js.map +1 -0
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +24 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/model/semanticChange.d.ts +12 -0
  35. package/dist/model/semanticChange.d.ts.map +1 -0
  36. package/dist/model/semanticChange.js +3 -0
  37. package/dist/model/semanticChange.js.map +1 -0
  38. package/dist/parser/tsParser.d.ts +15 -0
  39. package/dist/parser/tsParser.d.ts.map +1 -0
  40. package/dist/parser/tsParser.js +158 -0
  41. package/dist/parser/tsParser.js.map +1 -0
  42. package/package.json +45 -0
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseTypeScriptFile = parseTypeScriptFile;
37
+ const ts = __importStar(require("typescript"));
38
+ function parseTypeScriptFile(content) {
39
+ const sourceFile = ts.createSourceFile("temp.ts", content, ts.ScriptTarget.Latest, true);
40
+ const functions = [];
41
+ function visit(node) {
42
+ if (ts.isFunctionDeclaration(node) ||
43
+ ts.isMethodDeclaration(node) ||
44
+ ts.isArrowFunction(node) ||
45
+ ts.isFunctionExpression(node)) {
46
+ const functionInfo = extractFunctionInfo(node, sourceFile);
47
+ if (functionInfo) {
48
+ functions.push(functionInfo);
49
+ }
50
+ }
51
+ ts.forEachChild(node, visit);
52
+ }
53
+ visit(sourceFile);
54
+ return functions;
55
+ }
56
+ function extractFunctionInfo(node, sourceFile) {
57
+ const name = getFunctionName(node);
58
+ if (!name)
59
+ return null;
60
+ const parameters = node.parameters.map((p) => p.name.getText(sourceFile));
61
+ const returnType = node.type ? node.type.getText(sourceFile) : "any";
62
+ const isExported = isNodeExported(node);
63
+ const isAsync = !!(node.modifiers?.some(m => m.kind === ts.SyntaxKind.AsyncKeyword));
64
+ let hasConditionals = false;
65
+ let hasEarlyReturn = false;
66
+ const returnExpressions = [];
67
+ function visitBody(bodyNode) {
68
+ if (ts.isIfStatement(bodyNode) ||
69
+ ts.isSwitchStatement(bodyNode) ||
70
+ ts.isConditionalExpression(bodyNode)) {
71
+ hasConditionals = true;
72
+ }
73
+ if (ts.isReturnStatement(bodyNode)) {
74
+ if (bodyNode.expression) {
75
+ returnExpressions.push(bodyNode.expression.getText(sourceFile));
76
+ }
77
+ const parent = bodyNode.parent;
78
+ if (parent && !ts.isBlock(parent)) {
79
+ hasEarlyReturn = true;
80
+ }
81
+ }
82
+ ts.forEachChild(bodyNode, visitBody);
83
+ }
84
+ if (node.body) {
85
+ visitBody(node.body);
86
+ }
87
+ const bodyHash = node.body ? hashCode(node.body.getText(sourceFile)) : "";
88
+ const visibility = getVisibility(node);
89
+ const isMethodDeclaration = ts.isMethodDeclaration(node);
90
+ return {
91
+ name,
92
+ parameters,
93
+ returnType,
94
+ hasConditionals,
95
+ hasEarlyReturn,
96
+ returnExpressions,
97
+ bodyHash,
98
+ isExported,
99
+ isAsync,
100
+ visibility,
101
+ isMethodDeclaration,
102
+ };
103
+ }
104
+ function getFunctionName(node) {
105
+ if (ts.isFunctionDeclaration(node) && node.name) {
106
+ return node.name.text;
107
+ }
108
+ if (ts.isMethodDeclaration(node) && node.name) {
109
+ return node.name.getText();
110
+ }
111
+ if (ts.isVariableDeclaration(node.parent) && node.parent.name) {
112
+ return node.parent.name.getText();
113
+ }
114
+ return null;
115
+ }
116
+ function isNodeExported(node) {
117
+ if (ts.isFunctionDeclaration(node)) {
118
+ const hasExportKeyword = !!(node.modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword));
119
+ const isDefaultExport = !!(node.modifiers?.some(m => m.kind === ts.SyntaxKind.DefaultKeyword));
120
+ return hasExportKeyword || isDefaultExport;
121
+ }
122
+ if (ts.isVariableDeclaration(node.parent)) {
123
+ const varStatement = node.parent.parent?.parent;
124
+ if (varStatement && ts.isVariableStatement(varStatement)) {
125
+ return !!(varStatement.modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword || m.kind === ts.SyntaxKind.DefaultKeyword));
126
+ }
127
+ }
128
+ if (ts.isMethodDeclaration(node)) {
129
+ const visibility = getVisibility(node);
130
+ return visibility === "public" || visibility === "implicit-public";
131
+ }
132
+ return false;
133
+ }
134
+ function getVisibility(node) {
135
+ if (!ts.isMethodDeclaration(node)) {
136
+ return "implicit-public";
137
+ }
138
+ const hasPrivate = !!(node.modifiers?.some(m => m.kind === ts.SyntaxKind.PrivateKeyword));
139
+ const hasProtected = !!(node.modifiers?.some(m => m.kind === ts.SyntaxKind.ProtectedKeyword));
140
+ const hasPublic = !!(node.modifiers?.some(m => m.kind === ts.SyntaxKind.PublicKeyword));
141
+ if (hasPrivate)
142
+ return "private";
143
+ if (hasProtected)
144
+ return "protected";
145
+ if (hasPublic)
146
+ return "public";
147
+ return "implicit-public";
148
+ }
149
+ function hashCode(str) {
150
+ let hash = 0;
151
+ for (let i = 0; i < str.length; i++) {
152
+ const char = str.charCodeAt(i);
153
+ hash = (hash << 5) - hash + char;
154
+ hash = hash & hash;
155
+ }
156
+ return hash.toString();
157
+ }
158
+ //# sourceMappingURL=tsParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsParser.js","sourceRoot":"","sources":["../../src/parser/tsParser.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "semantic-change-tracker",
3
+ "version": "0.3.0",
4
+ "description": "Experimental CLI tool that analyzes Git code changes to help engineers understand potential risks",
5
+
6
+ "bin": {
7
+ "sct": "dist/cli/index.js"
8
+ },
9
+
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/cli/index.js",
14
+ "prepare": "npm run build"
15
+ },
16
+
17
+ "keywords": [
18
+ "git",
19
+ "diff",
20
+ "analysis",
21
+ "cli",
22
+ "typescript",
23
+ "ast"
24
+ ],
25
+
26
+ "license": "MIT",
27
+
28
+ "files": [
29
+ "dist"
30
+ ],
31
+
32
+ "dependencies": {
33
+ "commander": "^11.1.0",
34
+ "fast-glob": "^3.3.2"
35
+ },
36
+
37
+ "devDependencies": {
38
+ "typescript": "^5.3.3",
39
+ "@types/node": "^20.10.6"
40
+ },
41
+
42
+ "engines": {
43
+ "node": ">=18"
44
+ }
45
+ }