difit 0.0.4 → 0.0.5

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 (45) hide show
  1. package/dist/cli/index.js +0 -0
  2. package/dist/client/assets/index-W2UC55JC.css +1 -0
  3. package/dist/client/assets/index-hiGBtmpa.js +142 -0
  4. package/dist/client/index.html +2 -2
  5. package/dist/server/comment-store.js +85 -8
  6. package/dist/server/git-diff.js +3 -1
  7. package/dist/server/server.js +10 -0
  8. package/package.json +3 -2
  9. package/dist/cli/index.d.ts +0 -2
  10. package/dist/cli/index.test.d.ts +0 -1
  11. package/dist/cli/index.test.js +0 -676
  12. package/dist/cli/utils.d.ts +0 -1
  13. package/dist/cli/utils.test.d.ts +0 -1
  14. package/dist/cli/utils.test.js +0 -214
  15. package/dist/client/assets/index-B79lDGO8.js +0 -53
  16. package/dist/client/assets/index-CSJzfcU-.css +0 -1
  17. package/dist/client/assets/prism-css-Bpx-unsJ.js +0 -1
  18. package/dist/client/assets/prism-json-xwnKirkR.js +0 -1
  19. package/dist/client/assets/prism-typescript-B2PMeEx1.js +0 -1
  20. package/dist/server/comment-store.d.ts +0 -13
  21. package/dist/server/git-diff-tui.d.ts +0 -2
  22. package/dist/server/git-diff-tui.js +0 -95
  23. package/dist/server/git-diff.d.ts +0 -10
  24. package/dist/server/git-diff.test.d.ts +0 -1
  25. package/dist/server/git-diff.test.js +0 -292
  26. package/dist/server/server.d.ts +0 -11
  27. package/dist/server/server.test.d.ts +0 -1
  28. package/dist/server/server.test.js +0 -382
  29. package/dist/tui/App.d.ts +0 -8
  30. package/dist/tui/App.js +0 -92
  31. package/dist/tui/App.test.d.ts +0 -1
  32. package/dist/tui/App.test.js +0 -31
  33. package/dist/tui/components/DiffViewer.d.ts +0 -9
  34. package/dist/tui/components/DiffViewer.js +0 -88
  35. package/dist/tui/components/FileList.d.ts +0 -8
  36. package/dist/tui/components/FileList.js +0 -48
  37. package/dist/tui/components/SideBySideDiffViewer.d.ts +0 -9
  38. package/dist/tui/components/SideBySideDiffViewer.js +0 -237
  39. package/dist/tui/components/StatusBar.d.ts +0 -8
  40. package/dist/tui/components/StatusBar.js +0 -23
  41. package/dist/tui/utils/parseDiff.d.ts +0 -2
  42. package/dist/tui/utils/parseDiff.js +0 -68
  43. package/dist/types/diff.d.ts +0 -33
  44. package/dist/utils/fileUtils.d.ts +0 -12
  45. package/dist/utils/fileUtils.js +0 -21
