@6missedcalls/notion-cli 0.1.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/dist/cli/program.d.ts +7 -0
  4. package/dist/cli/program.d.ts.map +1 -0
  5. package/dist/cli/program.js +27 -0
  6. package/dist/cli/program.js.map +1 -0
  7. package/dist/cli/shared.d.ts +24 -0
  8. package/dist/cli/shared.d.ts.map +1 -0
  9. package/dist/cli/shared.js +97 -0
  10. package/dist/cli/shared.js.map +1 -0
  11. package/dist/cli.d.ts +13 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +15 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands/block.d.ts +6 -0
  16. package/dist/commands/block.d.ts.map +1 -0
  17. package/dist/commands/block.js +118 -0
  18. package/dist/commands/block.js.map +1 -0
  19. package/dist/commands/db.d.ts +6 -0
  20. package/dist/commands/db.d.ts.map +1 -0
  21. package/dist/commands/db.js +66 -0
  22. package/dist/commands/db.js.map +1 -0
  23. package/dist/commands/page.d.ts +6 -0
  24. package/dist/commands/page.d.ts.map +1 -0
  25. package/dist/commands/page.js +106 -0
  26. package/dist/commands/page.js.map +1 -0
  27. package/dist/commands/push.d.ts +7 -0
  28. package/dist/commands/push.d.ts.map +1 -0
  29. package/dist/commands/push.js +102 -0
  30. package/dist/commands/push.js.map +1 -0
  31. package/dist/commands/search.d.ts +6 -0
  32. package/dist/commands/search.d.ts.map +1 -0
  33. package/dist/commands/search.js +37 -0
  34. package/dist/commands/search.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +3 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/lib/index.d.ts +5 -0
  40. package/dist/lib/index.d.ts.map +1 -0
  41. package/dist/lib/index.js +5 -0
  42. package/dist/lib/index.js.map +1 -0
  43. package/dist/lib/markdown.d.ts +8 -0
  44. package/dist/lib/markdown.d.ts.map +1 -0
  45. package/dist/lib/markdown.js +159 -0
  46. package/dist/lib/markdown.js.map +1 -0
  47. package/dist/lib/markdown.test.d.ts +6 -0
  48. package/dist/lib/markdown.test.d.ts.map +1 -0
  49. package/dist/lib/markdown.test.js +338 -0
  50. package/dist/lib/markdown.test.js.map +1 -0
  51. package/dist/lib/notion-client.d.ts +41 -0
  52. package/dist/lib/notion-client.d.ts.map +1 -0
  53. package/dist/lib/notion-client.js +144 -0
  54. package/dist/lib/notion-client.js.map +1 -0
  55. package/dist/lib/shared.test.d.ts +6 -0
  56. package/dist/lib/shared.test.d.ts.map +1 -0
  57. package/dist/lib/shared.test.js +148 -0
  58. package/dist/lib/shared.test.js.map +1 -0
  59. package/dist/lib/types.d.ts +134 -0
  60. package/dist/lib/types.d.ts.map +1 -0
  61. package/dist/lib/types.js +53 -0
  62. package/dist/lib/types.js.map +1 -0
  63. package/dist/lib/types.test.d.ts +6 -0
  64. package/dist/lib/types.test.d.ts.map +1 -0
  65. package/dist/lib/types.test.js +177 -0
  66. package/dist/lib/types.test.js.map +1 -0
  67. package/package.json +56 -0
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Tests for Markdown to Notion blocks converter
3
+ * Following TDD: Tests written first, covering all conversion scenarios
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { markdownToBlocks, blocksToMarkdown } from './markdown.js';
7
+ describe('markdownToBlocks', () => {
8
+ describe('headings', () => {
9
+ it('should convert # to heading_1', () => {
10
+ const blocks = markdownToBlocks('# Main Title');
11
+ expect(blocks).toHaveLength(1);
12
+ expect(blocks[0].type).toBe('heading_1');
13
+ expect(blocks[0].heading_1.rich_text[0].plain_text).toBe('Main Title');
14
+ });
15
+ it('should convert ## to heading_2', () => {
16
+ const blocks = markdownToBlocks('## Section Title');
17
+ expect(blocks).toHaveLength(1);
18
+ expect(blocks[0].type).toBe('heading_2');
19
+ expect(blocks[0].heading_2.rich_text[0].plain_text).toBe('Section Title');
20
+ });
21
+ it('should convert ### to heading_3', () => {
22
+ const blocks = markdownToBlocks('### Subsection');
23
+ expect(blocks).toHaveLength(1);
24
+ expect(blocks[0].type).toBe('heading_3');
25
+ expect(blocks[0].heading_3.rich_text[0].plain_text).toBe('Subsection');
26
+ });
27
+ });
28
+ describe('paragraphs', () => {
29
+ it('should convert plain text to paragraph', () => {
30
+ const blocks = markdownToBlocks('This is a paragraph.');
31
+ expect(blocks).toHaveLength(1);
32
+ expect(blocks[0].type).toBe('paragraph');
33
+ expect(blocks[0].paragraph.rich_text[0].plain_text).toBe('This is a paragraph.');
34
+ });
35
+ it('should skip empty lines', () => {
36
+ const blocks = markdownToBlocks('First\n\nSecond');
37
+ expect(blocks).toHaveLength(2);
38
+ expect(blocks[0].type).toBe('paragraph');
39
+ expect(blocks[1].type).toBe('paragraph');
40
+ });
41
+ });
42
+ describe('lists', () => {
43
+ it('should convert - to bulleted list item', () => {
44
+ const blocks = markdownToBlocks('- Item one');
45
+ expect(blocks).toHaveLength(1);
46
+ expect(blocks[0].type).toBe('bulleted_list_item');
47
+ expect(blocks[0].bulleted_list_item.rich_text[0].plain_text).toBe('Item one');
48
+ });
49
+ it('should convert * to bulleted list item', () => {
50
+ const blocks = markdownToBlocks('* Item with asterisk');
51
+ expect(blocks).toHaveLength(1);
52
+ expect(blocks[0].type).toBe('bulleted_list_item');
53
+ });
54
+ it('should convert numbered lists', () => {
55
+ const blocks = markdownToBlocks('1. First item\n2. Second item');
56
+ expect(blocks).toHaveLength(2);
57
+ expect(blocks[0].type).toBe('numbered_list_item');
58
+ expect(blocks[1].type).toBe('numbered_list_item');
59
+ expect(blocks[0].numbered_list_item.rich_text[0].plain_text).toBe('First item');
60
+ });
61
+ it('should handle numbered list with any number', () => {
62
+ const blocks = markdownToBlocks('42. Any number works');
63
+ expect(blocks).toHaveLength(1);
64
+ expect(blocks[0].type).toBe('numbered_list_item');
65
+ });
66
+ });
67
+ describe('checkboxes / todos', () => {
68
+ it('should convert - [ ] to unchecked todo', () => {
69
+ const blocks = markdownToBlocks('- [ ] Unchecked task');
70
+ expect(blocks).toHaveLength(1);
71
+ expect(blocks[0].type).toBe('to_do');
72
+ const todo = blocks[0];
73
+ expect(todo.to_do.checked).toBe(false);
74
+ expect(todo.to_do.rich_text[0].plain_text).toBe('Unchecked task');
75
+ });
76
+ it('should convert - [x] to checked todo', () => {
77
+ const blocks = markdownToBlocks('- [x] Checked task');
78
+ expect(blocks).toHaveLength(1);
79
+ expect(blocks[0].type).toBe('to_do');
80
+ expect(blocks[0].to_do.checked).toBe(true);
81
+ });
82
+ it('should convert - [X] (uppercase) to checked todo', () => {
83
+ const blocks = markdownToBlocks('- [X] Also checked');
84
+ expect(blocks).toHaveLength(1);
85
+ expect(blocks[0].to_do.checked).toBe(true);
86
+ });
87
+ });
88
+ describe('code blocks', () => {
89
+ it('should convert fenced code block', () => {
90
+ const markdown = '```javascript\nconst x = 1;\n```';
91
+ const blocks = markdownToBlocks(markdown);
92
+ expect(blocks).toHaveLength(1);
93
+ expect(blocks[0].type).toBe('code');
94
+ const code = blocks[0];
95
+ expect(code.code.language).toBe('javascript');
96
+ expect(code.code.rich_text[0].plain_text).toBe('const x = 1;');
97
+ });
98
+ it('should handle code block without language', () => {
99
+ const markdown = '```\nplain code\n```';
100
+ const blocks = markdownToBlocks(markdown);
101
+ expect(blocks).toHaveLength(1);
102
+ expect(blocks[0].code.language).toBe('plain text');
103
+ });
104
+ it('should handle multiline code blocks', () => {
105
+ const markdown = '```python\ndef hello():\n print("Hi")\n```';
106
+ const blocks = markdownToBlocks(markdown);
107
+ expect(blocks).toHaveLength(1);
108
+ expect(blocks[0].code.rich_text[0].plain_text).toBe('def hello():\n print("Hi")');
109
+ });
110
+ });
111
+ describe('blockquotes', () => {
112
+ it('should convert > to quote', () => {
113
+ const blocks = markdownToBlocks('> This is a quote');
114
+ expect(blocks).toHaveLength(1);
115
+ expect(blocks[0].type).toBe('quote');
116
+ expect(blocks[0].quote.rich_text[0].plain_text).toBe('This is a quote');
117
+ });
118
+ });
119
+ describe('dividers', () => {
120
+ it('should convert --- to divider', () => {
121
+ const blocks = markdownToBlocks('---');
122
+ expect(blocks).toHaveLength(1);
123
+ expect(blocks[0].type).toBe('divider');
124
+ });
125
+ it('should convert *** to divider', () => {
126
+ const blocks = markdownToBlocks('***');
127
+ expect(blocks).toHaveLength(1);
128
+ expect(blocks[0].type).toBe('divider');
129
+ });
130
+ it('should convert ___ to divider', () => {
131
+ const blocks = markdownToBlocks('___');
132
+ expect(blocks).toHaveLength(1);
133
+ expect(blocks[0].type).toBe('divider');
134
+ });
135
+ it('should handle longer dividers', () => {
136
+ const blocks = markdownToBlocks('----------');
137
+ expect(blocks).toHaveLength(1);
138
+ expect(blocks[0].type).toBe('divider');
139
+ });
140
+ });
141
+ describe('callouts', () => {
142
+ it('should convert > [!NOTE] to callout with info emoji', () => {
143
+ const blocks = markdownToBlocks('> [!NOTE] This is a note');
144
+ expect(blocks).toHaveLength(1);
145
+ expect(blocks[0].type).toBe('callout');
146
+ const callout = blocks[0];
147
+ expect(callout.callout.icon?.emoji).toBe('ℹ️');
148
+ expect(callout.callout.rich_text[0].plain_text).toBe('This is a note');
149
+ });
150
+ it('should convert > [!WARNING] to callout with warning emoji', () => {
151
+ const blocks = markdownToBlocks('> [!WARNING] Be careful');
152
+ expect(blocks).toHaveLength(1);
153
+ expect(blocks[0].callout.icon?.emoji).toBe('⚠️');
154
+ });
155
+ it('should convert > [!TIP] to callout with tip emoji', () => {
156
+ const blocks = markdownToBlocks('> [!TIP] Helpful tip');
157
+ expect(blocks).toHaveLength(1);
158
+ expect(blocks[0].callout.icon?.emoji).toBe('💡');
159
+ });
160
+ it('should convert > [!IMPORTANT] to callout with important emoji', () => {
161
+ const blocks = markdownToBlocks('> [!IMPORTANT] Read this');
162
+ expect(blocks).toHaveLength(1);
163
+ expect(blocks[0].callout.icon?.emoji).toBe('❗');
164
+ });
165
+ it('should handle callout without text after type', () => {
166
+ const blocks = markdownToBlocks('> [!NOTE]');
167
+ expect(blocks).toHaveLength(1);
168
+ expect(blocks[0].callout.rich_text[0].plain_text).toBe('NOTE');
169
+ });
170
+ });
171
+ describe('tables', () => {
172
+ it('should convert table to code block (preserving content)', () => {
173
+ const markdown = '| Header 1 | Header 2 |\n| --- | --- |\n| Cell 1 | Cell 2 |';
174
+ const blocks = markdownToBlocks(markdown);
175
+ expect(blocks).toHaveLength(1);
176
+ expect(blocks[0].type).toBe('code');
177
+ });
178
+ });
179
+ describe('mixed content', () => {
180
+ it('should handle document with multiple block types', () => {
181
+ const markdown = `# Title
182
+
183
+ This is a paragraph.
184
+
185
+ - List item 1
186
+ - List item 2
187
+
188
+ > A quote
189
+
190
+ ---
191
+
192
+ \`\`\`js
193
+ code here
194
+ \`\`\``;
195
+ const blocks = markdownToBlocks(markdown);
196
+ expect(blocks.length).toBeGreaterThan(5);
197
+ expect(blocks[0].type).toBe('heading_1');
198
+ expect(blocks.find(b => b.type === 'paragraph')).toBeDefined();
199
+ expect(blocks.filter(b => b.type === 'bulleted_list_item')).toHaveLength(2);
200
+ expect(blocks.find(b => b.type === 'quote')).toBeDefined();
201
+ expect(blocks.find(b => b.type === 'divider')).toBeDefined();
202
+ expect(blocks.find(b => b.type === 'code')).toBeDefined();
203
+ });
204
+ });
205
+ describe('edge cases', () => {
206
+ it('should handle empty string', () => {
207
+ const blocks = markdownToBlocks('');
208
+ expect(blocks).toHaveLength(0);
209
+ });
210
+ it('should handle string with only whitespace', () => {
211
+ const blocks = markdownToBlocks(' \n\n ');
212
+ expect(blocks).toHaveLength(0);
213
+ });
214
+ });
215
+ });
216
+ describe('blocksToMarkdown', () => {
217
+ describe('headings', () => {
218
+ it('should convert heading_1 to #', () => {
219
+ const blocks = [
220
+ { type: 'heading_1', heading_1: { rich_text: [{ plain_text: 'Title' }] } },
221
+ ];
222
+ const markdown = blocksToMarkdown(blocks);
223
+ expect(markdown).toContain('# Title');
224
+ });
225
+ it('should convert heading_2 to ##', () => {
226
+ const blocks = [
227
+ { type: 'heading_2', heading_2: { rich_text: [{ plain_text: 'Section' }] } },
228
+ ];
229
+ const markdown = blocksToMarkdown(blocks);
230
+ expect(markdown).toContain('## Section');
231
+ });
232
+ it('should convert heading_3 to ###', () => {
233
+ const blocks = [
234
+ { type: 'heading_3', heading_3: { rich_text: [{ plain_text: 'Subsection' }] } },
235
+ ];
236
+ const markdown = blocksToMarkdown(blocks);
237
+ expect(markdown).toContain('### Subsection');
238
+ });
239
+ });
240
+ describe('paragraphs', () => {
241
+ it('should convert paragraph to plain text', () => {
242
+ const blocks = [
243
+ { type: 'paragraph', paragraph: { rich_text: [{ plain_text: 'Hello world' }] } },
244
+ ];
245
+ const markdown = blocksToMarkdown(blocks);
246
+ expect(markdown).toContain('Hello world');
247
+ });
248
+ });
249
+ describe('lists', () => {
250
+ it('should convert bulleted list item to -', () => {
251
+ const blocks = [
252
+ { type: 'bulleted_list_item', bulleted_list_item: { rich_text: [{ plain_text: 'Item' }] } },
253
+ ];
254
+ const markdown = blocksToMarkdown(blocks);
255
+ expect(markdown).toContain('- Item');
256
+ });
257
+ it('should convert numbered list item to 1.', () => {
258
+ const blocks = [
259
+ { type: 'numbered_list_item', numbered_list_item: { rich_text: [{ plain_text: 'Item' }] } },
260
+ ];
261
+ const markdown = blocksToMarkdown(blocks);
262
+ expect(markdown).toContain('1. Item');
263
+ });
264
+ });
265
+ describe('todos', () => {
266
+ it('should convert unchecked todo to - [ ]', () => {
267
+ const blocks = [
268
+ { type: 'to_do', to_do: { rich_text: [{ plain_text: 'Task' }], checked: false } },
269
+ ];
270
+ const markdown = blocksToMarkdown(blocks);
271
+ expect(markdown).toContain('- [ ] Task');
272
+ });
273
+ it('should convert checked todo to - [x]', () => {
274
+ const blocks = [
275
+ { type: 'to_do', to_do: { rich_text: [{ plain_text: 'Done' }], checked: true } },
276
+ ];
277
+ const markdown = blocksToMarkdown(blocks);
278
+ expect(markdown).toContain('- [x] Done');
279
+ });
280
+ });
281
+ describe('code blocks', () => {
282
+ it('should convert code block to fenced code', () => {
283
+ const blocks = [
284
+ { type: 'code', code: { rich_text: [{ plain_text: 'const x = 1;' }], language: 'javascript' } },
285
+ ];
286
+ const markdown = blocksToMarkdown(blocks);
287
+ expect(markdown).toContain('```javascript');
288
+ expect(markdown).toContain('const x = 1;');
289
+ expect(markdown).toContain('```');
290
+ });
291
+ });
292
+ describe('quotes', () => {
293
+ it('should convert quote to >', () => {
294
+ const blocks = [
295
+ { type: 'quote', quote: { rich_text: [{ plain_text: 'Quoted text' }] } },
296
+ ];
297
+ const markdown = blocksToMarkdown(blocks);
298
+ expect(markdown).toContain('> Quoted text');
299
+ });
300
+ });
301
+ describe('dividers', () => {
302
+ it('should convert divider to ---', () => {
303
+ const blocks = [
304
+ { type: 'divider', divider: {} },
305
+ ];
306
+ const markdown = blocksToMarkdown(blocks);
307
+ expect(markdown).toContain('---');
308
+ });
309
+ });
310
+ describe('callouts', () => {
311
+ it('should convert callout to > with emoji', () => {
312
+ const blocks = [
313
+ { type: 'callout', callout: { rich_text: [{ plain_text: 'Note' }], icon: { emoji: '💡' } } },
314
+ ];
315
+ const markdown = blocksToMarkdown(blocks);
316
+ expect(markdown).toContain('> 💡 Note');
317
+ });
318
+ it('should handle callout without icon', () => {
319
+ const blocks = [
320
+ { type: 'callout', callout: { rich_text: [{ plain_text: 'Note' }] } },
321
+ ];
322
+ const markdown = blocksToMarkdown(blocks);
323
+ expect(markdown).toContain('> 💡 Note');
324
+ });
325
+ });
326
+ describe('round-trip conversion', () => {
327
+ it('should maintain content through markdown -> blocks -> markdown', () => {
328
+ const original = '# Title\n\nParagraph text.\n\n- List item\n\n> Quote';
329
+ const blocks = markdownToBlocks(original);
330
+ const result = blocksToMarkdown(blocks);
331
+ expect(result).toContain('# Title');
332
+ expect(result).toContain('Paragraph text.');
333
+ expect(result).toContain('- List item');
334
+ expect(result).toContain('> Quote');
335
+ });
336
+ });
337
+ });
338
+ //# sourceMappingURL=markdown.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../src/lib/markdown.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Notion API Client
3
+ * Handles all HTTP requests to Notion API
4
+ */
5
+ import type { Block, Page, Database } from './types.js';
6
+ export interface NotionClientOptions {
7
+ apiKey: string;
8
+ timeoutMs?: number;
9
+ }
10
+ export interface ApiResponse<T> {
11
+ success: boolean;
12
+ data?: T;
13
+ error?: string;
14
+ status?: number;
15
+ }
16
+ export interface PaginatedResponse<T> {
17
+ object: 'list';
18
+ results: T[];
19
+ next_cursor: string | null;
20
+ has_more: boolean;
21
+ }
22
+ export declare class NotionClient {
23
+ private apiKey;
24
+ private timeoutMs;
25
+ constructor(options: NotionClientOptions);
26
+ private request;
27
+ getPage(pageId: string): Promise<ApiResponse<Page>>;
28
+ createPage(parentId: string, title: string, parentType?: 'page' | 'database', properties?: Record<string, unknown>): Promise<ApiResponse<Page>>;
29
+ updatePage(pageId: string, updates: Record<string, unknown>): Promise<ApiResponse<Page>>;
30
+ archivePage(pageId: string): Promise<ApiResponse<Page>>;
31
+ getDatabase(databaseId: string): Promise<ApiResponse<Database>>;
32
+ queryDatabase(databaseId: string, filter?: Record<string, unknown>, sorts?: unknown[], cursor?: string): Promise<ApiResponse<PaginatedResponse<Page>>>;
33
+ getBlock(blockId: string): Promise<ApiResponse<Block>>;
34
+ getBlockChildren(blockId: string, cursor?: string): Promise<ApiResponse<PaginatedResponse<Block>>>;
35
+ appendBlocks(blockId: string, children: Block[]): Promise<ApiResponse<PaginatedResponse<Block>>>;
36
+ deleteBlock(blockId: string): Promise<ApiResponse<Block>>;
37
+ search(query?: string, filter?: 'page' | 'database', cursor?: string): Promise<ApiResponse<PaginatedResponse<Page | Database>>>;
38
+ getMe(): Promise<ApiResponse<unknown>>;
39
+ listUsers(cursor?: string): Promise<ApiResponse<PaginatedResponse<unknown>>>;
40
+ }
41
+ //# sourceMappingURL=notion-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-client.d.ts","sourceRoot":"","sources":["../../src/lib/notion-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AAKrE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,mBAAmB;YAK1B,OAAO;IA2Cf,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAInD,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAM,GAAG,UAAmB,EACxC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAiBvB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAIvB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAKvD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAI/D,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAc1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAItD,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAQ3C,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,KAAK,EAAE,GAChB,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IA0C3C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAKzD,MAAM,CACV,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC;IAUrD,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAItC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;CAInF"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Notion API Client
3
+ * Handles all HTTP requests to Notion API
4
+ */
5
+ const NOTION_API_URL = 'https://api.notion.com/v1';
6
+ const NOTION_VERSION = '2022-06-28';
7
+ export class NotionClient {
8
+ apiKey;
9
+ timeoutMs;
10
+ constructor(options) {
11
+ this.apiKey = options.apiKey;
12
+ this.timeoutMs = options.timeoutMs ?? 30000;
13
+ }
14
+ async request(method, path, body) {
15
+ const url = `${NOTION_API_URL}${path}`;
16
+ const controller = new AbortController();
17
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
18
+ try {
19
+ const response = await fetch(url, {
20
+ method,
21
+ headers: {
22
+ 'Authorization': `Bearer ${this.apiKey}`,
23
+ 'Notion-Version': NOTION_VERSION,
24
+ 'Content-Type': 'application/json',
25
+ },
26
+ body: body ? JSON.stringify(body) : undefined,
27
+ signal: controller.signal,
28
+ });
29
+ clearTimeout(timeout);
30
+ const data = await response.json();
31
+ if (!response.ok) {
32
+ const error = data;
33
+ return {
34
+ success: false,
35
+ error: error.message || `HTTP ${response.status}`,
36
+ status: response.status,
37
+ };
38
+ }
39
+ return { success: true, data: data };
40
+ }
41
+ catch (err) {
42
+ clearTimeout(timeout);
43
+ const message = err instanceof Error ? err.message : 'Unknown error';
44
+ return { success: false, error: message };
45
+ }
46
+ }
47
+ // Pages
48
+ async getPage(pageId) {
49
+ return this.request('GET', `/pages/${pageId}`);
50
+ }
51
+ async createPage(parentId, title, parentType = 'page', properties) {
52
+ const parent = parentType === 'database'
53
+ ? { database_id: parentId }
54
+ : { page_id: parentId };
55
+ const body = {
56
+ parent,
57
+ properties: properties ?? {
58
+ title: {
59
+ title: [{ type: 'text', text: { content: title } }],
60
+ },
61
+ },
62
+ };
63
+ return this.request('POST', '/pages', body);
64
+ }
65
+ async updatePage(pageId, updates) {
66
+ return this.request('PATCH', `/pages/${pageId}`, updates);
67
+ }
68
+ async archivePage(pageId) {
69
+ return this.updatePage(pageId, { archived: true });
70
+ }
71
+ // Databases
72
+ async getDatabase(databaseId) {
73
+ return this.request('GET', `/databases/${databaseId}`);
74
+ }
75
+ async queryDatabase(databaseId, filter, sorts, cursor) {
76
+ const body = {};
77
+ if (filter)
78
+ body.filter = filter;
79
+ if (sorts)
80
+ body.sorts = sorts;
81
+ if (cursor)
82
+ body.start_cursor = cursor;
83
+ return this.request('POST', `/databases/${databaseId}/query`, body);
84
+ }
85
+ // Blocks
86
+ async getBlock(blockId) {
87
+ return this.request('GET', `/blocks/${blockId}`);
88
+ }
89
+ async getBlockChildren(blockId, cursor) {
90
+ const params = cursor ? `?start_cursor=${cursor}` : '';
91
+ return this.request('GET', `/blocks/${blockId}/children${params}`);
92
+ }
93
+ async appendBlocks(blockId, children) {
94
+ // Notion API limit: max 100 blocks per request
95
+ const BATCH_SIZE = 100;
96
+ if (children.length <= BATCH_SIZE) {
97
+ return this.request('PATCH', `/blocks/${blockId}/children`, { children });
98
+ }
99
+ // Batch large requests (using immutable pattern)
100
+ let allResults = [];
101
+ for (let i = 0; i < children.length; i += BATCH_SIZE) {
102
+ const batch = children.slice(i, i + BATCH_SIZE);
103
+ const result = await this.request('PATCH', `/blocks/${blockId}/children`, { children: batch });
104
+ if (!result.success) {
105
+ return result;
106
+ }
107
+ if (result.data?.results) {
108
+ allResults = [...allResults, ...result.data.results];
109
+ }
110
+ }
111
+ return {
112
+ success: true,
113
+ data: {
114
+ object: 'list',
115
+ results: allResults,
116
+ next_cursor: null,
117
+ has_more: false,
118
+ },
119
+ };
120
+ }
121
+ async deleteBlock(blockId) {
122
+ return this.request('DELETE', `/blocks/${blockId}`);
123
+ }
124
+ // Search
125
+ async search(query, filter, cursor) {
126
+ const body = {};
127
+ if (query)
128
+ body.query = query;
129
+ if (filter)
130
+ body.filter = { property: 'object', value: filter };
131
+ if (cursor)
132
+ body.start_cursor = cursor;
133
+ return this.request('POST', '/search', body);
134
+ }
135
+ // Users
136
+ async getMe() {
137
+ return this.request('GET', '/users/me');
138
+ }
139
+ async listUsers(cursor) {
140
+ const params = cursor ? `?start_cursor=${cursor}` : '';
141
+ return this.request('GET', `/users${params}`);
142
+ }
143
+ }
144
+ //# sourceMappingURL=notion-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-client.js","sourceRoot":"","sources":["../../src/lib/notion-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests for CLI shared utilities
3
+ * Following TDD: Tests written first, covering all utility functions
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=shared.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.test.d.ts","sourceRoot":"","sources":["../../src/lib/shared.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}