vibeman 0.0.2 → 0.0.3

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 (71) hide show
  1. package/dist/runtime/api/.tsbuildinfo +1 -1
  2. package/dist/runtime/api/agent/agent-service.d.ts +7 -6
  3. package/dist/runtime/api/agent/agent-service.js +36 -27
  4. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.d.ts +2 -0
  5. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.js +62 -30
  6. package/dist/runtime/api/agent/codex-cli-provider.test.js +47 -2
  7. package/dist/runtime/api/agent/routing-policy.d.ts +13 -30
  8. package/dist/runtime/api/agent/routing-policy.js +82 -132
  9. package/dist/runtime/api/agent/routing-policy.test.js +63 -0
  10. package/dist/runtime/api/api/routers/ai.d.ts +15 -3
  11. package/dist/runtime/api/api/routers/ai.js +7 -6
  12. package/dist/runtime/api/api/routers/executions.d.ts +1 -1
  13. package/dist/runtime/api/api/routers/tasks.d.ts +3 -3
  14. package/dist/runtime/api/api/routers/workflows.d.ts +8 -0
  15. package/dist/runtime/api/api/routers/workflows.js +2 -1
  16. package/dist/runtime/api/api/trpc.d.ts +6 -6
  17. package/dist/runtime/api/lib/trpc/server.d.ts +27 -7
  18. package/dist/runtime/api/router.d.ts +27 -7
  19. package/dist/runtime/api/settings-service.js +49 -1
  20. package/dist/runtime/api/types/index.d.ts +8 -1
  21. package/dist/runtime/api/types/settings.d.ts +15 -2
  22. package/dist/runtime/api/workflows/vibing-orchestrator.js +32 -1
  23. package/dist/runtime/web/.next/BUILD_ID +1 -1
  24. package/dist/runtime/web/.next/app-build-manifest.json +18 -11
  25. package/dist/runtime/web/.next/app-path-routes-manifest.json +2 -1
  26. package/dist/runtime/web/.next/build-manifest.json +2 -2
  27. package/dist/runtime/web/.next/prerender-manifest.json +10 -10
  28. package/dist/runtime/web/.next/routes-manifest.json +8 -0
  29. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js +1 -0
  30. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js.nft.json +1 -0
  31. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route_client-reference-manifest.js +1 -0
  32. package/dist/runtime/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  33. package/dist/runtime/web/.next/server/app/_not-found.html +2 -2
  34. package/dist/runtime/web/.next/server/app/_not-found.rsc +1 -1
  35. package/dist/runtime/web/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  36. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js +1 -1
  37. package/dist/runtime/web/.next/server/app/api/images/[...path]/route_client-reference-manifest.js +1 -1
  38. package/dist/runtime/web/.next/server/app/api/upload/route.js +1 -1
  39. package/dist/runtime/web/.next/server/app/api/upload/route_client-reference-manifest.js +1 -1
  40. package/dist/runtime/web/.next/server/app/index.html +2 -2
  41. package/dist/runtime/web/.next/server/app/index.rsc +2 -2
  42. package/dist/runtime/web/.next/server/app/page.js +21 -21
  43. package/dist/runtime/web/.next/server/app/page_client-reference-manifest.js +1 -1
  44. package/dist/runtime/web/.next/server/app-paths-manifest.json +2 -1
  45. package/dist/runtime/web/.next/server/pages/404.html +2 -2
  46. package/dist/runtime/web/.next/server/pages/500.html +1 -1
  47. package/dist/runtime/web/.next/server/server-reference-manifest.json +1 -1
  48. package/dist/runtime/web/.next/static/5_15u1WQCxN1_eHZpldCv/_buildManifest.js +1 -0
  49. package/dist/runtime/web/.next/static/chunks/{277-0142a939f08738c3.js → 823-6f371a6e829adbba.js} +1 -1
  50. package/dist/runtime/web/.next/static/chunks/app/.vibeman/assets/images/[...path]/route-751c9265a65409e5.js +1 -0
  51. package/dist/runtime/web/.next/static/chunks/app/api/health/route-751c9265a65409e5.js +1 -0
  52. package/dist/runtime/web/.next/static/chunks/app/api/images/[...path]/route-751c9265a65409e5.js +1 -0
  53. package/dist/runtime/web/.next/static/chunks/app/api/upload/route-751c9265a65409e5.js +1 -0
  54. package/dist/runtime/web/.next/static/chunks/app/page-9fe7d75095b4ccec.js +1 -0
  55. package/package.json +1 -1
  56. package/dist/runtime/api/lib/image-paste-drop-extension.d.ts +0 -26
  57. package/dist/runtime/api/lib/image-paste-drop-extension.js +0 -125
  58. package/dist/runtime/api/lib/markdown-utils.d.ts +0 -8
  59. package/dist/runtime/api/lib/markdown-utils.js +0 -282
  60. package/dist/runtime/api/lib/markdown-utils.test.js +0 -348
  61. package/dist/runtime/api/lib/tiptap-utils.clamp-selection.test.d.ts +0 -1
  62. package/dist/runtime/api/lib/tiptap-utils.clamp-selection.test.js +0 -27
  63. package/dist/runtime/api/lib/tiptap-utils.d.ts +0 -130
  64. package/dist/runtime/api/lib/tiptap-utils.js +0 -327
  65. package/dist/runtime/web/.next/static/chunks/app/api/health/route-105a61ae865ba536.js +0 -1
  66. package/dist/runtime/web/.next/static/chunks/app/api/images/[...path]/route-105a61ae865ba536.js +0 -1
  67. package/dist/runtime/web/.next/static/chunks/app/api/upload/route-105a61ae865ba536.js +0 -1
  68. package/dist/runtime/web/.next/static/chunks/app/page-8c3ba579efc6f918.js +0 -1
  69. package/dist/runtime/web/.next/static/mRpNgPfbYR_0wrODzlg_4/_buildManifest.js +0 -1
  70. /package/dist/runtime/api/{lib/markdown-utils.test.d.ts → agent/routing-policy.test.d.ts} +0 -0
  71. /package/dist/runtime/web/.next/static/{mRpNgPfbYR_0wrODzlg_4 → 5_15u1WQCxN1_eHZpldCv}/_ssgManifest.js +0 -0