@@ -1,214 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { validateCommitish, validateDiffArguments, shortHash, parseGitHubPrUrl } from './utils';
3
- describe('CLI Utils', () => {
4
- describe('validateCommitish', () => {
5
- it('should validate full SHA hashes', () => {
6
- expect(validateCommitish('a1b2c3d4e5f6789012345678901234567890abcd')).toBe(true);
7
- expect(validateCommitish('abc123')).toBe(true);
8
- });
9
- it('should validate SHA hashes with parent references', () => {
10
- expect(validateCommitish('a1b2c3d4e5f6789012345678901234567890abcd^')).toBe(true);
11
- expect(validateCommitish('abc123^')).toBe(true);
12
- expect(validateCommitish('abc123^^')).toBe(true);
13
- expect(validateCommitish('bd4b7513e075b5b245284c38fd23427b9bd0f42e^')).toBe(true);
14
- });
15
- it('should validate SHA hashes with ancestor references', () => {
16
- expect(validateCommitish('a1b2c3d4e5f6789012345678901234567890abcd~1')).toBe(true);
17
- expect(validateCommitish('abc123~5')).toBe(true);
18
- expect(validateCommitish('abc123~10')).toBe(true);
19
- expect(validateCommitish('bd4b7513e075b5b245284c38fd23427b9bd0f42e~2')).toBe(true);
20
- });
21
- it('should validate HEAD references', () => {
22
- expect(validateCommitish('HEAD')).toBe(true);
23
- expect(validateCommitish('HEAD~1')).toBe(true);
24
- expect(validateCommitish('HEAD~10')).toBe(true);
25
- expect(validateCommitish('HEAD^')).toBe(true);
26
- expect(validateCommitish('HEAD^1')).toBe(true);
27
- expect(validateCommitish('HEAD^2')).toBe(true);
28
- expect(validateCommitish('HEAD~2^1')).toBe(true);
29
- });
30
- it('should validate branch names', () => {
31
- expect(validateCommitish('main')).toBe(true);
32
- expect(validateCommitish('feature/new-feature')).toBe(true);
33
- expect(validateCommitish('develop')).toBe(true);
34
- });
35
- it('should validate special cases', () => {
36
- expect(validateCommitish('.')).toBe(true); // working directory diff
37
- });
38
- it('should reject invalid input', () => {
39
- expect(validateCommitish('')).toBe(false);
40
- expect(validateCommitish(' ')).toBe(false);
41
- expect(validateCommitish('HEAD~')).toBe(false);
42
- expect(validateCommitish('abc')).toBe(true); // short hashes are valid
43
- });
44
- it('should reject non-string input', () => {
45
- expect(validateCommitish(null)).toBe(false);
46
- expect(validateCommitish(undefined)).toBe(false);
47
- expect(validateCommitish(123)).toBe(false);
48
- });
49
- });
50
- describe('validateDiffArguments', () => {
51
- describe('format validation', () => {
52
- it('should accept valid commitish formats', () => {
53
- expect(validateDiffArguments('HEAD', 'HEAD^')).toEqual({ valid: true });
54
- expect(validateDiffArguments('main', 'develop')).toEqual({ valid: true });
55
- expect(validateDiffArguments('abc123', 'def456')).toEqual({ valid: true });
56
- expect(validateDiffArguments('working')).toEqual({ valid: true });
57
- expect(validateDiffArguments('staged', 'HEAD')).toEqual({ valid: true });
58
- expect(validateDiffArguments('.', 'main')).toEqual({ valid: true });
59
- });
60
- it('should reject invalid target commitish format', () => {
61
- const result = validateDiffArguments('', 'HEAD');
62
- expect(result.valid).toBe(false);
63
- expect(result.error).toBe('Invalid target commit-ish format');
64
- });
65
- it('should reject invalid base commitish format', () => {
66
- const result = validateDiffArguments('HEAD', '');
67
- expect(result.valid).toBe(false);
68
- expect(result.error).toBe('Invalid base commit-ish format');
69
- });
70
- });
71
- describe('special argument restrictions', () => {
72
- it('should reject special arguments in base position', () => {
73
- const result1 = validateDiffArguments('HEAD', 'working');
74
- expect(result1.valid).toBe(false);
75
- expect(result1.error).toBe('Special arguments (working, staged, .) are only allowed as target, not base. Got base: working');
76
- const result2 = validateDiffArguments('main', 'staged');
77
- expect(result2.valid).toBe(false);
78
- expect(result2.error).toBe('Special arguments (working, staged, .) are only allowed as target, not base. Got base: staged');
79
- const result3 = validateDiffArguments('HEAD', '.');
80
- expect(result3.valid).toBe(false);
81
- expect(result3.error).toBe('Special arguments (working, staged, .) are only allowed as target, not base. Got base: .');
82
- });
83
- it('should allow special arguments in target position', () => {
84
- expect(validateDiffArguments('working')).toEqual({ valid: true });
85
- expect(validateDiffArguments('staged', 'HEAD')).toEqual({ valid: true });
86
- expect(validateDiffArguments('.', 'main')).toEqual({ valid: true });
87
- });
88
- it('should allow staged as base only with working target', () => {
89
- expect(validateDiffArguments('working', 'staged')).toEqual({ valid: true });
90
- const result = validateDiffArguments('HEAD', 'staged');
91
- expect(result.valid).toBe(false);
92
- expect(result.error).toBe('Special arguments (working, staged, .) are only allowed as target, not base. Got base: staged');
93
- });
94
- });
95
- describe('same value comparison', () => {
96
- it('should reject same target and base values', () => {
97
- const result1 = validateDiffArguments('HEAD', 'HEAD');
98
- expect(result1.valid).toBe(false);
99
- expect(result1.error).toBe('Cannot compare HEAD with itself');
100
- const result2 = validateDiffArguments('main', 'main');
101
- expect(result2.valid).toBe(false);
102
- expect(result2.error).toBe('Cannot compare main with itself');
103
- });
104
- it('should allow different values', () => {
105
- expect(validateDiffArguments('HEAD', 'HEAD^')).toEqual({ valid: true });
106
- expect(validateDiffArguments('main', 'develop')).toEqual({ valid: true });
107
- });
108
- });
109
- describe('working directory restrictions', () => {
110
- it('should reject working with compareWith', () => {
111
- const result = validateDiffArguments('working', 'HEAD');
112
- expect(result.valid).toBe(false);
113
- expect(result.error).toBe('"working" shows unstaged changes and cannot be compared with another commit. Use "." instead to compare all uncommitted changes with a specific commit.');
114
- });
115
- it('should allow working without compareWith', () => {
116
- expect(validateDiffArguments('working')).toEqual({ valid: true });
117
- });
118
- it('should allow working with staged', () => {
119
- expect(validateDiffArguments('working', 'staged')).toEqual({ valid: true });
120
- });
121
- it('should reject working with other commits', () => {
122
- const result1 = validateDiffArguments('working', 'main');
123
- expect(result1.valid).toBe(false);
124
- expect(result1.error).toBe('"working" shows unstaged changes and cannot be compared with another commit. Use "." instead to compare all uncommitted changes with a specific commit.');
125
- const result2 = validateDiffArguments('working', 'abc123');
126
- expect(result2.valid).toBe(false);
127
- expect(result2.error).toBe('"working" shows unstaged changes and cannot be compared with another commit. Use "." instead to compare all uncommitted changes with a specific commit.');
128
- });
129
- it('should allow other special args with compareWith', () => {
130
- expect(validateDiffArguments('staged', 'HEAD')).toEqual({ valid: true });
131
- expect(validateDiffArguments('.', 'main')).toEqual({ valid: true });
132
- });
133
- });
134
- describe('edge cases', () => {
135
- it('should handle undefined base', () => {
136
- expect(validateDiffArguments('HEAD')).toEqual({ valid: true });
137
- expect(validateDiffArguments('main')).toEqual({ valid: true });
138
- });
139
- it('should handle complex git references', () => {
140
- expect(validateDiffArguments('HEAD~2', 'HEAD~3')).toEqual({ valid: true });
141
- expect(validateDiffArguments('HEAD^1', 'HEAD^2')).toEqual({ valid: true });
142
- expect(validateDiffArguments('feature/branch-name', 'origin/main')).toEqual({
143
- valid: true,
144
- });
145
- });
146
- it('should handle SHA hashes with parent/ancestor references', () => {
147
- expect(validateDiffArguments('bd4b7513e075b5b245284c38fd23427b9bd0f42e^', 'abc123')).toEqual({ valid: true });
148
- expect(validateDiffArguments('abc123', 'def456^')).toEqual({ valid: true });
149
- expect(validateDiffArguments('abc123~1', 'def456~2')).toEqual({ valid: true });
150
- expect(validateDiffArguments('a1b2c3d4e5f6789012345678901234567890abcd^', 'HEAD')).toEqual({
151
- valid: true,
152
- });
153
- });
154
- });
155
- });
156
- describe('shortHash', () => {
157
- it('should return first 7 characters of hash', () => {
158
- expect(shortHash('a1b2c3d4e5f6789012345678901234567890abcd')).toBe('a1b2c3d');
159
- expect(shortHash('1234567890abcdef')).toBe('1234567');
160
- expect(shortHash('abc123')).toBe('abc123');
161
- });
162
- it('should handle short hashes', () => {
163
- expect(shortHash('abc')).toBe('abc');
164
- expect(shortHash('')).toBe('');
165
- });
166
- });
167
- describe('parseGitHubPrUrl', () => {
168
- it('should parse valid GitHub PR URLs', () => {
169
- const result = parseGitHubPrUrl('https://github.com/owner/repo/pull/123');
170
- expect(result).toEqual({
171
- owner: 'owner',
172
- repo: 'repo',
173
- pullNumber: 123,
174
- });
175
- });
176
- it('should parse GitHub PR URLs with additional path segments', () => {
177
- const result = parseGitHubPrUrl('https://github.com/owner/repo/pull/456/files');
178
- expect(result).toEqual({
179
- owner: 'owner',
180
- repo: 'repo',
181
- pullNumber: 456,
182
- });
183
- });
184
- it('should parse GitHub PR URLs with query parameters', () => {
185
- const result = parseGitHubPrUrl('https://github.com/owner/repo/pull/789?tab=files');
186
- expect(result).toEqual({
187
- owner: 'owner',
188
- repo: 'repo',
189
- pullNumber: 789,
190
- });
191
- });
192
- it('should handle URLs with hyphens and underscores in owner/repo names', () => {
193
- const result = parseGitHubPrUrl('https://github.com/owner-name/repo_name/pull/123');
194
- expect(result).toEqual({
195
- owner: 'owner-name',
196
- repo: 'repo_name',
197
- pullNumber: 123,
198
- });
199
- });
200
- it('should return null for invalid URLs', () => {
201
- expect(parseGitHubPrUrl('not-a-url')).toBe(null);
202
- expect(parseGitHubPrUrl('https://example.com/owner/repo/pull/123')).toBe(null);
203
- expect(parseGitHubPrUrl('https://github.com/owner/repo/issues/123')).toBe(null);
204
- expect(parseGitHubPrUrl('https://github.com/owner/repo')).toBe(null);
205
- expect(parseGitHubPrUrl('https://github.com/owner/repo/pull/abc')).toBe(null);
206
- });
207
- it('should handle malformed URLs gracefully', () => {
208
- expect(parseGitHubPrUrl('')).toBe(null);
209
- expect(parseGitHubPrUrl('https://github.com')).toBe(null);
210
- expect(parseGitHubPrUrl('https://github.com/owner')).toBe(null);
211
- expect(parseGitHubPrUrl('https://github.com/owner/repo/pull')).toBe(null);
212
- });
213
- });
214
- });