@pep/term-deck 1.0.13 → 1.0.15

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 (36) hide show
  1. package/dist/bin/term-deck.d.ts +1 -0
  2. package/dist/bin/term-deck.js +1720 -0
  3. package/dist/bin/term-deck.js.map +1 -0
  4. package/dist/index.d.ts +670 -0
  5. package/dist/index.js +159 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +16 -13
  8. package/bin/term-deck.ts +0 -45
  9. package/src/cli/__tests__/errors.test.ts +0 -201
  10. package/src/cli/__tests__/help.test.ts +0 -157
  11. package/src/cli/__tests__/init.test.ts +0 -110
  12. package/src/cli/commands/export.ts +0 -33
  13. package/src/cli/commands/init.ts +0 -125
  14. package/src/cli/commands/present.ts +0 -29
  15. package/src/cli/errors.ts +0 -77
  16. package/src/core/__tests__/slide.test.ts +0 -1759
  17. package/src/core/__tests__/theme.test.ts +0 -1103
  18. package/src/core/slide.ts +0 -509
  19. package/src/core/theme.ts +0 -388
  20. package/src/export/__tests__/recorder.test.ts +0 -566
  21. package/src/export/recorder.ts +0 -639
  22. package/src/index.ts +0 -36
  23. package/src/presenter/__tests__/main.test.ts +0 -244
  24. package/src/presenter/main.ts +0 -658
  25. package/src/renderer/__tests__/screen-extended.test.ts +0 -801
  26. package/src/renderer/__tests__/screen.test.ts +0 -525
  27. package/src/renderer/screen.ts +0 -671
  28. package/src/schemas/__tests__/config.test.ts +0 -429
  29. package/src/schemas/__tests__/slide.test.ts +0 -349
  30. package/src/schemas/__tests__/theme.test.ts +0 -970
  31. package/src/schemas/__tests__/validation.test.ts +0 -256
  32. package/src/schemas/config.ts +0 -58
  33. package/src/schemas/slide.ts +0 -56
  34. package/src/schemas/theme.ts +0 -203
  35. package/src/schemas/validation.ts +0 -64
  36. package/src/themes/matrix/index.ts +0 -53
