@pep/term-deck 1.0.14 → 1.0.16

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 (37) hide show
  1. package/dist/bin/term-deck.d.ts +1 -0
  2. package/dist/bin/term-deck.js +1916 -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.js +0 -14
  9. package/bin/term-deck.ts +0 -45
  10. package/src/cli/__tests__/errors.test.ts +0 -201
  11. package/src/cli/__tests__/help.test.ts +0 -157
  12. package/src/cli/__tests__/init.test.ts +0 -110
  13. package/src/cli/commands/export.ts +0 -33
  14. package/src/cli/commands/init.ts +0 -125
  15. package/src/cli/commands/present.ts +0 -29
  16. package/src/cli/errors.ts +0 -77
  17. package/src/core/__tests__/slide.test.ts +0 -1759
  18. package/src/core/__tests__/theme.test.ts +0 -1103
  19. package/src/core/slide.ts +0 -509
  20. package/src/core/theme.ts +0 -388
  21. package/src/export/__tests__/recorder.test.ts +0 -566
  22. package/src/export/recorder.ts +0 -639
  23. package/src/index.ts +0 -36
  24. package/src/presenter/__tests__/main.test.ts +0 -244
  25. package/src/presenter/main.ts +0 -658
  26. package/src/renderer/__tests__/screen-extended.test.ts +0 -801
  27. package/src/renderer/__tests__/screen.test.ts +0 -525
  28. package/src/renderer/screen.ts +0 -671
  29. package/src/schemas/__tests__/config.test.ts +0 -429
  30. package/src/schemas/__tests__/slide.test.ts +0 -349
  31. package/src/schemas/__tests__/theme.test.ts +0 -970
  32. package/src/schemas/__tests__/validation.test.ts +0 -256
  33. package/src/schemas/config.ts +0 -58
  34. package/src/schemas/slide.ts +0 -56
  35. package/src/schemas/theme.ts +0 -203
  36. package/src/schemas/validation.ts +0 -64
  37. package/src/themes/matrix/index.ts +0 -53
