kaimon-cli 0.2.1 → 0.4.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 (68) hide show
  1. package/README.md +37 -3
  2. package/dist/__tests__/commands/list.test.d.ts +2 -0
  3. package/dist/__tests__/commands/list.test.d.ts.map +1 -0
  4. package/dist/__tests__/commands/list.test.js +113 -0
  5. package/dist/__tests__/commands/list.test.js.map +1 -0
  6. package/dist/__tests__/commands/pull.test.js +165 -59
  7. package/dist/__tests__/commands/pull.test.js.map +1 -1
  8. package/dist/__tests__/helpers.d.ts.map +1 -1
  9. package/dist/__tests__/helpers.js +2 -1
  10. package/dist/__tests__/helpers.js.map +1 -1
  11. package/dist/__tests__/integration/complete-user-journeys.test.d.ts +2 -0
  12. package/dist/__tests__/integration/complete-user-journeys.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/complete-user-journeys.test.js +357 -0
  14. package/dist/__tests__/integration/complete-user-journeys.test.js.map +1 -0
  15. package/dist/__tests__/integration/config-integration.test.d.ts +2 -0
  16. package/dist/__tests__/integration/config-integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/config-integration.test.js +151 -0
  18. package/dist/__tests__/integration/config-integration.test.js.map +1 -0
  19. package/dist/__tests__/integration/data-integrity.test.d.ts +2 -0
  20. package/dist/__tests__/integration/data-integrity.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/data-integrity.test.js +302 -0
  22. package/dist/__tests__/integration/data-integrity.test.js.map +1 -0
  23. package/dist/__tests__/integration/edge-cases-advanced.test.d.ts +2 -0
  24. package/dist/__tests__/integration/edge-cases-advanced.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/edge-cases-advanced.test.js +294 -0
  26. package/dist/__tests__/integration/edge-cases-advanced.test.js.map +1 -0
  27. package/dist/__tests__/integration/error-recovery.test.d.ts +2 -0
  28. package/dist/__tests__/integration/error-recovery.test.d.ts.map +1 -0
  29. package/dist/__tests__/integration/error-recovery.test.js +284 -0
  30. package/dist/__tests__/integration/error-recovery.test.js.map +1 -0
  31. package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts +2 -0
  32. package/dist/__tests__/integration/filesystem-edge-cases.test.d.ts.map +1 -0
  33. package/dist/__tests__/integration/filesystem-edge-cases.test.js +224 -0
  34. package/dist/__tests__/integration/filesystem-edge-cases.test.js.map +1 -0
  35. package/dist/__tests__/integration/filtering-operations.test.d.ts +2 -0
  36. package/dist/__tests__/integration/filtering-operations.test.d.ts.map +1 -0
  37. package/dist/__tests__/integration/filtering-operations.test.js +286 -0
  38. package/dist/__tests__/integration/filtering-operations.test.js.map +1 -0
  39. package/dist/__tests__/integration/full-workflow.test.js +4 -0
  40. package/dist/__tests__/integration/full-workflow.test.js.map +1 -1
  41. package/dist/__tests__/integration/state-transitions.test.d.ts +2 -0
  42. package/dist/__tests__/integration/state-transitions.test.d.ts.map +1 -0
  43. package/dist/__tests__/integration/state-transitions.test.js +328 -0
  44. package/dist/__tests__/integration/state-transitions.test.js.map +1 -0
  45. package/dist/__tests__/unit/utils/frontmatter.test.js +68 -68
  46. package/dist/__tests__/unit/utils/markdown.test.js +11 -11
  47. package/dist/commands/auth.d.ts.map +1 -1
  48. package/dist/commands/auth.js +2 -11
  49. package/dist/commands/auth.js.map +1 -1
  50. package/dist/commands/list.d.ts +4 -0
  51. package/dist/commands/list.d.ts.map +1 -0
  52. package/dist/commands/list.js +19 -0
  53. package/dist/commands/list.js.map +1 -0
  54. package/dist/commands/pull.d.ts.map +1 -1
  55. package/dist/commands/pull.js +5 -3
  56. package/dist/commands/pull.js.map +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +6 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/utils/listOperations.d.ts +5 -0
  61. package/dist/utils/listOperations.d.ts.map +1 -0
  62. package/dist/utils/listOperations.js +171 -0
  63. package/dist/utils/listOperations.js.map +1 -0
  64. package/dist/utils/pullOperations.d.ts +3 -2
  65. package/dist/utils/pullOperations.d.ts.map +1 -1
  66. package/dist/utils/pullOperations.js +86 -9
  67. package/dist/utils/pullOperations.js.map +1 -1
  68. package/package.json +2 -2