@@ -1,244 +0,0 @@
1
- import { describe, it, expect, mock, spyOn } from 'bun:test';
2
- import { jumpToSlide, nextSlide, prevSlide } from '../main';
3
- import type { Presenter } from '../main';
4
- import { createRenderer, destroyRenderer } from '../../renderer/screen';
5
- import { DEFAULT_THEME } from '../../schemas/theme';
6
- import type { Deck } from '../../core/slide';
7
- import type { Slide } from '../../schemas/slide';
8
-
9
- /**
10
- * Create a test presenter with a real renderer but mocked navigation
11
- */
12
- function createTestPresenter(slideCount: number): Presenter {
13
- const slides: Slide[] = Array.from({ length: slideCount }, (_, i) => ({
14
- frontmatter: { title: `Slide ${i}` },
15
- body: `Content for slide ${i}`,
16
- notes: '',
17
- sourcePath: `/slides/${i}.md`,
18
- index: i,
19
- }));
20
-
21
- const deck: Deck = {
22
- slides,
23
- config: {
24
- title: 'Test Deck',
25
- author: 'Test Author',
26
- theme: DEFAULT_THEME,
27
- settings: {
28
- startSlide: 0,
29
- loop: false,
30
- autoAdvance: 0,
31
- showSlideNumbers: true,
32
- showProgress: true,
33
- },
34
- },
35
- basePath: '/slides',
36
- };
37
-
38
- const renderer = createRenderer(DEFAULT_THEME);
39
-
40
- return {
41
- deck,
42
- renderer,
43
- currentSlide: 0,
44
- isAnimating: false,
45
- notesWindow: null,
46
- autoAdvanceTimer: null,
47
- progressBar: null,
48
- };
49
- }
50
-
51
- describe('Presenter Navigation', () => {
52
- describe('jumpToSlide', () => {
53
- it('checks bounds - accepts valid index', async () => {
54
- const presenter = createTestPresenter(10);
55
- presenter.currentSlide = 0;
56
-
57
- await jumpToSlide(presenter, 5);
58
-
59
- expect(presenter.currentSlide).toBe(5);
60
- destroyRenderer(presenter.renderer);
61
- });
62
-
63
- it('checks bounds - ignores negative index', async () => {
64
- const presenter = createTestPresenter(10);
65
- presenter.currentSlide = 5;
66
-
67
- await jumpToSlide(presenter, -1);
68
-
69
- // Should remain at current slide
70
- expect(presenter.currentSlide).toBe(5);
71
- destroyRenderer(presenter.renderer);
72
- });
73
-
74
- it('checks bounds - ignores index beyond deck length', async () => {
75
- const presenter = createTestPresenter(10);
76
- presenter.currentSlide = 5;
77
-
78
- await jumpToSlide(presenter, 10);
79
-
80
- // Should remain at current slide
81
- expect(presenter.currentSlide).toBe(5);
82
- destroyRenderer(presenter.renderer);
83
- });
84
-
85
- it('checks bounds - ignores index far beyond deck length', async () => {
86
- const presenter = createTestPresenter(10);
87
- presenter.currentSlide = 5;
88
-
89
- await jumpToSlide(presenter, 100);
90
-
91
- // Should remain at current slide
92
- expect(presenter.currentSlide).toBe(5);
93
- destroyRenderer(presenter.renderer);
94
- });
95
-
96
- it('updates currentSlide when jumping', async () => {
97
- const presenter = createTestPresenter(10);
98
- presenter.currentSlide = 0;
99
-
100
- await jumpToSlide(presenter, 7);
101
-
102
- expect(presenter.currentSlide).toBe(7);
103
- destroyRenderer(presenter.renderer);
104
- });
105
-
106
- it('handles jump to first slide', async () => {
107
- const presenter = createTestPresenter(10);
108
- presenter.currentSlide = 5;
109
-
110
- await jumpToSlide(presenter, 0);
111
-
112
- expect(presenter.currentSlide).toBe(0);
113
- destroyRenderer(presenter.renderer);
114
- });
115
-
116
- it('handles jump to last slide', async () => {
117
- const presenter = createTestPresenter(10);
118
- presenter.currentSlide = 0;
119
-
120
- await jumpToSlide(presenter, 9);
121
-
122
- expect(presenter.currentSlide).toBe(9);
123
- destroyRenderer(presenter.renderer);
124
- });
125
-
126
- it('handles jump to same slide', async () => {
127
- const presenter = createTestPresenter(10);
128
- presenter.currentSlide = 5;
129
-
130
- await jumpToSlide(presenter, 5);
131
-
132
- expect(presenter.currentSlide).toBe(5);
133
- destroyRenderer(presenter.renderer);
134
- });
135
-
136
- it('handles single-slide deck', async () => {
137
- const presenter = createTestPresenter(1);
138
-
139
- await jumpToSlide(presenter, 0);
140
-
141
- expect(presenter.currentSlide).toBe(0);
142
- destroyRenderer(presenter.renderer);
143
- });
144
-
145
- it('rejects invalid index in single-slide deck', async () => {
146
- const presenter = createTestPresenter(1);
147
-
148
- await jumpToSlide(presenter, 1);
149
-
150
- expect(presenter.currentSlide).toBe(0);
151
- destroyRenderer(presenter.renderer);
152
- });
153
-
154
- it('preserves window stack by re-rendering from start', async () => {
155
- const presenter = createTestPresenter(5);
156
- presenter.currentSlide = 0;
157
-
158
- await jumpToSlide(presenter, 3);
159
-
160
- // Should have created windows for slides 0-3 (4 windows total)
161
- expect(presenter.renderer.windowStack.length).toBe(4);
162
- destroyRenderer(presenter.renderer);
163
- });
164
- });
165
-
166
- describe('nextSlide', () => {
167
- it('advances to next slide', async () => {
168
- const presenter = createTestPresenter(5);
169
- presenter.currentSlide = 0;
170
-
171
- await nextSlide(presenter);
172
-
173
- expect(presenter.currentSlide).toBe(1);
174
- destroyRenderer(presenter.renderer);
175
- });
176
-
177
- it('does not advance past last slide when loop is disabled', async () => {
178
- const presenter = createTestPresenter(3);
179
- presenter.currentSlide = 2;
180
-
181
- await nextSlide(presenter);
182
-
183
- // Should stay at slide 2
184
- expect(presenter.currentSlide).toBe(2);
185
- destroyRenderer(presenter.renderer);
186
- });
187
-
188
- it('loops to first slide when loop is enabled', async () => {
189
- const presenter = createTestPresenter(3);
190
- presenter.deck.config.settings = { loop: true } as any;
191
- presenter.currentSlide = 2;
192
-
193
- await nextSlide(presenter);
194
-
195
- expect(presenter.currentSlide).toBe(0);
196
- destroyRenderer(presenter.renderer);
197
- });
198
- });
199
-
200
- describe('prevSlide', () => {
201
- it('goes to previous slide', async () => {
202
- const presenter = createTestPresenter(5);
203
- presenter.currentSlide = 2;
204
-
205
- await prevSlide(presenter);
206
-
207
- expect(presenter.currentSlide).toBe(1);
208
- destroyRenderer(presenter.renderer);
209
- });
210
-
211
- it('does not go before first slide when loop is disabled', async () => {
212
- const presenter = createTestPresenter(3);
213
- presenter.currentSlide = 0;
214
-
215
- await prevSlide(presenter);
216
-
217
- // Should stay at slide 0
218
- expect(presenter.currentSlide).toBe(0);
219
- destroyRenderer(presenter.renderer);
220
- });
221
-
222
- it('loops to last slide when loop is enabled', async () => {
223
- const presenter = createTestPresenter(3);
224
- presenter.deck.config.settings = { loop: true } as any;
225
- presenter.currentSlide = 0;
226
-
227
- await prevSlide(presenter);
228
-
229
- expect(presenter.currentSlide).toBe(2);
230
- destroyRenderer(presenter.renderer);
231
- });
232
-
233
- it('re-renders from start to preserve stacking', async () => {
234
- const presenter = createTestPresenter(5);
235
- presenter.currentSlide = 3;
236
-
237
- await prevSlide(presenter);
238
-
239
- // Should have windows for slides 0, 1, 2 (3 windows)
240
- expect(presenter.renderer.windowStack.length).toBe(3);
241
- destroyRenderer(presenter.renderer);
242
- });
243
- });
244
- });