@m3hti/commit-genie 1.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +430 -0
  3. package/dist/commands/config.d.ts +3 -0
  4. package/dist/commands/config.d.ts.map +1 -0
  5. package/dist/commands/config.js +31 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/generate.d.ts +10 -0
  8. package/dist/commands/generate.d.ts.map +1 -0
  9. package/dist/commands/generate.js +313 -0
  10. package/dist/commands/generate.js.map +1 -0
  11. package/dist/commands/generate.test.d.ts +2 -0
  12. package/dist/commands/generate.test.d.ts.map +1 -0
  13. package/dist/commands/generate.test.js +168 -0
  14. package/dist/commands/generate.test.js.map +1 -0
  15. package/dist/commands/hook.d.ts +4 -0
  16. package/dist/commands/hook.d.ts.map +1 -0
  17. package/dist/commands/hook.js +62 -0
  18. package/dist/commands/hook.js.map +1 -0
  19. package/dist/commands/stats.d.ts +6 -0
  20. package/dist/commands/stats.d.ts.map +1 -0
  21. package/dist/commands/stats.js +39 -0
  22. package/dist/commands/stats.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +77 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/services/aiService.d.ts +38 -0
  28. package/dist/services/aiService.d.ts.map +1 -0
  29. package/dist/services/aiService.js +187 -0
  30. package/dist/services/aiService.js.map +1 -0
  31. package/dist/services/analyzerService.d.ts +60 -0
  32. package/dist/services/analyzerService.d.ts.map +1 -0
  33. package/dist/services/analyzerService.js +832 -0
  34. package/dist/services/analyzerService.js.map +1 -0
  35. package/dist/services/analyzerService.test.d.ts +2 -0
  36. package/dist/services/analyzerService.test.d.ts.map +1 -0
  37. package/dist/services/analyzerService.test.js +323 -0
  38. package/dist/services/analyzerService.test.js.map +1 -0
  39. package/dist/services/configService.d.ts +25 -0
  40. package/dist/services/configService.d.ts.map +1 -0
  41. package/dist/services/configService.js +207 -0
  42. package/dist/services/configService.js.map +1 -0
  43. package/dist/services/configService.test.d.ts +2 -0
  44. package/dist/services/configService.test.d.ts.map +1 -0
  45. package/dist/services/configService.test.js +165 -0
  46. package/dist/services/configService.test.js.map +1 -0
  47. package/dist/services/gitService.d.ts +44 -0
  48. package/dist/services/gitService.d.ts.map +1 -0
  49. package/dist/services/gitService.js +217 -0
  50. package/dist/services/gitService.js.map +1 -0
  51. package/dist/services/gitService.test.d.ts +2 -0
  52. package/dist/services/gitService.test.d.ts.map +1 -0
  53. package/dist/services/gitService.test.js +140 -0
  54. package/dist/services/gitService.test.js.map +1 -0
  55. package/dist/services/historyService.d.ts +39 -0
  56. package/dist/services/historyService.d.ts.map +1 -0
  57. package/dist/services/historyService.js +195 -0
  58. package/dist/services/historyService.js.map +1 -0
  59. package/dist/services/historyService.test.d.ts +2 -0
  60. package/dist/services/historyService.test.d.ts.map +1 -0
  61. package/dist/services/historyService.test.js +157 -0
  62. package/dist/services/historyService.test.js.map +1 -0
  63. package/dist/services/hookService.d.ts +29 -0
  64. package/dist/services/hookService.d.ts.map +1 -0
  65. package/dist/services/hookService.js +164 -0
  66. package/dist/services/hookService.js.map +1 -0
  67. package/dist/services/statsService.d.ts +28 -0
  68. package/dist/services/statsService.d.ts.map +1 -0
  69. package/dist/services/statsService.js +204 -0
  70. package/dist/services/statsService.js.map +1 -0
  71. package/dist/types/index.d.ts +134 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +3 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/dist/utils/filePatterns.d.ts +5 -0
  76. package/dist/utils/filePatterns.d.ts.map +1 -0
  77. package/dist/utils/filePatterns.js +77 -0
  78. package/dist/utils/filePatterns.js.map +1 -0
  79. package/dist/utils/filePatterns.test.d.ts +2 -0
  80. package/dist/utils/filePatterns.test.d.ts.map +1 -0
  81. package/dist/utils/filePatterns.test.js +51 -0
  82. package/dist/utils/filePatterns.test.js.map +1 -0
  83. package/dist/utils/prompt.d.ts +4 -0
  84. package/dist/utils/prompt.d.ts.map +1 -0
  85. package/dist/utils/prompt.js +60 -0
  86. package/dist/utils/prompt.js.map +1 -0
  87. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configService.js","sourceRoot":"","sources":["../../src/services/configService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=configService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configService.test.d.ts","sourceRoot":"","sources":["../../src/services/configService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,165 @@
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
+ const fs = __importStar(require("fs"));
37
+ const configService_1 = require("./configService");
38
+ const gitService_1 = require("./gitService");
39
+ // Mock dependencies
40
+ jest.mock('fs');
41
+ jest.mock('./gitService');
42
+ const mockedFs = fs;
43
+ const mockedGitService = gitService_1.GitService;
44
+ describe('ConfigService', () => {
45
+ beforeEach(() => {
46
+ jest.clearAllMocks();
47
+ configService_1.ConfigService.clearCache();
48
+ });
49
+ describe('loadConfig', () => {
50
+ it('should return default config when no config file exists', () => {
51
+ mockedGitService.getGitRoot.mockReturnValue('/project');
52
+ mockedFs.existsSync.mockReturnValue(false);
53
+ const config = configService_1.ConfigService.loadConfig();
54
+ expect(config.defaultType).toBe('feat');
55
+ expect(config.maxMessageLength).toBe(72);
56
+ expect(config.includeEmoji).toBeUndefined(); // Let history learning decide
57
+ expect(config.scopes).toEqual([]);
58
+ expect(config.ticketLinking?.enabled).toBe(true);
59
+ expect(config.learnFromHistory?.enabled).toBe(true);
60
+ expect(config.breakingChangeDetection?.enabled).toBe(true);
61
+ expect(config.breakingChangeDetection?.includeFooter).toBe(true);
62
+ });
63
+ it('should load config from .commitgenierc.json', () => {
64
+ mockedGitService.getGitRoot.mockReturnValue('/project');
65
+ mockedFs.existsSync.mockImplementation((filePath) => {
66
+ return String(filePath).includes('.commitgenierc.json');
67
+ });
68
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
69
+ scopes: [{ pattern: 'src/api', scope: 'api' }],
70
+ defaultType: 'fix',
71
+ }));
72
+ const config = configService_1.ConfigService.loadConfig();
73
+ expect(config.defaultType).toBe('fix');
74
+ expect(config.scopes).toHaveLength(1);
75
+ expect(config.scopes[0].scope).toBe('api');
76
+ });
77
+ it('should merge user config with defaults', () => {
78
+ mockedGitService.getGitRoot.mockReturnValue('/project');
79
+ mockedFs.existsSync.mockImplementation((filePath) => {
80
+ return String(filePath).includes('.commitgenierc.json');
81
+ });
82
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
83
+ defaultType: 'chore',
84
+ }));
85
+ const config = configService_1.ConfigService.loadConfig();
86
+ expect(config.defaultType).toBe('chore');
87
+ expect(config.maxMessageLength).toBe(72); // Default preserved
88
+ });
89
+ it('should cache config after first load', () => {
90
+ mockedGitService.getGitRoot.mockReturnValue('/project');
91
+ mockedFs.existsSync.mockReturnValue(false);
92
+ configService_1.ConfigService.loadConfig();
93
+ configService_1.ConfigService.loadConfig();
94
+ configService_1.ConfigService.loadConfig();
95
+ // getGitRoot should only be called once due to caching
96
+ expect(mockedGitService.getGitRoot).toHaveBeenCalledTimes(1);
97
+ });
98
+ it('should handle invalid JSON gracefully', () => {
99
+ mockedGitService.getGitRoot.mockReturnValue('/project');
100
+ mockedFs.existsSync.mockImplementation((filePath) => {
101
+ return String(filePath).includes('.commitgenierc.json');
102
+ });
103
+ mockedFs.readFileSync.mockReturnValue('{ invalid json }');
104
+ // Should not throw, should return defaults
105
+ const config = configService_1.ConfigService.loadConfig();
106
+ expect(config.defaultType).toBe('feat');
107
+ });
108
+ it('should fallback to cwd when not in git repo', () => {
109
+ mockedGitService.getGitRoot.mockImplementation(() => {
110
+ throw new Error('Not a git repo');
111
+ });
112
+ mockedFs.existsSync.mockReturnValue(false);
113
+ const config = configService_1.ConfigService.loadConfig();
114
+ expect(config).toBeDefined();
115
+ });
116
+ });
117
+ describe('getConfig', () => {
118
+ it('should return loaded config', () => {
119
+ mockedGitService.getGitRoot.mockReturnValue('/project');
120
+ mockedFs.existsSync.mockReturnValue(false);
121
+ const config = configService_1.ConfigService.getConfig();
122
+ expect(config).toBeDefined();
123
+ expect(config.defaultType).toBe('feat');
124
+ });
125
+ });
126
+ describe('clearCache', () => {
127
+ it('should clear the cached config', () => {
128
+ mockedGitService.getGitRoot.mockReturnValue('/project');
129
+ mockedFs.existsSync.mockReturnValue(false);
130
+ configService_1.ConfigService.loadConfig();
131
+ configService_1.ConfigService.clearCache();
132
+ configService_1.ConfigService.loadConfig();
133
+ expect(mockedGitService.getGitRoot).toHaveBeenCalledTimes(2);
134
+ });
135
+ });
136
+ describe('initConfig', () => {
137
+ it('should create config file successfully', () => {
138
+ mockedGitService.getGitRoot.mockReturnValue('/project');
139
+ mockedFs.existsSync.mockReturnValue(false);
140
+ mockedFs.writeFileSync.mockImplementation(() => { });
141
+ const result = configService_1.ConfigService.initConfig();
142
+ expect(result.success).toBe(true);
143
+ expect(result.message).toBe('Config file created');
144
+ expect(mockedFs.writeFileSync).toHaveBeenCalled();
145
+ });
146
+ it('should fail if config already exists', () => {
147
+ mockedGitService.getGitRoot.mockReturnValue('/project');
148
+ mockedFs.existsSync.mockReturnValue(true);
149
+ const result = configService_1.ConfigService.initConfig();
150
+ expect(result.success).toBe(false);
151
+ expect(result.message).toBe('Config file already exists');
152
+ });
153
+ it('should handle write errors', () => {
154
+ mockedGitService.getGitRoot.mockReturnValue('/project');
155
+ mockedFs.existsSync.mockReturnValue(false);
156
+ mockedFs.writeFileSync.mockImplementation(() => {
157
+ throw new Error('Permission denied');
158
+ });
159
+ const result = configService_1.ConfigService.initConfig();
160
+ expect(result.success).toBe(false);
161
+ expect(result.message).toContain('Failed to create config');
162
+ });
163
+ });
164
+ });
165
+ //# sourceMappingURL=configService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configService.test.js","sourceRoot":"","sources":["../../src/services/configService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { GitStatus, FileChange, DiffStats, HistoricalCommit } from '../types';
2
+ export declare class GitService {
3
+ /**
4
+ * Check if current directory is a git repository
5
+ */
6
+ static isGitRepository(): boolean;
7
+ /**
8
+ * Get current git status with staged and unstaged files
9
+ */
10
+ static getStatus(): GitStatus;
11
+ /**
12
+ * Get diff statistics for staged changes
13
+ */
14
+ static getDiffStats(): DiffStats;
15
+ /**
16
+ * Get the actual diff content for staged changes
17
+ */
18
+ static getDiff(): string;
19
+ /**
20
+ * Get list of staged files with their status
21
+ */
22
+ static getStagedFiles(): FileChange[];
23
+ /**
24
+ * Commit staged changes with the given message (supports multi-line)
25
+ */
26
+ static commit(message: string): void;
27
+ /**
28
+ * Get the root directory of the git repository
29
+ */
30
+ static getGitRoot(): string;
31
+ /**
32
+ * Get the .git directory path (works reliably on Windows)
33
+ */
34
+ static getGitDir(): string;
35
+ /**
36
+ * Get the current branch name
37
+ */
38
+ static getCurrentBranch(): string | null;
39
+ /**
40
+ * Get recent commit history
41
+ */
42
+ static getCommitHistory(count?: number): HistoricalCommit[];
43
+ }
44
+ //# sourceMappingURL=gitService.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitService = void 0;
4
+ const child_process_1 = require("child_process");
5
+ class GitService {
6
+ /**
7
+ * Check if current directory is a git repository
8
+ */
9
+ static isGitRepository() {
10
+ try {
11
+ (0, child_process_1.execSync)('git rev-parse --git-dir', { stdio: 'pipe' });
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ /**
19
+ * Get current git status with staged and unstaged files
20
+ */
21
+ static getStatus() {
22
+ try {
23
+ const output = (0, child_process_1.execSync)('git status --porcelain', {
24
+ encoding: 'utf-8',
25
+ });
26
+ const staged = [];
27
+ const unstaged = [];
28
+ const lines = output.split('\n').filter((line) => line.trim());
29
+ for (const line of lines) {
30
+ if (line.length < 3)
31
+ continue;
32
+ const stagedStatus = line[0];
33
+ const unstagedStatus = line[1];
34
+ const path = line.substring(3).trim();
35
+ // Staged changes (first character)
36
+ if (stagedStatus !== ' ' && stagedStatus !== '?') {
37
+ staged.push({ status: stagedStatus, path });
38
+ }
39
+ // Unstaged changes (second character)
40
+ if (unstagedStatus !== ' ' && stagedStatus === ' ') {
41
+ unstaged.push({ status: unstagedStatus, path });
42
+ }
43
+ }
44
+ return {
45
+ staged,
46
+ unstaged,
47
+ hasStagedChanges: staged.length > 0,
48
+ };
49
+ }
50
+ catch (error) {
51
+ throw new Error(`Failed to get git status: ${error}`);
52
+ }
53
+ }
54
+ /**
55
+ * Get diff statistics for staged changes
56
+ */
57
+ static getDiffStats() {
58
+ try {
59
+ const output = (0, child_process_1.execSync)('git diff --cached --shortstat', {
60
+ encoding: 'utf-8',
61
+ });
62
+ let filesChanged = 0;
63
+ let insertions = 0;
64
+ let deletions = 0;
65
+ if (output.trim()) {
66
+ const filesMatch = output.match(/(\d+) files? changed/);
67
+ const insertionsMatch = output.match(/(\d+) insertions?/);
68
+ const deletionsMatch = output.match(/(\d+) deletions?/);
69
+ if (filesMatch)
70
+ filesChanged = parseInt(filesMatch[1], 10);
71
+ if (insertionsMatch)
72
+ insertions = parseInt(insertionsMatch[1], 10);
73
+ if (deletionsMatch)
74
+ deletions = parseInt(deletionsMatch[1], 10);
75
+ }
76
+ return { filesChanged, insertions, deletions };
77
+ }
78
+ catch (error) {
79
+ throw new Error(`Failed to get diff stats: ${error}`);
80
+ }
81
+ }
82
+ /**
83
+ * Get the actual diff content for staged changes
84
+ */
85
+ static getDiff() {
86
+ try {
87
+ const output = (0, child_process_1.execSync)('git diff --cached', {
88
+ encoding: 'utf-8',
89
+ maxBuffer: 1024 * 1024 * 10, // 10MB buffer
90
+ });
91
+ return output;
92
+ }
93
+ catch (error) {
94
+ throw new Error(`Failed to get diff: ${error}`);
95
+ }
96
+ }
97
+ /**
98
+ * Get list of staged files with their status
99
+ */
100
+ static getStagedFiles() {
101
+ const status = this.getStatus();
102
+ return status.staged;
103
+ }
104
+ /**
105
+ * Commit staged changes with the given message (supports multi-line)
106
+ */
107
+ static commit(message) {
108
+ try {
109
+ // Use -F - to read message from stdin (supports multi-line)
110
+ const result = (0, child_process_1.spawnSync)('git', ['commit', '-F', '-'], {
111
+ input: message,
112
+ encoding: 'utf-8',
113
+ stdio: ['pipe', 'pipe', 'pipe'],
114
+ });
115
+ if (result.status !== 0) {
116
+ const errorMsg = result.stderr?.trim() || result.stdout?.trim() || 'Unknown error';
117
+ throw new Error(errorMsg);
118
+ }
119
+ }
120
+ catch (error) {
121
+ if (error.message) {
122
+ throw new Error(`Failed to commit: ${error.message}`);
123
+ }
124
+ throw new Error('Failed to commit: Unknown error');
125
+ }
126
+ }
127
+ /**
128
+ * Get the root directory of the git repository
129
+ */
130
+ static getGitRoot() {
131
+ try {
132
+ const output = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
133
+ encoding: 'utf-8',
134
+ });
135
+ return output.trim();
136
+ }
137
+ catch (error) {
138
+ throw new Error('Failed to get git root directory');
139
+ }
140
+ }
141
+ /**
142
+ * Get the .git directory path (works reliably on Windows)
143
+ */
144
+ static getGitDir() {
145
+ try {
146
+ const output = (0, child_process_1.execSync)('git rev-parse --git-dir', {
147
+ encoding: 'utf-8',
148
+ });
149
+ const gitDir = output.trim();
150
+ // If relative path, resolve from cwd
151
+ if (gitDir === '.git' || !gitDir.startsWith('/')) {
152
+ return require('path').resolve(process.cwd(), gitDir);
153
+ }
154
+ // Handle Unix-style absolute paths on Windows (from Git Bash)
155
+ if (process.platform === 'win32' && gitDir.match(/^\/[a-zA-Z]\//)) {
156
+ // Convert /d/path to D:/path
157
+ return gitDir.replace(/^\/([a-zA-Z])\//, '$1:/').replace(/\//g, '\\');
158
+ }
159
+ return gitDir;
160
+ }
161
+ catch (error) {
162
+ throw new Error('Failed to get git directory');
163
+ }
164
+ }
165
+ /**
166
+ * Get the current branch name
167
+ */
168
+ static getCurrentBranch() {
169
+ try {
170
+ const output = (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', {
171
+ encoding: 'utf-8',
172
+ });
173
+ const branch = output.trim();
174
+ return branch === 'HEAD' ? null : branch; // Detached HEAD state
175
+ }
176
+ catch {
177
+ return null;
178
+ }
179
+ }
180
+ /**
181
+ * Get recent commit history
182
+ */
183
+ static getCommitHistory(count = 50) {
184
+ try {
185
+ // Use %x00 as delimiter to handle multi-line messages
186
+ const format = '%H%x00%s%x00%b%x00';
187
+ const output = (0, child_process_1.execSync)(`git log -${count} --format="${format}"`, {
188
+ encoding: 'utf-8',
189
+ maxBuffer: 1024 * 1024 * 5, // 5MB buffer
190
+ });
191
+ const commits = [];
192
+ const entries = output.split('\x00\x00').filter(e => e.trim());
193
+ for (const entry of entries) {
194
+ const parts = entry.split('\x00');
195
+ if (parts.length >= 2) {
196
+ const hash = parts[0].trim();
197
+ const subject = parts[1].trim();
198
+ const body = parts[2]?.trim() || undefined;
199
+ if (hash && subject) {
200
+ commits.push({
201
+ hash,
202
+ subject,
203
+ message: body ? `${subject}\n\n${body}` : subject,
204
+ body,
205
+ });
206
+ }
207
+ }
208
+ }
209
+ return commits;
210
+ }
211
+ catch {
212
+ return [];
213
+ }
214
+ }
215
+ }
216
+ exports.GitService = GitService;
217
+ //# sourceMappingURL=gitService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gitService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitService.test.d.ts","sourceRoot":"","sources":["../../src/services/gitService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const child_process_1 = require("child_process");
4
+ const gitService_1 = require("./gitService");
5
+ // Mock child_process
6
+ jest.mock('child_process', () => ({
7
+ execSync: jest.fn(),
8
+ spawnSync: jest.fn(),
9
+ }));
10
+ const mockedExecSync = child_process_1.execSync;
11
+ const mockedSpawnSync = child_process_1.spawnSync;
12
+ describe('GitService', () => {
13
+ beforeEach(() => {
14
+ jest.clearAllMocks();
15
+ });
16
+ describe('isGitRepository', () => {
17
+ it('should return true when in a git repository', () => {
18
+ mockedExecSync.mockReturnValueOnce(Buffer.from('.git'));
19
+ expect(gitService_1.GitService.isGitRepository()).toBe(true);
20
+ });
21
+ it('should return false when not in a git repository', () => {
22
+ mockedExecSync.mockImplementationOnce(() => {
23
+ throw new Error('Not a git repository');
24
+ });
25
+ expect(gitService_1.GitService.isGitRepository()).toBe(false);
26
+ });
27
+ });
28
+ describe('getStatus', () => {
29
+ it('should parse staged files correctly', () => {
30
+ mockedExecSync.mockReturnValueOnce('A src/newFile.ts\nM src/modified.ts\nD src/deleted.ts\n');
31
+ const status = gitService_1.GitService.getStatus();
32
+ expect(status.hasStagedChanges).toBe(true);
33
+ expect(status.staged).toHaveLength(3);
34
+ expect(status.staged[0]).toEqual({ status: 'A', path: 'src/newFile.ts' });
35
+ expect(status.staged[1]).toEqual({ status: 'M', path: 'src/modified.ts' });
36
+ expect(status.staged[2]).toEqual({ status: 'D', path: 'src/deleted.ts' });
37
+ });
38
+ it('should return empty arrays when no changes', () => {
39
+ mockedExecSync.mockReturnValueOnce('');
40
+ const status = gitService_1.GitService.getStatus();
41
+ expect(status.hasStagedChanges).toBe(false);
42
+ expect(status.staged).toHaveLength(0);
43
+ expect(status.unstaged).toHaveLength(0);
44
+ });
45
+ it('should handle renamed files', () => {
46
+ mockedExecSync.mockReturnValueOnce('R old.ts -> new.ts\n');
47
+ const status = gitService_1.GitService.getStatus();
48
+ expect(status.staged[0].status).toBe('R');
49
+ });
50
+ });
51
+ describe('getDiffStats', () => {
52
+ it('should parse diff stats correctly', () => {
53
+ mockedExecSync.mockReturnValueOnce(' 3 files changed, 45 insertions(+), 10 deletions(-)\n');
54
+ const stats = gitService_1.GitService.getDiffStats();
55
+ expect(stats.filesChanged).toBe(3);
56
+ expect(stats.insertions).toBe(45);
57
+ expect(stats.deletions).toBe(10);
58
+ });
59
+ it('should handle empty diff', () => {
60
+ mockedExecSync.mockReturnValueOnce('');
61
+ const stats = gitService_1.GitService.getDiffStats();
62
+ expect(stats.filesChanged).toBe(0);
63
+ expect(stats.insertions).toBe(0);
64
+ expect(stats.deletions).toBe(0);
65
+ });
66
+ it('should handle single file change', () => {
67
+ mockedExecSync.mockReturnValueOnce(' 1 file changed, 5 insertions(+)\n');
68
+ const stats = gitService_1.GitService.getDiffStats();
69
+ expect(stats.filesChanged).toBe(1);
70
+ expect(stats.insertions).toBe(5);
71
+ expect(stats.deletions).toBe(0);
72
+ });
73
+ });
74
+ describe('getDiff', () => {
75
+ it('should return diff content', () => {
76
+ const mockDiff = `diff --git a/file.ts b/file.ts
77
+ +++ b/file.ts
78
+ +const newLine = true;`;
79
+ mockedExecSync.mockReturnValueOnce(mockDiff);
80
+ const diff = gitService_1.GitService.getDiff();
81
+ expect(diff).toBe(mockDiff);
82
+ });
83
+ });
84
+ describe('commit', () => {
85
+ it('should execute git commit with message', () => {
86
+ mockedSpawnSync.mockReturnValueOnce({
87
+ status: 0,
88
+ stdout: '',
89
+ stderr: '',
90
+ pid: 123,
91
+ output: [],
92
+ signal: null,
93
+ });
94
+ expect(() => gitService_1.GitService.commit('feat: add new feature')).not.toThrow();
95
+ expect(mockedSpawnSync).toHaveBeenCalledWith('git', ['commit', '-F', '-'], expect.objectContaining({
96
+ input: 'feat: add new feature',
97
+ }));
98
+ });
99
+ it('should handle multi-line commit messages', () => {
100
+ mockedSpawnSync.mockReturnValueOnce({
101
+ status: 0,
102
+ stdout: '',
103
+ stderr: '',
104
+ pid: 123,
105
+ output: [],
106
+ signal: null,
107
+ });
108
+ const multiLineMessage = 'feat: add new feature\n\nThis is the body\nwith multiple lines';
109
+ gitService_1.GitService.commit(multiLineMessage);
110
+ expect(mockedSpawnSync).toHaveBeenCalledWith('git', ['commit', '-F', '-'], expect.objectContaining({
111
+ input: multiLineMessage,
112
+ }));
113
+ });
114
+ it('should throw error when commit fails', () => {
115
+ mockedSpawnSync.mockReturnValueOnce({
116
+ status: 1,
117
+ stdout: '',
118
+ stderr: 'nothing to commit',
119
+ pid: 123,
120
+ output: [],
121
+ signal: null,
122
+ });
123
+ expect(() => gitService_1.GitService.commit('test')).toThrow('Failed to commit');
124
+ });
125
+ });
126
+ describe('getGitDir', () => {
127
+ it('should resolve relative .git path', () => {
128
+ mockedExecSync.mockReturnValueOnce('.git\n');
129
+ const result = gitService_1.GitService.getGitDir();
130
+ // Should resolve to absolute path ending with .git
131
+ expect(result.endsWith('.git')).toBe(true);
132
+ });
133
+ it('should handle absolute paths', () => {
134
+ mockedExecSync.mockReturnValueOnce('/home/user/project/.git\n');
135
+ const result = gitService_1.GitService.getGitDir();
136
+ expect(result).toBe('/home/user/project/.git');
137
+ });
138
+ });
139
+ });
140
+ //# sourceMappingURL=gitService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitService.test.js","sourceRoot":"","sources":["../../src/services/gitService.test.ts"],"names":[],"mappings":"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"}