@@ -1,349 +0,0 @@
1
- import { describe, it, expect } from 'bun:test'
2
- import { SlideFrontmatterSchema, SlideSchema } from '../slide'
3
-
4
- describe('SlideFrontmatterSchema', () => {
5
- describe('title field', () => {
6
- it('accepts valid title', () => {
7
- const frontmatter = { title: 'My Slide' }
8
- const result = SlideFrontmatterSchema.parse(frontmatter)
9
- expect(result.title).toBe('My Slide')
10
- })
11
-
12
- it('rejects missing title', () => {
13
- const frontmatter = {}
14
- expect(() => SlideFrontmatterSchema.parse(frontmatter)).toThrow()
15
- })
16
-
17
- it('rejects empty title', () => {
18
- const frontmatter = { title: '' }
19
- expect(() => SlideFrontmatterSchema.parse(frontmatter)).toThrow('Slide must have a title')
20
- })
21
- })
22
-
23
- describe('bigText field', () => {
24
- it('accepts string bigText', () => {
25
- const frontmatter = { title: 'Test', bigText: 'HELLO' }
26
- const result = SlideFrontmatterSchema.parse(frontmatter)
27
- expect(result.bigText).toBe('HELLO')
28
- })
29
-
30
- it('accepts array bigText', () => {
31
- const frontmatter = { title: 'Test', bigText: ['HELLO', 'WORLD'] }
32
- const result = SlideFrontmatterSchema.parse(frontmatter)
33
- expect(result.bigText).toEqual(['HELLO', 'WORLD'])
34
- })
35
-
36
- it('accepts undefined bigText', () => {
37
- const frontmatter = { title: 'Test' }
38
- const result = SlideFrontmatterSchema.parse(frontmatter)
39
- expect(result.bigText).toBeUndefined()
40
- })
41
-
42
- it('accepts empty array bigText', () => {
43
- const frontmatter = { title: 'Test', bigText: [] }
44
- const result = SlideFrontmatterSchema.parse(frontmatter)
45
- expect(result.bigText).toEqual([])
46
- })
47
- })
48
-
49
- describe('gradient field', () => {
50
- it('accepts string gradient', () => {
51
- const frontmatter = { title: 'Test', gradient: 'fire' }
52
- const result = SlideFrontmatterSchema.parse(frontmatter)
53
- expect(result.gradient).toBe('fire')
54
- })
55
-
56
- it('accepts undefined gradient', () => {
57
- const frontmatter = { title: 'Test' }
58
- const result = SlideFrontmatterSchema.parse(frontmatter)
59
- expect(result.gradient).toBeUndefined()
60
- })
61
- })
62
-
63
- describe('theme field', () => {
64
- it('accepts string theme', () => {
65
- const frontmatter = { title: 'Test', theme: 'dark' }
66
- const result = SlideFrontmatterSchema.parse(frontmatter)
67
- expect(result.theme).toBe('dark')
68
- })
69
-
70
- it('accepts undefined theme', () => {
71
- const frontmatter = { title: 'Test' }
72
- const result = SlideFrontmatterSchema.parse(frontmatter)
73
- expect(result.theme).toBeUndefined()
74
- })
75
- })
76
-
77
- describe('transition field', () => {
78
- it('defaults to glitch', () => {
79
- const frontmatter = { title: 'Test' }
80
- const result = SlideFrontmatterSchema.parse(frontmatter)
81
- expect(result.transition).toBe('glitch')
82
- })
83
-
84
- it('accepts glitch transition', () => {
85
- const frontmatter = { title: 'Test', transition: 'glitch' }
86
- const result = SlideFrontmatterSchema.parse(frontmatter)
87
- expect(result.transition).toBe('glitch')
88
- })
89
-
90
- it('accepts fade transition', () => {
91
- const frontmatter = { title: 'Test', transition: 'fade' }
92
- const result = SlideFrontmatterSchema.parse(frontmatter)
93
- expect(result.transition).toBe('fade')
94
- })
95
-
96
- it('accepts instant transition', () => {
97
- const frontmatter = { title: 'Test', transition: 'instant' }
98
- const result = SlideFrontmatterSchema.parse(frontmatter)
99
- expect(result.transition).toBe('instant')
100
- })
101
-
102
- it('accepts typewriter transition', () => {
103
- const frontmatter = { title: 'Test', transition: 'typewriter' }
104
- const result = SlideFrontmatterSchema.parse(frontmatter)
105
- expect(result.transition).toBe('typewriter')
106
- })
107
-
108
- it('rejects invalid transition', () => {
109
- const frontmatter = { title: 'Test', transition: 'slide' }
110
- expect(() => SlideFrontmatterSchema.parse(frontmatter)).toThrow()
111
- })
112
- })
113
-
114
- describe('meta field', () => {
115
- it('accepts object meta', () => {
116
- const frontmatter = { title: 'Test', meta: { author: 'John', version: 1 } }
117
- const result = SlideFrontmatterSchema.parse(frontmatter)
118
- expect(result.meta).toEqual({ author: 'John', version: 1 })
119
- })
120
-
121
- it('accepts undefined meta', () => {
122
- const frontmatter = { title: 'Test' }
123
- const result = SlideFrontmatterSchema.parse(frontmatter)
124
- expect(result.meta).toBeUndefined()
125
- })
126
-
127
- it('accepts empty meta object', () => {
128
- const frontmatter = { title: 'Test', meta: {} }
129
- const result = SlideFrontmatterSchema.parse(frontmatter)
130
- expect(result.meta).toEqual({})
131
- })
132
-
133
- it('accepts nested meta values', () => {
134
- const frontmatter = { title: 'Test', meta: { nested: { deep: true } } }
135
- const result = SlideFrontmatterSchema.parse(frontmatter)
136
- expect(result.meta).toEqual({ nested: { deep: true } })
137
- })
138
- })
139
-
140
- describe('full frontmatter', () => {
141
- it('accepts minimal frontmatter (title only)', () => {
142
- const frontmatter = { title: 'My Slide' }
143
- expect(() => SlideFrontmatterSchema.parse(frontmatter)).not.toThrow()
144
- })
145
-
146
- it('accepts full frontmatter with all fields', () => {
147
- const frontmatter = {
148
- title: 'My Slide',
149
- bigText: ['HELLO', 'WORLD'],
150
- gradient: 'fire',
151
- theme: 'dark',
152
- transition: 'glitch',
153
- meta: { author: 'John' }
154
- }
155
- const result = SlideFrontmatterSchema.parse(frontmatter)
156
- expect(result.title).toBe('My Slide')
157
- expect(result.bigText).toEqual(['HELLO', 'WORLD'])
158
- expect(result.gradient).toBe('fire')
159
- expect(result.theme).toBe('dark')
160
- expect(result.transition).toBe('glitch')
161
- expect(result.meta).toEqual({ author: 'John' })
162
- })
163
- })
164
- })
165
-
166
- describe('SlideSchema', () => {
167
- describe('valid slides', () => {
168
- it('accepts minimal slide with required fields', () => {
169
- const slide = {
170
- frontmatter: { title: 'Test Slide' },
171
- body: '# Hello World\n\nThis is content.',
172
- sourcePath: '/slides/01-intro.md',
173
- index: 0
174
- }
175
- const result = SlideSchema.parse(slide)
176
- expect(result.frontmatter.title).toBe('Test Slide')
177
- expect(result.body).toBe('# Hello World\n\nThis is content.')
178
- expect(result.sourcePath).toBe('/slides/01-intro.md')
179
- expect(result.index).toBe(0)
180
- expect(result.notes).toBeUndefined()
181
- })
182
-
183
- it('accepts slide with notes', () => {
184
- const slide = {
185
- frontmatter: { title: 'Test Slide' },
186
- body: '# Content',
187
- notes: 'Remember to explain this slowly.',
188
- sourcePath: '/slides/02-content.md',
189
- index: 1
190
- }
191
- const result = SlideSchema.parse(slide)
192
- expect(result.notes).toBe('Remember to explain this slowly.')
193
- })
194
-
195
- it('accepts slide with empty body', () => {
196
- const slide = {
197
- frontmatter: { title: 'Empty Slide' },
198
- body: '',
199
- sourcePath: '/slides/03-empty.md',
200
- index: 2
201
- }
202
- const result = SlideSchema.parse(slide)
203
- expect(result.body).toBe('')
204
- })
205
-
206
- it('accepts slide with full frontmatter', () => {
207
- const slide = {
208
- frontmatter: {
209
- title: 'Full Slide',
210
- bigText: ['BIG', 'TEXT'],
211
- gradient: 'fire',
212
- theme: 'dark',
213
- transition: 'fade',
214
- meta: { custom: 'data' }
215
- },
216
- body: '# Full Content',
217
- notes: 'All options used.',
218
- sourcePath: '/slides/04-full.md',
219
- index: 3
220
- }
221
- const result = SlideSchema.parse(slide)
222
- expect(result.frontmatter.title).toBe('Full Slide')
223
- expect(result.frontmatter.bigText).toEqual(['BIG', 'TEXT'])
224
- expect(result.frontmatter.gradient).toBe('fire')
225
- expect(result.frontmatter.theme).toBe('dark')
226
- expect(result.frontmatter.transition).toBe('fade')
227
- expect(result.frontmatter.meta).toEqual({ custom: 'data' })
228
- })
229
- })
230
-
231
- describe('frontmatter validation', () => {
232
- it('rejects slide with missing frontmatter title', () => {
233
- const slide = {
234
- frontmatter: {},
235
- body: '# Content',
236
- sourcePath: '/slides/01-intro.md',
237
- index: 0
238
- }
239
- expect(() => SlideSchema.parse(slide)).toThrow()
240
- })
241
-
242
- it('rejects slide with empty frontmatter title', () => {
243
- const slide = {
244
- frontmatter: { title: '' },
245
- body: '# Content',
246
- sourcePath: '/slides/01-intro.md',
247
- index: 0
248
- }
249
- expect(() => SlideSchema.parse(slide)).toThrow('Slide must have a title')
250
- })
251
-
252
- it('rejects slide with invalid transition in frontmatter', () => {
253
- const slide = {
254
- frontmatter: { title: 'Test', transition: 'invalid' },
255
- body: '# Content',
256
- sourcePath: '/slides/01-intro.md',
257
- index: 0
258
- }
259
- expect(() => SlideSchema.parse(slide)).toThrow()
260
- })
261
- })
262
-
263
- describe('required fields', () => {
264
- it('rejects slide without frontmatter', () => {
265
- const slide = {
266
- body: '# Content',
267
- sourcePath: '/slides/01-intro.md',
268
- index: 0
269
- }
270
- expect(() => SlideSchema.parse(slide)).toThrow()
271
- })
272
-
273
- it('rejects slide without body', () => {
274
- const slide = {
275
- frontmatter: { title: 'Test' },
276
- sourcePath: '/slides/01-intro.md',
277
- index: 0
278
- }
279
- expect(() => SlideSchema.parse(slide)).toThrow()
280
- })
281
-
282
- it('rejects slide without sourcePath', () => {
283
- const slide = {
284
- frontmatter: { title: 'Test' },
285
- body: '# Content',
286
- index: 0
287
- }
288
- expect(() => SlideSchema.parse(slide)).toThrow()
289
- })
290
-
291
- it('rejects slide without index', () => {
292
- const slide = {
293
- frontmatter: { title: 'Test' },
294
- body: '# Content',
295
- sourcePath: '/slides/01-intro.md'
296
- }
297
- expect(() => SlideSchema.parse(slide)).toThrow()
298
- })
299
- })
300
-
301
- describe('index field', () => {
302
- it('accepts index 0', () => {
303
- const slide = {
304
- frontmatter: { title: 'Test' },
305
- body: '# Content',
306
- sourcePath: '/slides/01-intro.md',
307
- index: 0
308
- }
309
- const result = SlideSchema.parse(slide)
310
- expect(result.index).toBe(0)
311
- })
312
-
313
- it('accepts positive index', () => {
314
- const slide = {
315
- frontmatter: { title: 'Test' },
316
- body: '# Content',
317
- sourcePath: '/slides/01-intro.md',
318
- index: 42
319
- }
320
- const result = SlideSchema.parse(slide)
321
- expect(result.index).toBe(42)
322
- })
323
-
324
- it('accepts negative index (not constrained)', () => {
325
- const slide = {
326
- frontmatter: { title: 'Test' },
327
- body: '# Content',
328
- sourcePath: '/slides/01-intro.md',
329
- index: -1
330
- }
331
- // Note: Schema doesn't constrain to non-negative, that's business logic
332
- const result = SlideSchema.parse(slide)
333
- expect(result.index).toBe(-1)
334
- })
335
- })
336
-
337
- describe('nested schema defaults', () => {
338
- it('applies default transition from frontmatter schema', () => {
339
- const slide = {
340
- frontmatter: { title: 'Test' },
341
- body: '# Content',
342
- sourcePath: '/slides/01-intro.md',
343
- index: 0
344
- }
345
- const result = SlideSchema.parse(slide)
346
- expect(result.frontmatter.transition).toBe('glitch')
347
- })
348
- })
349
- })