@m3hti/commit-genie 1.4.0 → 3.0.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 (46) hide show
  1. package/dist/services/analyzerService.d.ts.map +1 -1
  2. package/dist/services/analyzerService.js +61 -110
  3. package/dist/services/analyzerService.js.map +1 -1
  4. package/dist/services/analyzerService.test.js +81 -2
  5. package/dist/services/analyzerService.test.js.map +1 -1
  6. package/dist/services/astAnalyzer.d.ts +42 -0
  7. package/dist/services/astAnalyzer.d.ts.map +1 -0
  8. package/dist/services/astAnalyzer.js +613 -0
  9. package/dist/services/astAnalyzer.js.map +1 -0
  10. package/dist/services/astAnalyzer.test.d.ts +2 -0
  11. package/dist/services/astAnalyzer.test.d.ts.map +1 -0
  12. package/dist/services/astAnalyzer.test.js +319 -0
  13. package/dist/services/astAnalyzer.test.js.map +1 -0
  14. package/dist/services/astClassifier.d.ts +17 -0
  15. package/dist/services/astClassifier.d.ts.map +1 -0
  16. package/dist/services/astClassifier.js +390 -0
  17. package/dist/services/astClassifier.js.map +1 -0
  18. package/dist/services/astClassifier.test.d.ts +2 -0
  19. package/dist/services/astClassifier.test.d.ts.map +1 -0
  20. package/dist/services/astClassifier.test.js +141 -0
  21. package/dist/services/astClassifier.test.js.map +1 -0
  22. package/dist/services/astDiffEngine.d.ts +45 -0
  23. package/dist/services/astDiffEngine.d.ts.map +1 -0
  24. package/dist/services/astDiffEngine.js +261 -0
  25. package/dist/services/astDiffEngine.js.map +1 -0
  26. package/dist/services/astDiffEngine.test.d.ts +2 -0
  27. package/dist/services/astDiffEngine.test.d.ts.map +1 -0
  28. package/dist/services/astDiffEngine.test.js +234 -0
  29. package/dist/services/astDiffEngine.test.js.map +1 -0
  30. package/dist/services/astExportAnalyzer.d.ts +19 -0
  31. package/dist/services/astExportAnalyzer.d.ts.map +1 -0
  32. package/dist/services/astExportAnalyzer.js +209 -0
  33. package/dist/services/astExportAnalyzer.js.map +1 -0
  34. package/dist/services/astExportAnalyzer.test.d.ts +2 -0
  35. package/dist/services/astExportAnalyzer.test.d.ts.map +1 -0
  36. package/dist/services/astExportAnalyzer.test.js +302 -0
  37. package/dist/services/astExportAnalyzer.test.js.map +1 -0
  38. package/dist/services/gitService.d.ts +10 -0
  39. package/dist/services/gitService.d.ts.map +1 -1
  40. package/dist/services/gitService.js +32 -0
  41. package/dist/services/gitService.js.map +1 -1
  42. package/dist/services/gitService.test.js +34 -0
  43. package/dist/services/gitService.test.js.map +1 -1
  44. package/dist/types/index.d.ts +72 -0
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/package.json +2 -1
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isParseableFile = isParseableFile;
4
+ exports.isSignatureBreakingAST = isSignatureBreakingAST;
5
+ exports.extractExportsFromSource = extractExportsFromSource;
6
+ exports.computeExportDiffAST = computeExportDiffAST;
7
+ const astAnalyzer_1 = require("./astAnalyzer");
8
+ /** Check if a file path is parseable by the AST analyzer. */
9
+ function isParseableFile(filePath) {
10
+ return (0, astAnalyzer_1.isParseableFile)(filePath);
11
+ }
12
+ /** True if a signature change is breaking (required param removed, reordered, or new required added). */
13
+ function isSignatureBreakingAST(oldParams, newParams) {
14
+ // Every old required param must still exist at the same position
15
+ for (let i = 0; i < oldParams.length; i++) {
16
+ if (!oldParams[i].required)
17
+ continue;
18
+ if (i >= newParams.length)
19
+ return true; // param removed
20
+ if (oldParams[i].name !== newParams[i].name)
21
+ return true; // reordered/renamed
22
+ }
23
+ // New required param at any position beyond old length = breaking
24
+ for (let i = 0; i < newParams.length; i++) {
25
+ if (!newParams[i].required)
26
+ continue;
27
+ if (i >= oldParams.length)
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ /** Extract all exported symbols from source code using AST analysis. */
33
+ function extractExportsFromSource(source, filePath) {
34
+ const program = (0, astAnalyzer_1.parseFile)(source, filePath);
35
+ if (!program)
36
+ return [];
37
+ const results = [];
38
+ const lines = source.split('\n');
39
+ function getSourceLine(node) {
40
+ if (!node.loc)
41
+ return '';
42
+ return lines[node.loc.start.line - 1]?.trim() || '';
43
+ }
44
+ // Collect names that are default-exported (for kind mapping)
45
+ const defaultExportedNames = new Set();
46
+ for (const stmt of program.body) {
47
+ if (stmt.type === 'ExportDefaultDeclaration') {
48
+ const d = stmt.declaration;
49
+ if (d.type === 'FunctionDeclaration' && d.id) {
50
+ defaultExportedNames.add(d.id.name);
51
+ }
52
+ else if (d.type === 'ClassDeclaration' && d.id) {
53
+ defaultExportedNames.add(d.id.name);
54
+ }
55
+ }
56
+ }
57
+ // Extract via the new declaration pipeline (gets all declared exports)
58
+ const { declarations } = (0, astAnalyzer_1.extractDeclarations)(program);
59
+ for (const decl of declarations) {
60
+ if (!decl.exported)
61
+ continue;
62
+ const stmt = findNodeForDeclaration(program, decl.name);
63
+ const isDefault = defaultExportedNames.has(decl.name) || decl.name === 'default';
64
+ results.push(declarationToExportedSymbol(decl, stmt ? getSourceLine(stmt) : '', isDefault));
65
+ }
66
+ // Handle export specifiers with source (re-exports like `export { foo } from './x'`)
67
+ for (const stmt of program.body) {
68
+ if (stmt.type === 'ExportNamedDeclaration' && stmt.source && stmt.specifiers.length > 0) {
69
+ for (const spec of stmt.specifiers) {
70
+ if (spec.type === 'ExportSpecifier') {
71
+ const exported = spec.exported.type === 'Identifier' ? spec.exported.name : '';
72
+ if (exported && !results.some(r => r.name === exported)) {
73
+ results.push({
74
+ name: exported,
75
+ kind: 're-export',
76
+ line: getSourceLine(stmt),
77
+ });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ // export * from './x'
83
+ if (stmt.type === 'ExportAllDeclaration') {
84
+ const src = stmt.source.type === 'Literal' ? String(stmt.source.value) : '';
85
+ results.push({
86
+ name: `*<${src}>`,
87
+ kind: 're-export',
88
+ line: getSourceLine(stmt),
89
+ });
90
+ }
91
+ }
92
+ return results;
93
+ }
94
+ /**
95
+ * Compute the export diff between two versions of a file.
96
+ * Pass null for oldSource (new file) or newSource (deleted file).
97
+ */
98
+ function computeExportDiffAST(oldSource, newSource, filePath) {
99
+ const oldExports = oldSource ? extractExportsFromSource(oldSource, filePath) : [];
100
+ const newExports = newSource ? extractExportsFromSource(newSource, filePath) : [];
101
+ // Build maps keyed by name (not kind:name) so function→arrow refactors don't false-positive
102
+ const oldMap = new Map();
103
+ for (const sym of oldExports)
104
+ oldMap.set(sym.name, sym);
105
+ const newMap = new Map();
106
+ for (const sym of newExports)
107
+ newMap.set(sym.name, sym);
108
+ const removed = [];
109
+ const added = [];
110
+ // Symbols in old but not in new → removed
111
+ for (const [name, sym] of oldMap) {
112
+ if (!newMap.has(name)) {
113
+ removed.push(sym);
114
+ }
115
+ }
116
+ // Symbols in new but not in old → added
117
+ for (const [name, sym] of newMap) {
118
+ if (!oldMap.has(name)) {
119
+ added.push(sym);
120
+ }
121
+ }
122
+ // Symbols in both with different signatures → appear in both removed+added
123
+ // so that the caller can compare them with isSignatureBreakingAST
124
+ for (const [name, oldSym] of oldMap) {
125
+ const newSym = newMap.get(name);
126
+ if (newSym && oldSym.signature !== undefined && newSym.signature !== undefined &&
127
+ oldSym.signature !== newSym.signature) {
128
+ removed.push(oldSym);
129
+ added.push(newSym);
130
+ }
131
+ }
132
+ return { removed, added };
133
+ }
134
+ // ── Internal helpers ────────────────────────────────────────
135
+ /** Convert an ASTDeclaration to an ExportedSymbol. */
136
+ function declarationToExportedSymbol(decl, line, isDefault = false) {
137
+ // Map ASTDeclaration.kind to ExportedSymbol.kind
138
+ const kindMap = {
139
+ 'function': 'function',
140
+ 'class': 'class',
141
+ 'variable': 'const',
142
+ 'interface': 'interface',
143
+ 'type': 'type',
144
+ 'enum': 'enum',
145
+ };
146
+ return {
147
+ name: decl.name,
148
+ kind: isDefault ? 'default' : kindMap[decl.kind],
149
+ signature: decl.signature,
150
+ params: decl.params,
151
+ line,
152
+ };
153
+ }
154
+ /** Find the AST node for a declaration by name (for extracting source line). */
155
+ function findNodeForDeclaration(program, name) {
156
+ for (const stmt of program.body) {
157
+ let declNode = null;
158
+ if (stmt.type === 'ExportNamedDeclaration' && stmt.declaration) {
159
+ declNode = stmt.declaration;
160
+ }
161
+ else if (stmt.type === 'ExportDefaultDeclaration') {
162
+ declNode = stmt;
163
+ }
164
+ else {
165
+ declNode = stmt;
166
+ }
167
+ if (!declNode)
168
+ continue;
169
+ if (declNode.type === 'FunctionDeclaration' && (declNode.id?.name === name || (name === 'default' && !declNode.id))) {
170
+ return stmt;
171
+ }
172
+ if (declNode.type === 'ClassDeclaration' && (declNode.id?.name === name || (name === 'default' && !declNode.id))) {
173
+ return stmt;
174
+ }
175
+ if (declNode.type === 'VariableDeclaration') {
176
+ for (const d of declNode.declarations) {
177
+ if (d.id.type === 'Identifier' && d.id.name === name)
178
+ return stmt;
179
+ }
180
+ }
181
+ if (declNode.type === 'TSInterfaceDeclaration' && declNode.id.name === name)
182
+ return stmt;
183
+ if (declNode.type === 'TSTypeAliasDeclaration' && declNode.id.name === name)
184
+ return stmt;
185
+ if (declNode.type === 'TSEnumDeclaration' && declNode.id.name === name)
186
+ return stmt;
187
+ // CommonJS: ExpressionStatement with assignment
188
+ if (declNode.type === 'ExpressionStatement' && declNode.expression.type === 'AssignmentExpression') {
189
+ const left = declNode.expression.left;
190
+ if (left.type === 'MemberExpression') {
191
+ // module.exports.foo or exports.foo
192
+ if (left.property.type === 'Identifier' && left.property.name === name)
193
+ return stmt;
194
+ // module.exports = { ... } batch — check for property matching name
195
+ if (left.object.type === 'Identifier' && left.object.name === 'module' &&
196
+ left.property.type === 'Identifier' && left.property.name === 'exports' &&
197
+ declNode.expression.right.type === 'ObjectExpression') {
198
+ for (const prop of declNode.expression.right.properties) {
199
+ if (prop.type === 'Property' && prop.key.type === 'Identifier' && prop.key.name === name) {
200
+ return prop;
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ return null;
208
+ }
209
+ //# sourceMappingURL=astExportAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astExportAnalyzer.js","sourceRoot":"","sources":["../../src/services/astExportAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=astExportAnalyzer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astExportAnalyzer.test.d.ts","sourceRoot":"","sources":["../../src/services/astExportAnalyzer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const astExportAnalyzer_1 = require("./astExportAnalyzer");
4
+ describe('astExportAnalyzer', () => {
5
+ describe('isParseableFile', () => {
6
+ it('should accept JS/TS extensions', () => {
7
+ for (const ext of ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.mts', '.cts']) {
8
+ expect((0, astExportAnalyzer_1.isParseableFile)(`src/foo${ext}`)).toBe(true);
9
+ }
10
+ });
11
+ it('should reject non-JS extensions', () => {
12
+ for (const ext of ['.css', '.json', '.md', '.html', '.yaml', '.png']) {
13
+ expect((0, astExportAnalyzer_1.isParseableFile)(`src/foo${ext}`)).toBe(false);
14
+ }
15
+ });
16
+ });
17
+ describe('extractExportsFromSource — ESM', () => {
18
+ it('should extract named function export', () => {
19
+ const src = 'export function greet(name: string): string { return name; }';
20
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
21
+ expect(exports).toHaveLength(1);
22
+ expect(exports[0]).toMatchObject({ name: 'greet', kind: 'function' });
23
+ expect(exports[0].params).toEqual([{ name: 'name', required: true }]);
24
+ });
25
+ it('should extract async function export', () => {
26
+ const src = 'export async function fetchData(url: string) { return url; }';
27
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
28
+ expect(exports).toHaveLength(1);
29
+ expect(exports[0]).toMatchObject({ name: 'fetchData', kind: 'function' });
30
+ });
31
+ it('should extract class export', () => {
32
+ const src = 'export class UserService { getUser() {} }';
33
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
34
+ expect(exports).toHaveLength(1);
35
+ expect(exports[0]).toMatchObject({ name: 'UserService', kind: 'class' });
36
+ });
37
+ it('should extract const export', () => {
38
+ const src = 'export const MAX_SIZE = 100;';
39
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
40
+ expect(exports).toHaveLength(1);
41
+ expect(exports[0]).toMatchObject({ name: 'MAX_SIZE', kind: 'const' });
42
+ });
43
+ it('should extract arrow function export with params', () => {
44
+ const src = 'export const add = (a: number, b: number) => a + b;';
45
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
46
+ expect(exports).toHaveLength(1);
47
+ expect(exports[0]).toMatchObject({ name: 'add', kind: 'function' });
48
+ expect(exports[0].params).toEqual([
49
+ { name: 'a', required: true },
50
+ { name: 'b', required: true },
51
+ ]);
52
+ });
53
+ it('should extract default export function', () => {
54
+ const src = 'export default function main() {}';
55
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
56
+ expect(exports).toHaveLength(1);
57
+ expect(exports[0]).toMatchObject({ name: 'main', kind: 'default' });
58
+ });
59
+ it('should extract default export class', () => {
60
+ const src = 'export default class App {}';
61
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
62
+ expect(exports).toHaveLength(1);
63
+ expect(exports[0]).toMatchObject({ name: 'App', kind: 'default' });
64
+ });
65
+ it('should extract anonymous default export', () => {
66
+ const src = 'export default 42;';
67
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
68
+ expect(exports).toHaveLength(1);
69
+ expect(exports[0]).toMatchObject({ name: 'default', kind: 'default' });
70
+ });
71
+ it('should extract re-exports', () => {
72
+ const src = 'export { UserService, AuthService } from "./services";';
73
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
74
+ expect(exports).toHaveLength(2);
75
+ expect(exports.map(e => e.name)).toEqual(['UserService', 'AuthService']);
76
+ });
77
+ it('should extract aliased re-exports', () => {
78
+ const src = 'export { foo as bar } from "./mod";';
79
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
80
+ expect(exports).toHaveLength(1);
81
+ expect(exports[0].name).toBe('bar');
82
+ });
83
+ it('should extract export * from', () => {
84
+ const src = 'export * from "./utils";';
85
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
86
+ expect(exports).toHaveLength(1);
87
+ expect(exports[0].name).toBe('*<./utils>');
88
+ expect(exports[0].kind).toBe('re-export');
89
+ });
90
+ it('should extract multiple exports from same file', () => {
91
+ const src = [
92
+ 'export function foo() {}',
93
+ 'export const BAR = 1;',
94
+ 'export class Baz {}',
95
+ ].join('\n');
96
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
97
+ expect(exports).toHaveLength(3);
98
+ expect(exports.map(e => e.name).sort()).toEqual(['BAR', 'Baz', 'foo']);
99
+ });
100
+ });
101
+ describe('extractExportsFromSource — TypeScript', () => {
102
+ it('should extract interface export', () => {
103
+ const src = 'export interface User { id: string; name: string; }';
104
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
105
+ expect(exports).toHaveLength(1);
106
+ expect(exports[0]).toMatchObject({ name: 'User', kind: 'interface' });
107
+ });
108
+ it('should extract type alias export', () => {
109
+ const src = 'export type ID = string | number;';
110
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
111
+ expect(exports).toHaveLength(1);
112
+ expect(exports[0]).toMatchObject({ name: 'ID', kind: 'type' });
113
+ });
114
+ it('should extract enum export', () => {
115
+ const src = 'export enum Status { Active, Inactive }';
116
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
117
+ expect(exports).toHaveLength(1);
118
+ expect(exports[0]).toMatchObject({ name: 'Status', kind: 'enum' });
119
+ });
120
+ });
121
+ describe('extractExportsFromSource — CommonJS', () => {
122
+ it('should extract module.exports.foo =', () => {
123
+ const src = 'module.exports.parse = function(data) { return data; };';
124
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.js');
125
+ expect(exports).toHaveLength(1);
126
+ expect(exports[0]).toMatchObject({ name: 'parse', kind: 'function' });
127
+ expect(exports[0].params).toEqual([{ name: 'data', required: true }]);
128
+ });
129
+ it('should extract exports.foo =', () => {
130
+ const src = 'exports.format = (value) => String(value);';
131
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.js');
132
+ expect(exports).toHaveLength(1);
133
+ expect(exports[0]).toMatchObject({ name: 'format', kind: 'function' });
134
+ });
135
+ it('should extract module.exports = { ... } batch', () => {
136
+ const src = 'module.exports = { add: function(a, b) { return a + b; }, PI: 3.14 };';
137
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.js');
138
+ expect(exports).toHaveLength(2);
139
+ expect(exports.map(e => e.name).sort()).toEqual(['PI', 'add']);
140
+ });
141
+ });
142
+ describe('extractExportsFromSource — params & signatures', () => {
143
+ it('should detect optional parameters', () => {
144
+ const src = 'export function fetch(url: string, options?: RequestInit) {}';
145
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
146
+ expect(exports[0].params).toEqual([
147
+ { name: 'url', required: true },
148
+ { name: 'options', required: false },
149
+ ]);
150
+ });
151
+ it('should detect default value parameters as not required', () => {
152
+ const src = 'export function create(name: string, count = 1) {}';
153
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
154
+ expect(exports[0].params).toEqual([
155
+ { name: 'name', required: true },
156
+ { name: 'count', required: false },
157
+ ]);
158
+ });
159
+ it('should detect rest parameters as not required', () => {
160
+ const src = 'export function log(...args: string[]) {}';
161
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
162
+ expect(exports[0].params).toEqual([
163
+ { name: '...args', required: false },
164
+ ]);
165
+ });
166
+ it('should handle destructured parameters', () => {
167
+ const src = 'export function init({ host, port }: Config) {}';
168
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
169
+ expect(exports[0].params).toEqual([
170
+ { name: '{...}', required: true },
171
+ ]);
172
+ });
173
+ it('should build signature string', () => {
174
+ const src = 'export function greet(name: string, age?: number) {}';
175
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
176
+ expect(exports[0].signature).toBe('(name, age?)');
177
+ });
178
+ });
179
+ describe('extractExportsFromSource — edge cases', () => {
180
+ it('should return [] for empty source', () => {
181
+ expect((0, astExportAnalyzer_1.extractExportsFromSource)('', 'file.ts')).toEqual([]);
182
+ });
183
+ it('should return [] for unparseable source', () => {
184
+ expect((0, astExportAnalyzer_1.extractExportsFromSource)('{{{{', 'file.ts')).toEqual([]);
185
+ });
186
+ it('should NOT extract non-exported functions', () => {
187
+ const src = [
188
+ 'function internal() {}',
189
+ 'const helper = () => {};',
190
+ 'export function publicApi() {}',
191
+ ].join('\n');
192
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
193
+ expect(exports).toHaveLength(1);
194
+ expect(exports[0].name).toBe('publicApi');
195
+ });
196
+ it('should handle JSX files', () => {
197
+ const src = 'export function App() { return <div>Hello</div>; }';
198
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.tsx');
199
+ expect(exports).toHaveLength(1);
200
+ expect(exports[0].name).toBe('App');
201
+ });
202
+ it('should handle file with only internal code', () => {
203
+ const src = 'const x = 1;\nfunction foo() {}\nclass Bar {}';
204
+ const exports = (0, astExportAnalyzer_1.extractExportsFromSource)(src, 'file.ts');
205
+ expect(exports).toEqual([]);
206
+ });
207
+ });
208
+ describe('computeExportDiffAST', () => {
209
+ it('should detect all exports as added for new files', () => {
210
+ const newSrc = 'export function hello() {}\nexport const WORLD = 1;';
211
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(null, newSrc, 'file.ts');
212
+ expect(diff.added).toHaveLength(2);
213
+ expect(diff.removed).toHaveLength(0);
214
+ });
215
+ it('should detect all exports as removed for deleted files', () => {
216
+ const oldSrc = 'export function hello() {}\nexport const WORLD = 1;';
217
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(oldSrc, null, 'file.ts');
218
+ expect(diff.removed).toHaveLength(2);
219
+ expect(diff.added).toHaveLength(0);
220
+ });
221
+ it('should detect renamed exports', () => {
222
+ const oldSrc = 'export function oldName() {}';
223
+ const newSrc = 'export function newName() {}';
224
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(oldSrc, newSrc, 'file.ts');
225
+ expect(diff.removed.map(e => e.name)).toContain('oldName');
226
+ expect(diff.added.map(e => e.name)).toContain('newName');
227
+ });
228
+ it('should detect signature changes', () => {
229
+ const oldSrc = 'export function fetch(id: string, token: string) {}';
230
+ const newSrc = 'export function fetch(id: string) {}';
231
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(oldSrc, newSrc, 'file.ts');
232
+ // Signature changed: appears in both removed and added
233
+ expect(diff.removed.some(e => e.name === 'fetch')).toBe(true);
234
+ expect(diff.added.some(e => e.name === 'fetch')).toBe(true);
235
+ });
236
+ it('should report no changes for identical files', () => {
237
+ const src = 'export function hello() {}\nexport const X = 1;';
238
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(src, src, 'file.ts');
239
+ expect(diff.removed).toHaveLength(0);
240
+ expect(diff.added).toHaveLength(0);
241
+ });
242
+ it('should report no changes for body-only edits', () => {
243
+ const oldSrc = 'export function calc(x: number) { return x + 1; }';
244
+ const newSrc = 'export function calc(x: number) { return x * 2; }';
245
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(oldSrc, newSrc, 'file.ts');
246
+ expect(diff.removed).toHaveLength(0);
247
+ expect(diff.added).toHaveLength(0);
248
+ });
249
+ it('should NOT flag function→arrow as a remove+add', () => {
250
+ const oldSrc = 'export function add(a: number, b: number) { return a + b; }';
251
+ const newSrc = 'export const add = (a: number, b: number) => a + b;';
252
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(oldSrc, newSrc, 'file.ts');
253
+ // Same name, same params — no rename detected
254
+ expect(diff.removed.filter(e => e.name === 'add')).toHaveLength(0);
255
+ expect(diff.added.filter(e => e.name === 'add')).toHaveLength(0);
256
+ });
257
+ it('should detect adding optional param as non-breaking signature change', () => {
258
+ const oldSrc = 'export function fetch(id: string) {}';
259
+ const newSrc = 'export function fetch(id: string, options?: RequestInit) {}';
260
+ const diff = (0, astExportAnalyzer_1.computeExportDiffAST)(oldSrc, newSrc, 'file.ts');
261
+ // Signature changes, so appears in removed+added
262
+ const oldFetch = diff.removed.find(e => e.name === 'fetch');
263
+ const newFetch = diff.added.find(e => e.name === 'fetch');
264
+ if (oldFetch && newFetch) {
265
+ // But isSignatureBreakingAST should say NOT breaking
266
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)(oldFetch.params, newFetch.params)).toBe(false);
267
+ }
268
+ });
269
+ });
270
+ describe('isSignatureBreakingAST', () => {
271
+ it('should flag removed required param as breaking', () => {
272
+ const old = [{ name: 'id', required: true }, { name: 'token', required: true }];
273
+ const now = [{ name: 'id', required: true }];
274
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)(old, now)).toBe(true);
275
+ });
276
+ it('should flag reordered params as breaking', () => {
277
+ const old = [{ name: 'a', required: true }, { name: 'b', required: true }];
278
+ const now = [{ name: 'b', required: true }, { name: 'a', required: true }];
279
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)(old, now)).toBe(true);
280
+ });
281
+ it('should NOT flag added optional param as breaking', () => {
282
+ const old = [{ name: 'id', required: true }];
283
+ const now = [{ name: 'id', required: true }, { name: 'opts', required: false }];
284
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)(old, now)).toBe(false);
285
+ });
286
+ it('should flag new required param as breaking', () => {
287
+ const old = [{ name: 'id', required: true }];
288
+ const now = [{ name: 'id', required: true }, { name: 'token', required: true }];
289
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)(old, now)).toBe(true);
290
+ });
291
+ it('should NOT flag identical params', () => {
292
+ const params = [{ name: 'a', required: true }, { name: 'b', required: false }];
293
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)(params, params)).toBe(false);
294
+ });
295
+ it('should handle empty params', () => {
296
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)([], [])).toBe(false);
297
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)([], [{ name: 'x', required: false }])).toBe(false);
298
+ expect((0, astExportAnalyzer_1.isSignatureBreakingAST)([], [{ name: 'x', required: true }])).toBe(true);
299
+ });
300
+ });
301
+ });
302
+ //# sourceMappingURL=astExportAnalyzer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astExportAnalyzer.test.js","sourceRoot":"","sources":["../../src/services/astExportAnalyzer.test.ts"],"names":[],"mappings":"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"}
@@ -60,5 +60,15 @@ export declare class GitService {
60
60
  * Get recent commit history
61
61
  */
62
62
  static getCommitHistory(count?: number): HistoricalCommit[];
63
+ /**
64
+ * Get the contents of a file from HEAD (last committed version).
65
+ * Returns null if the file doesn't exist in HEAD or there are no commits.
66
+ */
67
+ static getFileAtHead(filePath: string): string | null;
68
+ /**
69
+ * Get the contents of a file from the staging area (index).
70
+ * Returns null if the file is deleted in the staging area.
71
+ */
72
+ static getStagedFileContent(filePath: string): string | null;
63
73
  }
