kaimon-cli 0.2.1 → 0.3.0

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