@@ -1,348 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { markdownToHtml, htmlToMarkdown } from './markdown-utils.js';
3
- describe('markdown-utils', () => {
4
- describe('markdownToHtml', () => {
5
- it('should return empty string for empty input', () => {
6
- expect(markdownToHtml('')).toBe('');
7
- expect(markdownToHtml(' ')).toBe('');
8
- expect(markdownToHtml(null)).toBe('');
9
- expect(markdownToHtml(undefined)).toBe('');
10
- });
11
- it('should convert task item to HTML', () => {
12
- const markdown = `- [ ] Task item
13
- - [x] Checked task`;
14
- const html = markdownToHtml(markdown);
15
- // Check for proper TipTap TaskList structure
16
- expect(html).toContain('data-type="taskList"');
17
- expect(html).toContain('data-type="taskItem"');
18
- expect(html).toContain('data-checked="false"');
19
- expect(html).toContain('data-checked="true"');
20
- expect(html).toContain('<label contenteditable="false">');
21
- expect(html).toContain('<input type="checkbox" >');
22
- expect(html).toContain('<input type="checkbox" checked>');
23
- expect(html).toContain('<p>Task item</p>');
24
- expect(html).toContain('<p>Checked task</p>');
25
- });
26
- it('should convert basic markdown to HTML', () => {
27
- const markdown = '# Heading 1\n\nThis is a paragraph.\n\n**Bold text** and *italic text*.';
28
- const html = markdownToHtml(markdown);
29
- expect(html).toContain('<h1>Heading 1</h1>');
30
- expect(html).toContain('<p>This is a paragraph.</p>');
31
- expect(html).toContain('<strong>Bold text</strong>');
32
- expect(html).toContain('<em>italic text</em>');
33
- });
34
- // it('should convert simple task lists to HTML with data-type attribute', () => {
35
- // const markdown = '- [ ] Unchecked task\n- [x] Checked task';
36
- // const html = markdownToHtml(markdown);
37
- // expect(html).toContain('data-type="taskItem"');
38
- // expect(html).toContain('<input type="checkbox" disabled>');
39
- // expect(html).toContain('<input type="checkbox" checked disabled>');
40
- // expect(html).toContain('Unchecked task');
41
- // expect(html).toContain('Checked task');
42
- // });
43
- // it('should handle two-level nested task lists', () => {
44
- // const markdown = `- [ ] Parent task
45
- // - [ ] Child task 1
46
- // - [x] Child task 2`;
47
- // const html = markdownToHtml(markdown);
48
- // expect(html).toContain('Parent task');
49
- // expect(html).toContain('Child task 1');
50
- // expect(html).toContain('Child task 2');
51
- // expect(html).toMatch(/<ul>[\s\S]*<ul>/); // Nested ul elements
52
- // });
53
- // it('should handle three-level nested task lists', () => {
54
- // const markdown = `- [ ] Level 1
55
- // - [ ] Level 2
56
- // - [x] Level 3`;
57
- // const html = markdownToHtml(markdown);
58
- // expect(html).toContain('Level 1');
59
- // expect(html).toContain('Level 2');
60
- // expect(html).toContain('Level 3');
61
- // // Should have at least 3 ul elements for 3 levels
62
- // const ulCount = (html.match(/<ul>/g) || []).length;
63
- // expect(ulCount).toBeGreaterThanOrEqual(3);
64
- // });
65
- // it('should handle deeply nested task lists (5 levels)', () => {
66
- // const markdown = `- [ ] Level 1
67
- // - [ ] Level 2
68
- // - [ ] Level 3
69
- // - [ ] Level 4
70
- // - [x] Level 5`;
71
- // const html = markdownToHtml(markdown);
72
- // expect(html).toContain('Level 1');
73
- // expect(html).toContain('Level 5');
74
- // const ulCount = (html.match(/<ul>/g) || []).length;
75
- // expect(ulCount).toBeGreaterThanOrEqual(5);
76
- // });
77
- // it('should handle mixed task lists and regular lists', () => {
78
- // const markdown = `- [ ] Task item
79
- // - Regular nested item
80
- // - [ ] Nested task
81
- // - Another regular item`;
82
- // const html = markdownToHtml(markdown);
83
- // expect(html).toContain('Task item');
84
- // expect(html).toContain('Regular nested item');
85
- // expect(html).toContain('Nested task');
86
- // expect(html).toContain('Another regular item');
87
- // });
88
- // it('should handle task lists with complex content', () => {
89
- // const markdown = `- [ ] Task with **bold** and *italic*
90
- // - [ ] Task with \`code\`
91
- // - [ ] Task with [link](https://example.com)`;
92
- // const html = markdownToHtml(markdown);
93
- // // Complex markdown inside task items may not be parsed yet
94
- // // This is a known limitation - task item text is not re-parsed for markdown
95
- // expect(html).toContain('Task with **bold** and *italic*');
96
- // expect(html).toContain('Task with `code`');
97
- // expect(html).toContain('Task with [link](https://example.com)');
98
- // });
99
- it('should handle numbered lists', () => {
100
- const markdown = '1. First item\n2. Second item\n3. Third item';
101
- const html = markdownToHtml(markdown);
102
- expect(html).toContain('<ol>');
103
- expect(html).toContain('First item');
104
- expect(html).toContain('Second item');
105
- });
106
- it('should handle code blocks', () => {
107
- const markdown = '```javascript\nconst hello = "world";\n```';
108
- const html = markdownToHtml(markdown);
109
- expect(html).toContain('<pre>');
110
- expect(html).toContain('<code');
111
- expect(html).toContain('hello');
112
- });
113
- it('should handle blockquotes', () => {
114
- const markdown = '> This is a quote';
115
- const html = markdownToHtml(markdown);
116
- expect(html).toContain('<blockquote>');
117
- expect(html).toContain('This is a quote');
118
- });
119
- });
120
- describe('htmlToMarkdown', () => {
121
- it('should return empty string for empty input', () => {
122
- expect(htmlToMarkdown('')).toBe('');
123
- expect(htmlToMarkdown(' ')).toBe('');
124
- expect(htmlToMarkdown(null)).toBe('');
125
- expect(htmlToMarkdown(undefined)).toBe('');
126
- });
127
- it('should convert basic HTML to markdown', () => {
128
- const html = '<h1>Heading 1</h1><p>This is a paragraph.</p><p><strong>Bold text</strong> and <em>italic text</em>.</p>';
129
- const markdown = htmlToMarkdown(html);
130
- expect(markdown).toContain('# Heading 1');
131
- expect(markdown).toContain('This is a paragraph.');
132
- expect(markdown).toContain('**Bold text**');
133
- // Turndown uses underscore for italic by default
134
- expect(markdown).toContain('_italic text_');
135
- });
136
- it('should convert task list HTML back to markdown', () => {
137
- const html = `<ul>
138
- <li data-type="taskItem"><input type="checkbox" disabled> Unchecked task</li>
139
- <li data-type="taskItem"><input type="checkbox" checked disabled> Checked task</li>
140
- </ul>`;
141
- const markdown = htmlToMarkdown(html);
142
- expect(markdown).toContain('- [ ] Unchecked task');
143
- expect(markdown).toContain('- [x] Checked task');
144
- });
145
- it('should preserve two-level nested task list indentation', () => {
146
- const html = `<ul>
147
- <li data-type="taskItem"><input type="checkbox" disabled> Parent task
148
- <ul>
149
- <li data-type="taskItem"><input type="checkbox" disabled> Child task 1</li>
150
- <li data-type="taskItem"><input type="checkbox" checked disabled> Child task 2</li>
151
- </ul>
152
- </li>
153
- </ul>`;
154
- const markdown = htmlToMarkdown(html);
155
- expect(markdown).toContain('- [ ] Parent task');
156
- expect(markdown).toContain(' - [ ] Child task 1');
157
- expect(markdown).toContain(' - [x] Child task 2');
158
- });
159
- it('should preserve three-level nested task list indentation', () => {
160
- const html = `<ul>
161
- <li data-type="taskItem"><input type="checkbox" disabled> Level 1
162
- <ul>
163
- <li data-type="taskItem"><input type="checkbox" disabled> Level 2
164
- <ul>
165
- <li data-type="taskItem"><input type="checkbox" checked disabled> Level 3</li>
166
- </ul>
167
- </li>
168
- </ul>
169
- </li>
170
- </ul>`;
171
- const markdown = htmlToMarkdown(html);
172
- expect(markdown).toContain('- [ ] Level 1');
173
- expect(markdown).toContain(' - [ ] Level 2');
174
- expect(markdown).toContain(' - [x] Level 3');
175
- });
176
- it('should handle regular nested lists', () => {
177
- const html = `<ul>
178
- <li>Parent item
179
- <ul>
180
- <li>Child item 1</li>
181
- <li>Child item 2</li>
182
- </ul>
183
- </li>
184
- </ul>`;
185
- const markdown = htmlToMarkdown(html);
186
- // Turndown may add extra spacing in lists
187
- expect(markdown).toContain('Parent item');
188
- expect(markdown).toContain('Child item 1');
189
- expect(markdown).toContain('Child item 2');
190
- // Check for proper nesting with indentation
191
- expect(markdown).toMatch(/.*Child item 1/);
192
- });
193
- it('should handle numbered lists', () => {
194
- const html = '<ol><li>First</li><li>Second</li><li>Third</li></ol>';
195
- const markdown = htmlToMarkdown(html);
196
- // Turndown may add extra spacing after the period
197
- expect(markdown).toMatch(/1\.\s+First/);
198
- expect(markdown).toMatch(/2\.\s+Second/);
199
- expect(markdown).toMatch(/3\.\s+Third/);
200
- });
201
- it('should handle code blocks', () => {
202
- const html = '<pre><code class="language-javascript">const hello = "world";</code></pre>';
203
- const markdown = htmlToMarkdown(html);
204
- expect(markdown).toContain('```');
205
- expect(markdown).toContain('const hello = "world";');
206
- });
207
- it('should handle inline code', () => {
208
- const html = '<p>Use <code>npm install</code> to install.</p>';
209
- const markdown = htmlToMarkdown(html);
210
- expect(markdown).toContain('`npm install`');
211
- });
212
- it('should handle links', () => {
213
- const html = '<p>Visit <a href="https://example.com">example</a></p>';
214
- const markdown = htmlToMarkdown(html);
215
- expect(markdown).toContain('[example](https://example.com)');
216
- });
217
- it('should handle blockquotes', () => {
218
- const html = '<blockquote><p>This is a quote</p></blockquote>';
219
- const markdown = htmlToMarkdown(html);
220
- expect(markdown).toContain('> This is a quote');
221
- });
222
- it('should handle horizontal rules', () => {
223
- const html = '<hr>';
224
- const markdown = htmlToMarkdown(html);
225
- expect(markdown).toContain('---');
226
- });
227
- it('should render list item', () => {
228
- const html = '<li>Test</li>';
229
- const markdown = htmlToMarkdown(html);
230
- expect(markdown).toContain('- Test');
231
- });
232
- });
233
- // describe('Round-trip conversion', () => {
234
- // it('should preserve simple task lists through round-trip conversion', () => {
235
- // const original = '- [ ] Task 1\n- [x] Task 2';
236
- // const html = markdownToHtml(original);
237
- // const result = htmlToMarkdown(html);
238
- // expect(result).toContain('- [ ] Task 1');
239
- // expect(result).toContain('- [x] Task 2');
240
- // });
241
- // it('should preserve two-level nested task lists through round-trip conversion', () => {
242
- // const original = `- [ ] Parent task
243
- // - [ ] Child task 1
244
- // - [x] Child task 2`;
245
- // const html = markdownToHtml(original);
246
- // const result = htmlToMarkdown(html);
247
- // expect(result).toContain('- [ ] Parent task');
248
- // expect(result).toContain(' - [ ] Child task 1');
249
- // expect(result).toContain(' - [x] Child task 2');
250
- // });
251
- // it('should preserve three-level nested task lists through round-trip conversion', () => {
252
- // const original = `- [ ] Level 1
253
- // - [ ] Level 2
254
- // - [x] Level 3`;
255
- // const html = markdownToHtml(original);
256
- // const result = htmlToMarkdown(html);
257
- // expect(result).toContain('- [ ] Level 1');
258
- // expect(result).toContain(' - [ ] Level 2');
259
- // expect(result).toContain(' - [x] Level 3');
260
- // });
261
- // it('should preserve complex nested task list structure', () => {
262
- // const original = `- [ ] Task 1
263
- // - [ ] Task 1.1
264
- // - [x] Task 1.2
265
- // - [ ] Task 1.2.1
266
- // - [ ] Task 1.2.2
267
- // - [ ] Task 2
268
- // - [ ] Task 2.1`;
269
- // const html = markdownToHtml(original);
270
- // const result = htmlToMarkdown(html);
271
- // // Check all items are present
272
- // expect(result).toContain('- [ ] Task 1');
273
- // expect(result).toContain(' - [ ] Task 1.1');
274
- // expect(result).toContain(' - [x] Task 1.2');
275
- // expect(result).toContain(' - [ ] Task 1.2.1');
276
- // expect(result).toContain(' - [ ] Task 1.2.2');
277
- // expect(result).toContain('- [ ] Task 2');
278
- // expect(result).toContain(' - [ ] Task 2.1');
279
- // });
280
- // it('should handle task list with description formatting', () => {
281
- // const original = `- [ ] Add button to trigger task refinement
282
- // - [ ] **Description**: Clear explanation
283
- // - [ ] *Acceptance Criteria*: Tests pass
284
- // - [ ] \`Technical Details\`: Use React`;
285
- // const html = markdownToHtml(original);
286
- // const result = htmlToMarkdown(html);
287
- // expect(result).toContain('- [ ] Add button to trigger task refinement');
288
- // // Markdown inside task items may not be preserved through round-trip
289
- // // This is a known limitation of the current implementation
290
- // expect(result).toContain('Description');
291
- // expect(result).toContain('Acceptance Criteria');
292
- // expect(result).toContain('Technical Details');
293
- // });
294
- // });
295
- describe('Edge cases', () => {
296
- it('should handle malformed task list syntax gracefully', () => {
297
- const markdown = '- [] Invalid task\n-[x] Another invalid\n- [ ] Valid task';
298
- const html = markdownToHtml(markdown);
299
- // Should still parse what it can
300
- expect(html).toContain('Valid task');
301
- });
302
- // it('should handle empty task descriptions', () => {
303
- // const markdown = '- [ ] \n- [x] ';
304
- // const html = markdownToHtml(markdown);
305
- // expect(html).toContain('data-type="taskItem"');
306
- // });
307
- // it('should handle very deeply nested lists (10 levels)', () => {
308
- // let markdown = '- [ ] L1';
309
- // for (let i = 2; i <= 10; i++) {
310
- // markdown += '\n' + ' '.repeat(i - 1) + `- [ ] L${i}`;
311
- // }
312
- // const html = markdownToHtml(markdown);
313
- // const result = htmlToMarkdown(html);
314
- // expect(result).toContain('- [ ] L1');
315
- // expect(result).toContain(' '.repeat(9) + '- [ ] L10');
316
- // });
317
- it('should handle mixed content in list items', () => {
318
- const html = `<ul>
319
- <li data-type="taskItem"><input type="checkbox" disabled> Task with <strong>bold</strong> and <a href="#">link</a></li>
320
- </ul>`;
321
- const markdown = htmlToMarkdown(html);
322
- expect(markdown).toContain('- [ ] Task with **bold** and [link](#)');
323
- });
324
- it('should strip extra whitespace properly', () => {
325
- const html = `<ul>
326
- <li data-type="taskItem"> <input type="checkbox" disabled> Task with spaces </li>
327
- </ul>`;
328
- const markdown = htmlToMarkdown(html);
329
- expect(markdown.trim()).toBe('- [ ] Task with spaces');
330
- });
331
- it('should handle nested task lists properly', () => {
332
- const nestedMarkdown = `- [ ] Parent task with nested items:
333
- - [ ] Child task 1
334
- - [x] Child task 2`;
335
- const html = markdownToHtml(nestedMarkdown);
336
- // Check that HTML contains proper nesting structure
337
- expect(html).toContain('data-type="taskList"');
338
- expect(html).toContain('data-type="taskItem"');
339
- expect(html).toContain('data-checked="false"');
340
- expect(html).toContain('data-checked="true"');
341
- expect(html).toContain('Parent task with nested items:');
342
- expect(html).toContain('Child task 1');
343
- expect(html).toContain('Child task 2');
344
- // Verify the nested structure is present in HTML
345
- expect(html).toMatch(/<li[^>]*data-type="taskItem"[^>]*>.*<ul>.*<li[^>]*data-type="taskItem"/s);
346
- });
347
- });
348
- });
@@ -1,27 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { clampSelectionPos } from './tiptap-utils.js';
3
- describe('clampSelectionPos', () => {
4
- it('keeps positions within valid range', () => {
5
- const res = clampSelectionPos(5, 8, 20);
6
- expect(res).toEqual({ from: 5, to: 8 });
7
- });
8
- it('clamps underflow to 1', () => {
9
- const res = clampSelectionPos(-10, 0, 20);
10
- expect(res).toEqual({ from: 1, to: 1 });
11
- });
12
- it('clamps overflow to doc.nodeSize - 2', () => {
13
- const res = clampSelectionPos(100, 200, 20);
14
- // maxPos = 18 for nodeSize 20
15
- expect(res).toEqual({ from: 18, to: 18 });
16
- });
17
- it('orders from/to when anchor > head', () => {
18
- const res = clampSelectionPos(10, 5, 20);
19
- expect(res).toEqual({ from: 5, to: 10 });
20
- });
21
- it('handles tiny documents safely', () => {
22
- const res0 = clampSelectionPos(5, 6, 0);
23
- expect(res0).toEqual({ from: 1, to: 1 });
24
- const res1 = clampSelectionPos(2, 3, 1);
25
- expect(res1).toEqual({ from: 1, to: 1 });
26
- });
27
- });
@@ -1,130 +0,0 @@
1
- import type { Node as TiptapNode } from '@tiptap/pm/model';
2
- import type { Editor } from '@tiptap/react';
3
- export declare const MAX_FILE_SIZE: number;
4
- export declare const MAC_SYMBOLS: Record<string, string>;
5
- export declare function cn(...classes: (string | boolean | undefined | null)[]): string;
6
- /**
7
- * Determines if the current platform is macOS
8
- * @returns boolean indicating if the current platform is Mac
9
- */
10
- export declare function isMac(): boolean;
11
- /**
12
- * Formats a shortcut key based on the platform (Mac or non-Mac)
13
- * @param key - The key to format (e.g., "ctrl", "alt", "shift")
14
- * @param isMac - Boolean indicating if the platform is Mac
15
- * @param capitalize - Whether to capitalize the key (default: true)
16
- * @returns Formatted shortcut key symbol
17
- */
18
- export declare const formatShortcutKey: (key: string, isMac: boolean, capitalize?: boolean) => string;
19
- /**
20
- * Parses a shortcut key string into an array of formatted key symbols
21
- * @param shortcutKeys - The string of shortcut keys (e.g., "ctrl-alt-shift")
22
- * @param delimiter - The delimiter used to split the keys (default: "-")
23
- * @param capitalize - Whether to capitalize the keys (default: true)
24
- * @returns Array of formatted shortcut key symbols
25
- */
26
- export declare const parseShortcutKeys: (props: {
27
- shortcutKeys: string | undefined;
28
- delimiter?: string;
29
- capitalize?: boolean;
30
- }) => string[];
31
- /**
32
- * Checks if a mark exists in the editor schema
33
- * @param markName - The name of the mark to check
34
- * @param editor - The editor instance
35
- * @returns boolean indicating if the mark exists in the schema
36
- */
37
- export declare const isMarkInSchema: (markName: string, editor: Editor | null) => boolean;
38
- /**
39
- * Checks if a node exists in the editor schema
40
- * @param nodeName - The name of the node to check
41
- * @param editor - The editor instance
42
- * @returns boolean indicating if the node exists in the schema
43
- */
44
- export declare const isNodeInSchema: (nodeName: string, editor: Editor | null) => boolean;
45
- /**
46
- * Moves the focus to the next node in the editor
47
- * @param editor - The editor instance
48
- * @returns boolean indicating if the focus was moved
49
- */
50
- export declare function focusNextNode(editor: Editor): boolean;
51
- /**
52
- * Checks if a value is a valid number (not null, undefined, or NaN)
53
- * @param value - The value to check
54
- * @returns boolean indicating if the value is a valid number
55
- */
56
- export declare function isValidPosition(pos: number | null | undefined): pos is number;
57
- /**
58
- * Checks if one or more extensions are registered in the Tiptap editor.
59
- * @param editor - The Tiptap editor instance
60
- * @param extensionNames - A single extension name or an array of names to check
61
- * @returns True if at least one of the extensions is available, false otherwise
62
- */
63
- export declare function isExtensionAvailable(editor: Editor | null, extensionNames: string | string[]): boolean;
64
- /**
65
- * Finds a node at the specified position with error handling
66
- * @param editor The Tiptap editor instance
67
- * @param position The position in the document to find the node
68
- * @returns The node at the specified position, or null if not found
69
- */
70
- export declare function findNodeAtPosition(editor: Editor, position: number): TiptapNode | null;
71
- /**
72
- * Finds the position and instance of a node in the document
73
- * @param props Object containing editor, node (optional), and nodePos (optional)
74
- * @param props.editor The Tiptap editor instance
75
- * @param props.node The node to find (optional if nodePos is provided)
76
- * @param props.nodePos The position of the node to find (optional if node is provided)
77
- * @returns An object with the position and node, or null if not found
78
- */
79
- export declare function findNodePosition(props: {
80
- editor: Editor | null;
81
- node?: TiptapNode | null;
82
- nodePos?: number | null;
83
- }): {
84
- pos: number;
85
- node: TiptapNode;
86
- } | null;
87
- /**
88
- * Checks if the current selection in the editor is a node selection of specified types
89
- * @param editor The Tiptap editor instance
90
- * @param types An array of node type names to check against
91
- * @returns boolean indicating if the selected node matches any of the specified types
92
- */
93
- export declare function isNodeTypeSelected(editor: Editor | null, types?: string[]): boolean;
94
- /**
95
- * Handles image upload with progress tracking and abort capability
96
- * @param file The file to upload
97
- * @param onProgress Optional callback for tracking upload progress
98
- * @param abortSignal Optional AbortSignal for cancelling the upload
99
- * @returns Promise resolving to the URL of the uploaded image
100
- */
101
- export declare const handleImageUpload: (file: File, onProgress?: (_event: {
102
- progress: number;
103
- }) => void, abortSignal?: AbortSignal) => Promise<string>;
104
- type ProtocolOptions = {
105
- /**
106
- * The protocol scheme to be registered.
107
- * @default '''
108
- * @example 'ftp'
109
- * @example 'git'
110
- */
111
- scheme: string;
112
- /**
113
- * If enabled, it allows optional slashes after the protocol.
114
- * @default false
115
- * @example true
116
- */
117
- optionalSlashes?: boolean;
118
- };
119
- type ProtocolConfig = Array<ProtocolOptions | string>;
120
- export declare function isAllowedUri(uri: string | undefined, protocols?: ProtocolConfig): true | RegExpMatchArray | null;
121
- export declare function sanitizeUrl(inputUrl: string, baseUrl: string, protocols?: ProtocolConfig): string;
122
- /**
123
- * Clamps selection anchor/head to valid [1, doc.nodeSize-2] range.
124
- * Returns an object compatible with TipTap's setTextSelection input.
125
- */
126
- export declare function clampSelectionPos(anchor: number, head: number, docNodeSize: number): {
127
- from: number;
128
- to: number;
129
- };
130
- export {};