64
74
  //# sourceMappingURL=gitService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,OAAO;IASjC;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,SAAS;IAuC7B;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,SAAS;IA0BhC;;OAEG;IACH,MAAM,CAAC,OAAO,IAAI,MAAM;IAYxB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,UAAU,EAAE;IAKrC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAqBpC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAoBzC;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAW5C;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,UAAU,EAAE;IAwBzC;;OAEG;IACH,MAAM,CAAC,iBAAiB,IAAI,MAAM;IAWlC;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,OAAO;IAS5B;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAW3B;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,MAAM;IAqB1B;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAYxC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,gBAAgB,EAAE;CAsChE"}
1
+ {"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,OAAO;IASjC;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,SAAS;IAuC7B;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,SAAS;IA0BhC;;OAEG;IACH,MAAM,CAAC,OAAO,IAAI,MAAM;IAYxB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,UAAU,EAAE;IAKrC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAqBpC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAoBzC;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAW5C;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,UAAU,EAAE;IAwBzC;;OAEG;IACH,MAAM,CAAC,iBAAiB,IAAI,MAAM;IAWlC;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,OAAO;IAS5B;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAW3B;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,MAAM;IAqB1B;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAYxC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,gBAAgB,EAAE;IAuC/D;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYrD;;;OAGG;IACH,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAW7D"}
@@ -298,6 +298,38 @@ class GitService {
298
298
  return [];
299
299
  }