@@ -0,0 +1,302 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { pullDocuments } from '../../utils/pullOperations.js';
6
+ import * as config from '../../utils/config.js';
7
+ import * as supabaseClient from '../../utils/supabaseClient.js';
8
+ import * as tokenRefresh from '../../utils/tokenRefresh.js';
9
+ import { createTempDir, cleanupTempDir, mockConfig, mockDocumentRecord, createMockSupabaseClient } from '../helpers.js';
10
+ describe('Data Integrity (Integration)', () => {
11
+ let tempDir;
12
+ let docsDir;
13
+ beforeEach(() => {
14
+ tempDir = createTempDir();
15
+ docsDir = path.join(tempDir, 'KaimonDocs');
16
+ vi.spyOn(os, 'homedir').mockReturnValue(tempDir);
17
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
18
+ });
19
+ afterEach(() => {
20
+ cleanupTempDir(tempDir);
21
+ vi.restoreAllMocks();
22
+ });
23
+ it('should preserve complex BlockNote structures: nested lists, tables, code blocks', async () => {
24
+ config.saveConfig(mockConfig());
25
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
26
+ const mockSupabase = createMockSupabaseClient();
27
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Complex Structure' });
28
+ mockSupabase.from.mockReturnValue({
29
+ select: vi.fn().mockReturnThis(),
30
+ eq: vi.fn().mockReturnThis(),
31
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
32
+ });
33
+ // Complex BlockNote content with nested lists
34
+ const complexContent = {
35
+ type: 'blocknote',
36
+ content: [
37
+ {
38
+ type: 'heading',
39
+ props: { level: 1 },
40
+ content: [{ type: 'text', text: 'Complex Document' }]
41
+ },
42
+ {
43
+ type: 'paragraph',
44
+ content: [
45
+ { type: 'text', text: 'Text with ' },
46
+ { type: 'text', text: 'bold', styles: { bold: true } },
47
+ { type: 'text', text: ', ' },
48
+ { type: 'text', text: 'italic', styles: { italic: true } },
49
+ { type: 'text', text: ', and ' },
50
+ { type: 'text', text: 'code', styles: { code: true } },
51
+ ]
52
+ },
53
+ {
54
+ type: 'bulletListItem',
55
+ content: [{ type: 'text', text: 'Top level item' }],
56
+ children: [
57
+ {
58
+ type: 'bulletListItem',
59
+ content: [{ type: 'text', text: 'Nested item 1' }]
60
+ },
61
+ {
62
+ type: 'bulletListItem',
63
+ content: [{ type: 'text', text: 'Nested item 2' }]
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ type: 'numberedListItem',
69
+ props: { start: 1 },
70
+ content: [{ type: 'text', text: 'First numbered item' }]
71
+ },
72
+ {
73
+ type: 'numberedListItem',
74
+ props: { start: 2 },
75
+ content: [{ type: 'text', text: 'Second numbered item' }]
76
+ },
77
+ {
78
+ type: 'codeBlock',
79
+ props: { language: 'javascript' },
80
+ content: [{ type: 'text', text: 'const x = 42;\nconsole.log(x);' }]
81
+ },
82
+ {
83
+ type: 'paragraph',
84
+ content: [
85
+ { type: 'text', text: 'Link: ' },
86
+ {
87
+ type: 'text',
88
+ text: 'example.com',
89
+ styles: {
90
+ hyperlink: 'https://example.com'
91
+ }
92
+ }
93
+ ]
94
+ }
95
+ ]
96
+ };
97
+ const blob = new Blob([JSON.stringify(complexContent)], { type: 'application/json' });
98
+ mockSupabase.storage.from.mockReturnValue({
99
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
100
+ });
101
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
102
+ await pullDocuments(false, true);
103
+ const files = fs.readdirSync(docsDir);
104
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
105
+ // Verify structure is preserved
106
+ expect(content).toContain('# Complex Document');
107
+ expect(content).toContain('**bold**');
108
+ expect(content).toContain('*italic*');
109
+ expect(content).toContain('`code`');
110
+ expect(content).toContain('- Top level item');
111
+ expect(content).toContain('1. First numbered item');
112
+ expect(content).toContain('2. Second numbered item');
113
+ expect(content).toContain('```javascript');
114
+ expect(content).toContain('const x = 42;');
115
+ // Note: BlockNote doesn't convert hyperlink styles to markdown links
116
+ expect(content).toContain('example.com');
117
+ });
118
+ it('should handle empty documents gracefully', async () => {
119
+ config.saveConfig(mockConfig());
120
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
121
+ const mockSupabase = createMockSupabaseClient();
122
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Empty Document' });
123
+ mockSupabase.from.mockReturnValue({
124
+ select: vi.fn().mockReturnThis(),
125
+ eq: vi.fn().mockReturnThis(),
126
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
127
+ });
128
+ // Empty BlockNote content
129
+ const emptyContent = {
130
+ type: 'blocknote',
131
+ content: []
132
+ };
133
+ const blob = new Blob([JSON.stringify(emptyContent)], { type: 'application/json' });
134
+ mockSupabase.storage.from.mockReturnValue({
135
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
136
+ });
137
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
138
+ await pullDocuments(false, true);
139
+ const files = fs.readdirSync(docsDir);
140
+ expect(files.length).toBe(1);
141
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
142
+ // Should have frontmatter but no body content
143
+ expect(content).toContain('kaimon_id: "doc-1"');
144
+ expect(content).toContain('title: "Empty Document"');
145
+ expect(content).toContain('---');
146
+ });
147
+ it('should preserve frontmatter integrity: all fields present and correct', async () => {
148
+ config.saveConfig(mockConfig());
149
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
150
+ const mockSupabase = createMockSupabaseClient();
151
+ const createdAt = '2024-01-15T10:30:00.000Z';
152
+ const updatedAt = '2024-03-15T15:45:30.123Z';
153
+ const doc = mockDocumentRecord({
154
+ id: 'doc-abc-123',
155
+ title: 'Frontmatter Test',
156
+ created_at: createdAt,
157
+ updated_at: updatedAt
158
+ });
159
+ mockSupabase.from.mockReturnValue({
160
+ select: vi.fn().mockReturnThis(),
161
+ eq: vi.fn().mockReturnThis(),
162
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
163
+ });
164
+ const content = {
165
+ type: 'blocknote',
166
+ content: [
167
+ { type: 'paragraph', content: [{ type: 'text', text: 'Test content' }] }
168
+ ]
169
+ };
170
+ const blob = new Blob([JSON.stringify(content)], { type: 'application/json' });
171
+ mockSupabase.storage.from.mockReturnValue({
172
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
173
+ });
174
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
175
+ await pullDocuments(false, true);
176
+ const files = fs.readdirSync(docsDir);
177
+ const fileContent = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
178
+ // Verify ALL frontmatter fields are present and exact
179
+ expect(fileContent).toContain('---');
180
+ expect(fileContent).toContain('title: "Frontmatter Test"');
181
+ expect(fileContent).toContain('kaimon_id: "doc-abc-123"');
182
+ expect(fileContent).toContain(`created_at: "${createdAt}"`);
183
+ expect(fileContent).toContain(`updated_at: "${updatedAt}"`);
184
+ // Verify frontmatter is at the start
185
+ expect(fileContent.indexOf('---')).toBe(0);
186
+ });
187
+ it('should preserve markdown special characters and escaping', async () => {
188
+ config.saveConfig(mockConfig());
189
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
190
+ const mockSupabase = createMockSupabaseClient();
191
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Special Chars' });
192
+ mockSupabase.from.mockReturnValue({
193
+ select: vi.fn().mockReturnThis(),
194
+ eq: vi.fn().mockReturnThis(),
195
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
196
+ });
197
+ const specialContent = {
198
+ type: 'blocknote',
199
+ content: [
200
+ {
201
+ type: 'paragraph',
202
+ content: [{ type: 'text', text: 'Text with * asterisks * and _ underscores _' }]
203
+ },
204
+ {
205
+ type: 'paragraph',
206
+ content: [{ type: 'text', text: 'Backticks ` in text' }]
207
+ },
208
+ {
209
+ type: 'paragraph',
210
+ content: [{ type: 'text', text: 'HTML <tags> & entities &amp;' }]
211
+ },
212
+ {
213
+ type: 'paragraph',
214
+ content: [{ type: 'text', text: '[Brackets] and (Parentheses)' }]
215
+ }
216
+ ]
217
+ };
218
+ const blob = new Blob([JSON.stringify(specialContent)], { type: 'application/json' });
219
+ mockSupabase.storage.from.mockReturnValue({
220
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
221
+ });
222
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
223
+ await pullDocuments(false, true);
224
+ const files = fs.readdirSync(docsDir);
225
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
226
+ // Content should preserve special characters
227
+ expect(content).toContain('asterisks');
228
+ expect(content).toContain('underscores');
229
+ expect(content).toContain('Backticks');
230
+ expect(content).toContain('<tags>');
231
+ expect(content).toContain('[Brackets]');
232
+ expect(content).toContain('(Parentheses)');
233
+ });
234
+ it('should handle large documents (1000+ blocks)', async () => {
235
+ config.saveConfig(mockConfig());
236
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
237
+ const mockSupabase = createMockSupabaseClient();
238
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Large Document' });
239
+ mockSupabase.from.mockReturnValue({
240
+ select: vi.fn().mockReturnThis(),
241
+ eq: vi.fn().mockReturnThis(),
242
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
243
+ });
244
+ // Create large content (1000 paragraph blocks)
245
+ const largeContent = {
246
+ type: 'blocknote',
247
+ content: Array.from({ length: 1000 }, (_, i) => ({
248
+ type: 'paragraph',
249
+ content: [{ type: 'text', text: `Paragraph ${i + 1} with some content here.` }]
250
+ }))
251
+ };
252
+ const blob = new Blob([JSON.stringify(largeContent)], { type: 'application/json' });
253
+ mockSupabase.storage.from.mockReturnValue({
254
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
255
+ });
256
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
257
+ // Should handle large document without issues
258
+ await pullDocuments(false, true);
259
+ const files = fs.readdirSync(docsDir);
260
+ expect(files.length).toBe(1);
261
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
262
+ // Verify first and last paragraphs exist
263
+ expect(content).toContain('Paragraph 1 with some content');
264
+ expect(content).toContain('Paragraph 1000 with some content');
265
+ // File should be readable
266
+ const stats = fs.statSync(path.join(docsDir, files[0]));
267
+ expect(stats.size).toBeGreaterThan(0);
268
+ });
269
+ it('should verify mtime matches remote updated_at timestamp', async () => {
270
+ config.saveConfig(mockConfig());
271
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
272
+ const mockSupabase = createMockSupabaseClient();
273
+ const updatedAt = new Date('2024-03-15T12:00:00.000Z');
274
+ const doc = mockDocumentRecord({
275
+ id: 'doc-1',
276
+ title: 'Timestamp Test',
277
+ updated_at: updatedAt.toISOString()
278
+ });
279
+ mockSupabase.from.mockReturnValue({
280
+ select: vi.fn().mockReturnThis(),
281
+ eq: vi.fn().mockReturnThis(),
282
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
283
+ });
284
+ const content = {
285
+ type: 'blocknote',
286
+ content: [
287
+ { type: 'paragraph', content: [{ type: 'text', text: 'Test' }] }
288
+ ]
289
+ };
290
+ const blob = new Blob([JSON.stringify(content)], { type: 'application/json' });
291
+ mockSupabase.storage.from.mockReturnValue({
292
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
293
+ });
294
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
295
+ await pullDocuments(false, true);
296
+ const files = fs.readdirSync(docsDir);
297
+ const stats = fs.statSync(path.join(docsDir, files[0]));
298
+ // mtime should match updated_at
299
+ expect(stats.mtime.getTime()).toBe(updatedAt.getTime());
300
+ });
301
+ });
302
+ //# sourceMappingURL=data-integrity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/data-integrity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=edge-cases-advanced.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-cases-advanced.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/edge-cases-advanced.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,294 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { pullDocuments } from '../../utils/pullOperations.js';
6
+ import * as config from '../../utils/config.js';
7
+ import * as supabaseClient from '../../utils/supabaseClient.js';
8
+ import * as tokenRefresh from '../../utils/tokenRefresh.js';
9
+ import { createTempDir, cleanupTempDir, mockConfig, mockDocumentRecord, mockBlockNoteContent, createMockSupabaseClient } from '../helpers.js';
10
+ describe('Advanced Edge Cases (Integration)', () => {
11
+ let tempDir;
12
+ let docsDir;
13
+ beforeEach(() => {
14
+ tempDir = createTempDir();
15
+ docsDir = path.join(tempDir, 'KaimonDocs');
16
+ vi.spyOn(os, 'homedir').mockReturnValue(tempDir);
17
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
18
+ });
19
+ afterEach(() => {
20
+ cleanupTempDir(tempDir);
21
+ vi.restoreAllMocks();
22
+ });
23
+ it('should handle readonly directory gracefully', async () => {
24
+ config.saveConfig(mockConfig());
25
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
26
+ const mockSupabase = createMockSupabaseClient();
27
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Test Doc' });
28
+ mockSupabase.from.mockReturnValue({
29
+ select: vi.fn().mockReturnThis(),
30
+ eq: vi.fn().mockReturnThis(),
31
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
32
+ });
33
+ const mockContent = mockBlockNoteContent();
34
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
35
+ mockSupabase.storage.from.mockReturnValue({
36
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
37
+ });
38
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
39
+ // Create readonly parent directory
40
+ fs.mkdirSync(docsDir, { recursive: true });
41
+ try {
42
+ // Make directory readonly (may not work on all systems)
43
+ fs.chmodSync(docsDir, 0o444);
44
+ // Pull should handle readonly error
45
+ await expect(pullDocuments(false, true)).rejects.toThrow();
46
+ }
47
+ catch (error) {
48
+ // If chmod doesn't work (Windows), that's okay
49
+ expect(error).toBeDefined();
50
+ }
51
+ finally {
52
+ // Restore permissions for cleanup
53
+ try {
54
+ fs.chmodSync(docsDir, 0o755);
55
+ }
56
+ catch (e) {
57
+ // Ignore cleanup errors
58
+ }
59
+ }
60
+ });
61
+ it('should handle very long path (Windows 260-char limit)', async () => {
62
+ config.saveConfig(mockConfig());
63
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
64
+ const mockSupabase = createMockSupabaseClient();
65
+ // Create document title that would exceed Windows path limit
66
+ // Windows: C:\...\tempDir\KaimonDocs\very-long-title.md = ~260 chars
67
+ const longTitle = 'A'.repeat(250);
68
+ const doc = mockDocumentRecord({ id: 'doc-1', title: longTitle });
69
+ mockSupabase.from.mockReturnValue({
70
+ select: vi.fn().mockReturnThis(),
71
+ eq: vi.fn().mockReturnThis(),
72
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
73
+ });
74
+ const mockContent = mockBlockNoteContent();
75
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
76
+ mockSupabase.storage.from.mockReturnValue({
77
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
78
+ });
79
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
80
+ // Should either succeed (truncate) or fail gracefully
81
+ try {
82
+ await pullDocuments(false, true);
83
+ // If it succeeds, verify file was created
84
+ if (fs.existsSync(docsDir)) {
85
+ const files = fs.readdirSync(docsDir);
86
+ // May or may not have files depending on platform
87
+ expect(files.length).toBeGreaterThanOrEqual(0);
88
+ }
89
+ }
90
+ catch (error) {
91
+ // Platform may reject long paths - that's acceptable
92
+ expect(error.message).toMatch(/ENAMETOOLONG|path too long|invalid/i);
93
+ }
94
+ });
95
+ it('should handle disk space issues gracefully', async () => {
96
+ config.saveConfig(mockConfig());
97
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
98
+ const mockSupabase = createMockSupabaseClient();
99
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Test Doc' });
100
+ mockSupabase.from.mockReturnValue({
101
+ select: vi.fn().mockReturnThis(),
102
+ eq: vi.fn().mockReturnThis(),
103
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
104
+ });
105
+ const mockContent = mockBlockNoteContent();
106
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
107
+ mockSupabase.storage.from.mockReturnValue({
108
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
109
+ });
110
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
111
+ // Mock fs.writeFileSync to simulate ENOSPC (no space)
112
+ const originalWriteFileSync = fs.writeFileSync;
113
+ vi.spyOn(fs, 'writeFileSync').mockImplementation((path, data, options) => {
114
+ const error = new Error('ENOSPC: no space left on device');
115
+ error.code = 'ENOSPC';
116
+ throw error;
117
+ });
118
+ // Pull should handle disk space error
119
+ await pullDocuments(false, true);
120
+ // Should not crash, may log error
121
+ expect(fs.writeFileSync).toHaveBeenCalled();
122
+ // Restore original
123
+ fs.writeFileSync = originalWriteFileSync;
124
+ });
125
+ it('should handle concurrent pull attempts (file locking)', async () => {
126
+ config.saveConfig(mockConfig());
127
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
128
+ const mockSupabase = createMockSupabaseClient();
129
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Concurrent Doc' });
130
+ mockSupabase.from.mockReturnValue({
131
+ select: vi.fn().mockReturnThis(),
132
+ eq: vi.fn().mockReturnThis(),
133
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
134
+ });
135
+ const mockContent = mockBlockNoteContent();
136
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
137
+ mockSupabase.storage.from.mockReturnValue({
138
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
139
+ });
140
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
141
+ // Start two pulls concurrently
142
+ const pull1 = pullDocuments(false, true);
143
+ const pull2 = pullDocuments(false, true);
144
+ // Both should complete without crashing
145
+ await Promise.all([pull1, pull2]);
146
+ // Should have created file (one or both succeeded)
147
+ if (fs.existsSync(docsDir)) {
148
+ const files = fs.readdirSync(docsDir);
149
+ expect(files.length).toBeGreaterThanOrEqual(1);
150
+ }
151
+ });
152
+ it('should handle symlink in KaimonDocs directory', async () => {
153
+ config.saveConfig(mockConfig());
154
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
155
+ const mockSupabase = createMockSupabaseClient();
156
+ // Create KaimonDocs with a symlink
157
+ fs.mkdirSync(docsDir, { recursive: true });
158
+ // Create a file outside docsDir
159
+ const targetFile = path.join(tempDir, 'target.md');
160
+ fs.writeFileSync(targetFile, 'Target content', 'utf-8');
161
+ // Create symlink inside docsDir (may not work on Windows without admin)
162
+ const symlinkPath = path.join(docsDir, 'symlink.md');
163
+ try {
164
+ fs.symlinkSync(targetFile, symlinkPath);
165
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'New Doc' });
166
+ mockSupabase.from.mockReturnValue({
167
+ select: vi.fn().mockReturnThis(),
168
+ eq: vi.fn().mockReturnThis(),
169
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
170
+ });
171
+ const mockContent = mockBlockNoteContent();
172
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
173
+ mockSupabase.storage.from.mockReturnValue({
174
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
175
+ });
176
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
177
+ // Pull should work despite symlink
178
+ await pullDocuments(false, true);
179
+ // Should have both symlink and new file
180
+ const files = fs.readdirSync(docsDir);
181
+ expect(files.length).toBeGreaterThanOrEqual(2);
182
+ }
183
+ catch (error) {
184
+ // Symlink may fail on Windows - that's okay
185
+ if (error.code === 'EPERM' || error.code === 'ENOTSUP') {
186
+ expect(error).toBeDefined();
187
+ }
188
+ else {
189
+ throw error;
190
+ }
191
+ }
192
+ });
193
+ it('should handle document with null/undefined fields', async () => {
194
+ config.saveConfig(mockConfig());
195
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
196
+ const mockSupabase = createMockSupabaseClient();
197
+ // Document with missing optional fields
198
+ const doc = {
199
+ id: 'doc-1',
200
+ user_id: 'user-123',
201
+ title: 'Incomplete Doc',
202
+ created_at: new Date().toISOString(),
203
+ updated_at: new Date().toISOString()
204
+ // Missing other optional fields
205
+ };
206
+ mockSupabase.from.mockReturnValue({
207
+ select: vi.fn().mockReturnThis(),
208
+ eq: vi.fn().mockReturnThis(),
209
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
210
+ });
211
+ const mockContent = mockBlockNoteContent();
212
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
213
+ mockSupabase.storage.from.mockReturnValue({
214
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
215
+ });
216
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
217
+ // Should handle gracefully
218
+ await pullDocuments(false, true);
219
+ const files = fs.readdirSync(docsDir);
220
+ expect(files.length).toBe(1);
221
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
222
+ expect(content).toContain('kaimon_id: "doc-1"');
223
+ });
224
+ it('should handle document with special timestamp formats', async () => {
225
+ config.saveConfig(mockConfig());
226
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
227
+ const mockSupabase = createMockSupabaseClient();
228
+ // Document with various timestamp formats
229
+ const doc = mockDocumentRecord({
230
+ id: 'doc-1',
231
+ title: 'Timestamp Test',
232
+ created_at: '2024-03-15T12:00:00Z', // ISO with Z
233
+ updated_at: '2024-03-15T12:00:00.000+00:00' // ISO with timezone
234
+ });
235
+ mockSupabase.from.mockReturnValue({
236
+ select: vi.fn().mockReturnThis(),
237
+ eq: vi.fn().mockReturnThis(),
238
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
239
+ });
240
+ const mockContent = mockBlockNoteContent();
241
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
242
+ mockSupabase.storage.from.mockReturnValue({
243
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
244
+ });
245
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
246
+ // Should parse timestamps correctly
247
+ await pullDocuments(false, true);
248
+ const files = fs.readdirSync(docsDir);
249
+ expect(files.length).toBe(1);
250
+ const content = fs.readFileSync(path.join(docsDir, files[0]), 'utf-8');
251
+ expect(content).toContain('created_at:');
252
+ expect(content).toContain('updated_at:');
253
+ });
254
+ it('should handle rapid filesystem changes during pull', async () => {
255
+ config.saveConfig(mockConfig());
256
+ vi.spyOn(tokenRefresh, 'ensureValidToken').mockResolvedValue(true);
257
+ const mockSupabase = createMockSupabaseClient();
258
+ const doc = mockDocumentRecord({ id: 'doc-1', title: 'Rapid Change' });
259
+ mockSupabase.from.mockReturnValue({
260
+ select: vi.fn().mockReturnThis(),
261
+ eq: vi.fn().mockReturnThis(),
262
+ order: vi.fn().mockResolvedValue({ data: [doc], error: null })
263
+ });
264
+ const mockContent = mockBlockNoteContent();
265
+ const blob = new Blob([JSON.stringify(mockContent)], { type: 'application/json' });
266
+ mockSupabase.storage.from.mockReturnValue({
267
+ download: vi.fn().mockResolvedValue({ data: blob, error: null })
268
+ });
269
+ vi.spyOn(supabaseClient, 'getSupabaseClient').mockReturnValue(mockSupabase);
270
+ // Start pull
271
+ const pullPromise = pullDocuments(false, true);
272
+ // Immediately try to delete/modify KaimonDocs folder
273
+ // This simulates user/system interference during pull
274
+ setTimeout(() => {
275
+ try {
276
+ if (fs.existsSync(docsDir)) {
277
+ // Try to delete a file being written
278
+ const files = fs.readdirSync(docsDir);
279
+ if (files.length > 0) {
280
+ fs.unlinkSync(path.join(docsDir, files[0]));
281
+ }
282
+ }
283
+ }
284
+ catch (e) {
285
+ // Expected - file may be locked
286
+ }
287
+ }, 10);
288
+ // Pull should complete despite interference
289
+ await pullPromise;
290
+ // At least attempt was made
291
+ expect(pullPromise).toBeDefined();
292
+ });
293
+ });
294
+ //# sourceMappingURL=edge-cases-advanced.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-cases-advanced.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/edge-cases-advanced.test.ts"],"names":[],"mappings":"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"}