300
300
  }
301
+ /**
302
+ * Get the contents of a file from HEAD (last committed version).
303
+ * Returns null if the file doesn't exist in HEAD or there are no commits.
304
+ */
305
+ static getFileAtHead(filePath) {
306
+ try {
307
+ return (0, child_process_1.execSync)(`git show HEAD:${filePath}`, {
308
+ encoding: 'utf-8',
309
+ maxBuffer: 1024 * 1024 * 5,
310
+ stdio: ['pipe', 'pipe', 'pipe'],
311
+ });
312
+ }
313
+ catch {
314
+ return null;
315
+ }
316
+ }
317
+ /**
318
+ * Get the contents of a file from the staging area (index).
319
+ * Returns null if the file is deleted in the staging area.
320
+ */
321
+ static getStagedFileContent(filePath) {
322
+ try {
323
+ return (0, child_process_1.execSync)(`git show :${filePath}`, {
324
+ encoding: 'utf-8',
325
+ maxBuffer: 1024 * 1024 * 5,
326
+ stdio: ['pipe', 'pipe', 'pipe'],
327
+ });
328
+ }
329
+ catch {
330
+ return null;
331
+ }
332
+ }
301
333
  }
302
334
  exports.GitService = GitService;
303
335
  //# sourceMappingURL=gitService.js.map