@cuppacue/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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/dist/ai/__tests__/generate.test.d.ts +2 -0
  4. package/dist/ai/__tests__/generate.test.d.ts.map +1 -0
  5. package/dist/ai/__tests__/generate.test.js +129 -0
  6. package/dist/ai/__tests__/generate.test.js.map +1 -0
  7. package/dist/ai/__tests__/images.test.d.ts +2 -0
  8. package/dist/ai/__tests__/images.test.d.ts.map +1 -0
  9. package/dist/ai/__tests__/images.test.js +186 -0
  10. package/dist/ai/__tests__/images.test.js.map +1 -0
  11. package/dist/ai/__tests__/prompt.test.d.ts +2 -0
  12. package/dist/ai/__tests__/prompt.test.d.ts.map +1 -0
  13. package/dist/ai/__tests__/prompt.test.js +98 -0
  14. package/dist/ai/__tests__/prompt.test.js.map +1 -0
  15. package/dist/ai/__tests__/refine.test.d.ts +2 -0
  16. package/dist/ai/__tests__/refine.test.d.ts.map +1 -0
  17. package/dist/ai/__tests__/refine.test.js +87 -0
  18. package/dist/ai/__tests__/refine.test.js.map +1 -0
  19. package/dist/ai/client.d.ts +4 -0
  20. package/dist/ai/client.d.ts.map +1 -0
  21. package/dist/ai/client.js +36 -0
  22. package/dist/ai/client.js.map +1 -0
  23. package/dist/ai/example.d.ts +6 -0
  24. package/dist/ai/example.d.ts.map +1 -0
  25. package/dist/ai/example.js +284 -0
  26. package/dist/ai/example.js.map +1 -0
  27. package/dist/ai/generate.d.ts +15 -0
  28. package/dist/ai/generate.d.ts.map +1 -0
  29. package/dist/ai/generate.js +120 -0
  30. package/dist/ai/generate.js.map +1 -0
  31. package/dist/ai/images.d.ts +8 -0
  32. package/dist/ai/images.d.ts.map +1 -0
  33. package/dist/ai/images.js +71 -0
  34. package/dist/ai/images.js.map +1 -0
  35. package/dist/ai/index.d.ts +7 -0
  36. package/dist/ai/index.d.ts.map +1 -0
  37. package/dist/ai/index.js +7 -0
  38. package/dist/ai/index.js.map +1 -0
  39. package/dist/ai/prompt.d.ts +10 -0
  40. package/dist/ai/prompt.d.ts.map +1 -0
  41. package/dist/ai/prompt.js +119 -0
  42. package/dist/ai/prompt.js.map +1 -0
  43. package/dist/ai/refine.d.ts +6 -0
  44. package/dist/ai/refine.d.ts.map +1 -0
  45. package/dist/ai/refine.js +22 -0
  46. package/dist/ai/refine.js.map +1 -0
  47. package/dist/ai/schema.d.ts +5 -0
  48. package/dist/ai/schema.d.ts.map +1 -0
  49. package/dist/ai/schema.js +292 -0
  50. package/dist/ai/schema.js.map +1 -0
  51. package/dist/commands/__tests__/backstage.test.d.ts +2 -0
  52. package/dist/commands/__tests__/backstage.test.d.ts.map +1 -0
  53. package/dist/commands/__tests__/backstage.test.js +45 -0
  54. package/dist/commands/__tests__/backstage.test.js.map +1 -0
  55. package/dist/commands/__tests__/export.test.d.ts +2 -0
  56. package/dist/commands/__tests__/export.test.d.ts.map +1 -0
  57. package/dist/commands/__tests__/export.test.js +50 -0
  58. package/dist/commands/__tests__/export.test.js.map +1 -0
  59. package/dist/commands/ai.d.ts +2 -0
  60. package/dist/commands/ai.d.ts.map +1 -0
  61. package/dist/commands/ai.js +113 -0
  62. package/dist/commands/ai.js.map +1 -0
  63. package/dist/commands/build.d.ts +2 -0
  64. package/dist/commands/build.d.ts.map +1 -0
  65. package/dist/commands/build.js +121 -0
  66. package/dist/commands/build.js.map +1 -0
  67. package/dist/commands/export-pdf.d.ts +9 -0
  68. package/dist/commands/export-pdf.d.ts.map +1 -0
  69. package/dist/commands/export-pdf.js +109 -0
  70. package/dist/commands/export-pdf.js.map +1 -0
  71. package/dist/commands/export.d.ts +2 -0
  72. package/dist/commands/export.d.ts.map +1 -0
  73. package/dist/commands/export.js +147 -0
  74. package/dist/commands/export.js.map +1 -0
  75. package/dist/commands/init.d.ts +2 -0
  76. package/dist/commands/init.d.ts.map +1 -0
  77. package/dist/commands/init.js +54 -0
  78. package/dist/commands/init.js.map +1 -0
  79. package/dist/commands/preview.d.ts +2 -0
  80. package/dist/commands/preview.d.ts.map +1 -0
  81. package/dist/commands/preview.js +78 -0
  82. package/dist/commands/preview.js.map +1 -0
  83. package/dist/commands/serve.d.ts +7 -0
  84. package/dist/commands/serve.d.ts.map +1 -0
  85. package/dist/commands/serve.js +773 -0
  86. package/dist/commands/serve.js.map +1 -0
  87. package/dist/commands/validate.d.ts +2 -0
  88. package/dist/commands/validate.d.ts.map +1 -0
  89. package/dist/commands/validate.js +39 -0
  90. package/dist/commands/validate.js.map +1 -0
  91. package/dist/github/__tests__/fetcher.test.d.ts +2 -0
  92. package/dist/github/__tests__/fetcher.test.d.ts.map +1 -0
  93. package/dist/github/__tests__/fetcher.test.js +102 -0
  94. package/dist/github/__tests__/fetcher.test.js.map +1 -0
  95. package/dist/github/__tests__/rewrite-images.test.d.ts +2 -0
  96. package/dist/github/__tests__/rewrite-images.test.d.ts.map +1 -0
  97. package/dist/github/__tests__/rewrite-images.test.js +79 -0
  98. package/dist/github/__tests__/rewrite-images.test.js.map +1 -0
  99. package/dist/github/__tests__/url-parser.test.d.ts +2 -0
  100. package/dist/github/__tests__/url-parser.test.d.ts.map +1 -0
  101. package/dist/github/__tests__/url-parser.test.js +96 -0
  102. package/dist/github/__tests__/url-parser.test.js.map +1 -0
  103. package/dist/github/fetcher.d.ts +10 -0
  104. package/dist/github/fetcher.d.ts.map +1 -0
  105. package/dist/github/fetcher.js +53 -0
  106. package/dist/github/fetcher.js.map +1 -0
  107. package/dist/github/index.d.ts +5 -0
  108. package/dist/github/index.d.ts.map +1 -0
  109. package/dist/github/index.js +4 -0
  110. package/dist/github/index.js.map +1 -0
  111. package/dist/github/rewrite-images.d.ts +7 -0
  112. package/dist/github/rewrite-images.d.ts.map +1 -0
  113. package/dist/github/rewrite-images.js +26 -0
  114. package/dist/github/rewrite-images.js.map +1 -0
  115. package/dist/github/url-parser.d.ts +12 -0
  116. package/dist/github/url-parser.d.ts.map +1 -0
  117. package/dist/github/url-parser.js +60 -0
  118. package/dist/github/url-parser.js.map +1 -0
  119. package/dist/index.d.ts +3 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +95 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/markdown/__tests__/auto-slide.test.d.ts +2 -0
  124. package/dist/markdown/__tests__/auto-slide.test.d.ts.map +1 -0
  125. package/dist/markdown/__tests__/auto-slide.test.js +325 -0
  126. package/dist/markdown/__tests__/auto-slide.test.js.map +1 -0
  127. package/dist/markdown/__tests__/compiler.test.d.ts +2 -0
  128. package/dist/markdown/__tests__/compiler.test.d.ts.map +1 -0
  129. package/dist/markdown/__tests__/compiler.test.js +142 -0
  130. package/dist/markdown/__tests__/compiler.test.js.map +1 -0
  131. package/dist/markdown/__tests__/custom-parsers.test.d.ts +2 -0
  132. package/dist/markdown/__tests__/custom-parsers.test.d.ts.map +1 -0
  133. package/dist/markdown/__tests__/custom-parsers.test.js +182 -0
  134. package/dist/markdown/__tests__/custom-parsers.test.js.map +1 -0
  135. package/dist/markdown/__tests__/frontmatter.test.d.ts +2 -0
  136. package/dist/markdown/__tests__/frontmatter.test.d.ts.map +1 -0
  137. package/dist/markdown/__tests__/frontmatter.test.js +162 -0
  138. package/dist/markdown/__tests__/frontmatter.test.js.map +1 -0
  139. package/dist/markdown/__tests__/layout.test.d.ts +2 -0
  140. package/dist/markdown/__tests__/layout.test.d.ts.map +1 -0
  141. package/dist/markdown/__tests__/layout.test.js +85 -0
  142. package/dist/markdown/__tests__/layout.test.js.map +1 -0
  143. package/dist/markdown/__tests__/parser.test.d.ts +2 -0
  144. package/dist/markdown/__tests__/parser.test.d.ts.map +1 -0
  145. package/dist/markdown/__tests__/parser.test.js +646 -0
  146. package/dist/markdown/__tests__/parser.test.js.map +1 -0
  147. package/dist/markdown/__tests__/timesheet-gen.test.d.ts +2 -0
  148. package/dist/markdown/__tests__/timesheet-gen.test.d.ts.map +1 -0
  149. package/dist/markdown/__tests__/timesheet-gen.test.js +90 -0
  150. package/dist/markdown/__tests__/timesheet-gen.test.js.map +1 -0
  151. package/dist/markdown/auto-slide.d.ts +16 -0
  152. package/dist/markdown/auto-slide.d.ts.map +1 -0
  153. package/dist/markdown/auto-slide.js +144 -0
  154. package/dist/markdown/auto-slide.js.map +1 -0
  155. package/dist/markdown/compiler.d.ts +12 -0
  156. package/dist/markdown/compiler.d.ts.map +1 -0
  157. package/dist/markdown/compiler.js +47 -0
  158. package/dist/markdown/compiler.js.map +1 -0
  159. package/dist/markdown/custom-parsers.d.ts +69 -0
  160. package/dist/markdown/custom-parsers.d.ts.map +1 -0
  161. package/dist/markdown/custom-parsers.js +227 -0
  162. package/dist/markdown/custom-parsers.js.map +1 -0
  163. package/dist/markdown/frontmatter.d.ts +33 -0
  164. package/dist/markdown/frontmatter.d.ts.map +1 -0
  165. package/dist/markdown/frontmatter.js +83 -0
  166. package/dist/markdown/frontmatter.js.map +1 -0
  167. package/dist/markdown/id.d.ts +4 -0
  168. package/dist/markdown/id.d.ts.map +1 -0
  169. package/dist/markdown/id.js +15 -0
  170. package/dist/markdown/id.js.map +1 -0
  171. package/dist/markdown/index.d.ts +8 -0
  172. package/dist/markdown/index.d.ts.map +1 -0
  173. package/dist/markdown/index.js +6 -0
  174. package/dist/markdown/index.js.map +1 -0
  175. package/dist/markdown/parser.d.ts +35 -0
  176. package/dist/markdown/parser.d.ts.map +1 -0
  177. package/dist/markdown/parser.js +605 -0
  178. package/dist/markdown/parser.js.map +1 -0
  179. package/dist/markdown/timesheet-gen.d.ts +6 -0
  180. package/dist/markdown/timesheet-gen.d.ts.map +1 -0
  181. package/dist/markdown/timesheet-gen.js +223 -0
  182. package/dist/markdown/timesheet-gen.js.map +1 -0
  183. package/dist/player/CuePlayer.d.ts +58 -0
  184. package/dist/player/CuePlayer.d.ts.map +1 -0
  185. package/dist/player/NavBar.d.ts +31 -0
  186. package/dist/player/NavBar.d.ts.map +1 -0
  187. package/dist/player/PresenterView.d.ts +25 -0
  188. package/dist/player/PresenterView.d.ts.map +1 -0
  189. package/dist/player/SlideOverview.d.ts +16 -0
  190. package/dist/player/SlideOverview.d.ts.map +1 -0
  191. package/dist/player/__mocks__/chart.d.ts +29 -0
  192. package/dist/player/__mocks__/chart.d.ts.map +1 -0
  193. package/dist/player/__mocks__/mermaid.d.ts +8 -0
  194. package/dist/player/__mocks__/mermaid.d.ts.map +1 -0
  195. package/dist/player/__tests__/animator.test.d.ts +2 -0
  196. package/dist/player/__tests__/animator.test.d.ts.map +1 -0
  197. package/dist/player/__tests__/layout.test.d.ts +2 -0
  198. package/dist/player/__tests__/layout.test.d.ts.map +1 -0
  199. package/dist/player/__tests__/overview.test.d.ts +2 -0
  200. package/dist/player/__tests__/overview.test.d.ts.map +1 -0
  201. package/dist/player/__tests__/timeline.test.d.ts +2 -0
  202. package/dist/player/__tests__/timeline.test.d.ts.map +1 -0
  203. package/dist/player/animator.d.ts +4 -0
  204. package/dist/player/animator.d.ts.map +1 -0
  205. package/dist/player/cuppacue-player.css +1 -0
  206. package/dist/player/cuppacue-player.js +3247 -0
  207. package/dist/player/index.d.ts +14 -0
  208. package/dist/player/index.d.ts.map +1 -0
  209. package/dist/player/loader.d.ts +3 -0
  210. package/dist/player/loader.d.ts.map +1 -0
  211. package/dist/player/main.d.ts +2 -0
  212. package/dist/player/main.d.ts.map +1 -0
  213. package/dist/player/navigator.d.ts +27 -0
  214. package/dist/player/navigator.d.ts.map +1 -0
  215. package/dist/player/renderer.d.ts +9 -0
  216. package/dist/player/renderer.d.ts.map +1 -0
  217. package/dist/player/renderers/cards.d.ts +3 -0
  218. package/dist/player/renderers/cards.d.ts.map +1 -0
  219. package/dist/player/renderers/chart.d.ts +3 -0
  220. package/dist/player/renderers/chart.d.ts.map +1 -0
  221. package/dist/player/renderers/icons.d.ts +6 -0
  222. package/dist/player/renderers/icons.d.ts.map +1 -0
  223. package/dist/player/renderers/mermaid.d.ts +3 -0
  224. package/dist/player/renderers/mermaid.d.ts.map +1 -0
  225. package/dist/player/renderers/stats.d.ts +3 -0
  226. package/dist/player/renderers/stats.d.ts.map +1 -0
  227. package/dist/player/renderers/terminal.d.ts +3 -0
  228. package/dist/player/renderers/terminal.d.ts.map +1 -0
  229. package/dist/player/themes/dark.d.ts +2 -0
  230. package/dist/player/themes/dark.d.ts.map +1 -0
  231. package/dist/player/themes/light.d.ts +2 -0
  232. package/dist/player/themes/light.d.ts.map +1 -0
  233. package/dist/player/timeline.d.ts +43 -0
  234. package/dist/player/timeline.d.ts.map +1 -0
  235. package/dist/serve.d.ts +2 -0
  236. package/dist/serve.d.ts.map +1 -0
  237. package/dist/serve.js +171 -0
  238. package/dist/serve.js.map +1 -0
  239. package/dist/templates/discover.d.ts +20 -0
  240. package/dist/templates/discover.d.ts.map +1 -0
  241. package/dist/templates/discover.js +86 -0
  242. package/dist/templates/discover.js.map +1 -0
  243. package/dist/templates/loader.d.ts +17 -0
  244. package/dist/templates/loader.d.ts.map +1 -0
  245. package/dist/templates/loader.js +40 -0
  246. package/dist/templates/loader.js.map +1 -0
  247. package/package.json +62 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CuppaTech
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # CuppaCue CLI
2
+
3
+ Developer-first presentation tool — turn markdown into animated slides.
4
+
5
+ *"Right on cue."*
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ # Create a new presentation
11
+ cuppacue init my-talk
12
+
13
+ # Build to .cup file
14
+ cuppacue build slides.md
15
+
16
+ # Start dev server with hot reload
17
+ cuppacue serve slides.md
18
+
19
+ # Export to standalone HTML
20
+ cuppacue export slides.cup --out talk.html
21
+ ```
22
+
23
+ ## Commands
24
+
25
+ | Command | Description |
26
+ |---------|-------------|
27
+ | `init [name]` | Create a new presentation project |
28
+ | `build <file.md>` | Compile markdown to `.cup` file |
29
+ | `serve <file>` | Dev server with hot reload |
30
+ | `validate <file>` | Validate a presentation |
31
+ | `export <file>` | Export as HTML or PDF |
32
+ | `ai <prompt>` | Generate a presentation with AI |
33
+ | `preview <url>` | Preview a GitHub README (experimental) |
34
+
35
+ ## The `.cup` Format
36
+
37
+ A `.cup` file is a ZIP archive containing:
38
+
39
+ ```
40
+ presentation.cup
41
+ ├── manifest.json # Metadata (title, author, scene count)
42
+ ├── content.json # Scenes and elements
43
+ ├── timesheet.json # Animation timeline
44
+ └── theme.json # Colors, fonts, typography
45
+ ```
46
+
47
+ ## Markdown Authoring
48
+
49
+ Write slides in markdown with `---` separators:
50
+
51
+ ```markdown
52
+ ---
53
+ title: My Talk
54
+ author: Jane
55
+ theme: dark
56
+ ---
57
+
58
+ # Welcome
59
+
60
+ ### A presentation built with CuppaCue
61
+
62
+ ---
63
+
64
+ ## Key Points
65
+
66
+ - Markdown-first authoring
67
+ - Timeline-driven animations
68
+ - AI-powered generation
69
+
70
+ ---
71
+
72
+ ## Code Example
73
+
74
+ ` ` `typescript
75
+ function greet(name: string) {
76
+ return `Hello, ${name}!`;
77
+ }
78
+ ` ` `
79
+ ```
80
+
81
+ ## Requirements
82
+
83
+ - Node.js >= 20
84
+ - Optional: `playwright` for PDF export
85
+ - Optional: Anthropic API key for AI generation
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.test.d.ts","sourceRoot":"","sources":["../../../src/ai/__tests__/generate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { DEFAULT_THEME } from "@cuppacue/format";
3
+ import { extractJson, autoFix } from "../generate.js";
4
+ // We test extractJson and autoFix directly (no API calls needed).
5
+ // The generate() function itself is tested via integration tests.
6
+ function validCupData() {
7
+ return {
8
+ manifest: { version: 1, title: "Test", sceneCount: 1 },
9
+ content: {
10
+ scenes: [
11
+ {
12
+ id: "s1",
13
+ elements: [
14
+ { id: "e1", type: "text", content: "Hello", role: "title" },
15
+ ],
16
+ },
17
+ ],
18
+ },
19
+ timesheet: {
20
+ timeline: [
21
+ {
22
+ sceneId: "s1",
23
+ duration: 3000,
24
+ events: [{ elementId: "e1", animation: "fadeIn", at: 0 }],
25
+ },
26
+ ],
27
+ },
28
+ theme: { ...DEFAULT_THEME },
29
+ };
30
+ }
31
+ describe("extractJson", () => {
32
+ it("extracts JSON from markdown code fences", () => {
33
+ const response = '```json\n{"manifest": {"title": "Test"}}\n```';
34
+ const result = extractJson(response);
35
+ expect(JSON.parse(result)).toEqual({ manifest: { title: "Test" } });
36
+ });
37
+ it("extracts JSON from fences without language tag", () => {
38
+ const response = '```\n{"key": "value"}\n```';
39
+ const result = extractJson(response);
40
+ expect(JSON.parse(result)).toEqual({ key: "value" });
41
+ });
42
+ it("extracts bare JSON object", () => {
43
+ const response = '{"manifest": {"title": "Hello"}}';
44
+ const result = extractJson(response);
45
+ expect(JSON.parse(result)).toEqual({ manifest: { title: "Hello" } });
46
+ });
47
+ it("handles surrounding text around JSON", () => {
48
+ const response = 'Here is your presentation:\n{"manifest": {"title": "Test"}}\nHope you like it!';
49
+ const result = extractJson(response);
50
+ expect(JSON.parse(result)).toEqual({ manifest: { title: "Test" } });
51
+ });
52
+ it("prefers code fence over bare JSON", () => {
53
+ const response = 'Some text {"bad": true}\n```json\n{"good": true}\n```\nMore text';
54
+ const result = extractJson(response);
55
+ expect(JSON.parse(result)).toEqual({ good: true });
56
+ });
57
+ });
58
+ describe("autoFix", () => {
59
+ it("fixes incorrect sceneCount", () => {
60
+ const data = validCupData();
61
+ data.manifest.sceneCount = 99;
62
+ const cup = autoFix(data);
63
+ expect(cup.manifest.sceneCount).toBe(1);
64
+ });
65
+ it("adds missing element IDs", () => {
66
+ const data = validCupData();
67
+ data.content.scenes[0].elements[0].id = "";
68
+ const cup = autoFix(data);
69
+ expect(cup.content.scenes[0].elements[0].id).toBeTruthy();
70
+ });
71
+ it("adds missing scene IDs", () => {
72
+ const data = validCupData();
73
+ data.content.scenes[0].id = "";
74
+ const cup = autoFix(data);
75
+ expect(cup.content.scenes[0].id).toBeTruthy();
76
+ });
77
+ it("regenerates timesheet on invalid timeline", () => {
78
+ const data = validCupData();
79
+ // Invalid: reference to non-existent element
80
+ data.timesheet.timeline[0].events[0].elementId = "nonexistent";
81
+ const cup = autoFix(data);
82
+ // After autoFix, timesheet should reference the actual element
83
+ expect(cup.timesheet.timeline[0].events[0].elementId).toBe("e1");
84
+ });
85
+ it("preserves valid timesheet", () => {
86
+ const data = validCupData();
87
+ const originalDuration = data.timesheet.timeline[0].duration;
88
+ const cup = autoFix(data);
89
+ expect(cup.timesheet.timeline[0].duration).toBe(originalDuration);
90
+ });
91
+ it("adds layout to scenes without one", () => {
92
+ const data = validCupData();
93
+ // Scene has a single title element, no layout set → infers "intro"
94
+ const cup = autoFix(data);
95
+ expect(cup.content.scenes[0].layout).toBeDefined();
96
+ expect(cup.content.scenes[0].layout).toBe("intro");
97
+ });
98
+ it("preserves existing layout", () => {
99
+ const data = validCupData();
100
+ data.content.scenes[0].layout = "header-body";
101
+ const cup = autoFix(data);
102
+ expect(cup.content.scenes[0].layout).toBe("header-body");
103
+ });
104
+ it("marks placeholder images as placeholder: true", () => {
105
+ const data = validCupData();
106
+ data.content.scenes[0].elements.push({
107
+ id: "img1",
108
+ type: "image",
109
+ src: "placeholder",
110
+ alt: "test image",
111
+ });
112
+ const cup = autoFix(data);
113
+ const img = cup.content.scenes[0].elements.find((e) => e.type === "image");
114
+ expect(img.placeholder).toBe(true);
115
+ });
116
+ it("does not mark valid URL images as placeholder", () => {
117
+ const data = validCupData();
118
+ data.content.scenes[0].elements.push({
119
+ id: "img1",
120
+ type: "image",
121
+ src: "https://example.com/photo.jpg",
122
+ alt: "real photo",
123
+ });
124
+ const cup = autoFix(data);
125
+ const img = cup.content.scenes[0].elements.find((e) => e.type === "image");
126
+ expect(img.placeholder).toBeUndefined();
127
+ });
128
+ });
129
+ //# sourceMappingURL=generate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.test.js","sourceRoot":"","sources":["../../../src/ai/__tests__/generate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=images.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.test.d.ts","sourceRoot":"","sources":["../../../src/ai/__tests__/images.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,186 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { resolveImages } from "../images.js";
3
+ import { DEFAULT_THEME } from "@cuppacue/format";
4
+ function makeCup(elements) {
5
+ return {
6
+ manifest: { version: 1, title: "Test", sceneCount: 1 },
7
+ content: {
8
+ scenes: [
9
+ {
10
+ id: "s1",
11
+ elements: elements,
12
+ },
13
+ ],
14
+ },
15
+ timesheet: {
16
+ timeline: [
17
+ {
18
+ sceneId: "s1",
19
+ duration: 3000,
20
+ events: [],
21
+ },
22
+ ],
23
+ },
24
+ theme: { ...DEFAULT_THEME },
25
+ };
26
+ }
27
+ function placeholderImage(overrides = {}) {
28
+ return {
29
+ id: "img1",
30
+ type: "image",
31
+ src: "placeholder",
32
+ alt: "modern server room",
33
+ placeholder: true,
34
+ ...overrides,
35
+ };
36
+ }
37
+ describe("resolveImages", () => {
38
+ const savedPexels = process.env.PEXELS_API_KEY;
39
+ const savedUnsplash = process.env.UNSPLASH_ACCESS_KEY;
40
+ beforeEach(() => {
41
+ delete process.env.PEXELS_API_KEY;
42
+ delete process.env.UNSPLASH_ACCESS_KEY;
43
+ });
44
+ afterEach(() => {
45
+ vi.restoreAllMocks();
46
+ if (savedPexels !== undefined) {
47
+ process.env.PEXELS_API_KEY = savedPexels;
48
+ }
49
+ else {
50
+ delete process.env.PEXELS_API_KEY;
51
+ }
52
+ if (savedUnsplash !== undefined) {
53
+ process.env.UNSPLASH_ACCESS_KEY = savedUnsplash;
54
+ }
55
+ else {
56
+ delete process.env.UNSPLASH_ACCESS_KEY;
57
+ }
58
+ });
59
+ it("returns unchanged cup when no placeholders exist", async () => {
60
+ const cup = makeCup([
61
+ {
62
+ id: "img1",
63
+ type: "image",
64
+ src: "https://example.com/photo.jpg",
65
+ alt: "a photo",
66
+ },
67
+ ]);
68
+ const before = JSON.stringify(cup);
69
+ await resolveImages(cup);
70
+ expect(JSON.stringify(cup)).toBe(before);
71
+ });
72
+ it("skips resolution when no API key is set", async () => {
73
+ const cup = makeCup([placeholderImage()]);
74
+ const spy = vi.spyOn(globalThis, "fetch");
75
+ await resolveImages(cup);
76
+ expect(spy).not.toHaveBeenCalled();
77
+ expect(cup.content.scenes[0].elements[0]
78
+ .placeholder).toBe(true);
79
+ });
80
+ it("keeps placeholder on fetch failure", async () => {
81
+ process.env.PEXELS_API_KEY = "test-key";
82
+ const cup = makeCup([placeholderImage({ alt: "abstract art" })]);
83
+ vi.spyOn(globalThis, "fetch").mockRejectedValue(new Error("Network error"));
84
+ await resolveImages(cup);
85
+ const img = cup.content.scenes[0].elements[0];
86
+ expect(img.placeholder).toBe(true);
87
+ expect(img.src).toBe("placeholder");
88
+ });
89
+ it("skips non-placeholder images", async () => {
90
+ process.env.PEXELS_API_KEY = "test-key";
91
+ const cup = makeCup([
92
+ {
93
+ id: "img1",
94
+ type: "image",
95
+ src: "https://example.com/real.jpg",
96
+ alt: "a real photo",
97
+ },
98
+ placeholderImage({ id: "img2", alt: "placeholder photo" }),
99
+ ]);
100
+ vi.spyOn(globalThis, "fetch").mockResolvedValue({
101
+ ok: true,
102
+ json: async () => ({
103
+ photos: [{ src: { large2x: "https://images.pexels.com/resolved" } }],
104
+ }),
105
+ });
106
+ await resolveImages(cup);
107
+ const img1 = cup.content.scenes[0].elements[0];
108
+ const img2 = cup.content.scenes[0].elements[1];
109
+ expect(img1.src).toBe("https://example.com/real.jpg");
110
+ expect(img2.src).toBe("https://images.pexels.com/resolved");
111
+ });
112
+ describe("Pexels provider", () => {
113
+ it("resolves placeholder images via Pexels API", async () => {
114
+ process.env.PEXELS_API_KEY = "pexels-key";
115
+ const cup = makeCup([placeholderImage()]);
116
+ vi.spyOn(globalThis, "fetch").mockResolvedValue({
117
+ ok: true,
118
+ json: async () => ({
119
+ photos: [{ src: { large2x: "https://images.pexels.com/photo-456" } }],
120
+ }),
121
+ });
122
+ await resolveImages(cup);
123
+ const img = cup.content.scenes[0].elements[0];
124
+ expect(img.src).toBe("https://images.pexels.com/photo-456");
125
+ expect(img.placeholder).toBe(false);
126
+ });
127
+ it("calls Pexels API with correct Authorization header", async () => {
128
+ process.env.PEXELS_API_KEY = "my-pexels-key";
129
+ const cup = makeCup([placeholderImage()]);
130
+ const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue({
131
+ ok: true,
132
+ json: async () => ({
133
+ photos: [{ src: { large2x: "https://images.pexels.com/img.jpg" } }],
134
+ }),
135
+ });
136
+ await resolveImages(cup);
137
+ expect(fetchSpy).toHaveBeenCalledWith(expect.stringContaining("api.pexels.com"), expect.objectContaining({
138
+ headers: { Authorization: "my-pexels-key" },
139
+ }));
140
+ });
141
+ it("prefers Pexels over Unsplash when both keys are set", async () => {
142
+ process.env.PEXELS_API_KEY = "pexels-key";
143
+ process.env.UNSPLASH_ACCESS_KEY = "unsplash-key";
144
+ const cup = makeCup([placeholderImage()]);
145
+ const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue({
146
+ ok: true,
147
+ json: async () => ({
148
+ photos: [{ src: { large2x: "https://images.pexels.com/photo.jpg" } }],
149
+ }),
150
+ });
151
+ await resolveImages(cup);
152
+ expect(fetchSpy).toHaveBeenCalledWith(expect.stringContaining("pexels.com"), expect.any(Object));
153
+ });
154
+ });
155
+ describe("Unsplash provider", () => {
156
+ it("resolves placeholder images via Unsplash API", async () => {
157
+ process.env.UNSPLASH_ACCESS_KEY = "unsplash-key";
158
+ const cup = makeCup([placeholderImage()]);
159
+ vi.spyOn(globalThis, "fetch").mockResolvedValue({
160
+ ok: true,
161
+ json: async () => ({
162
+ results: [{ urls: { regular: "https://images.unsplash.com/photo-123" } }],
163
+ }),
164
+ });
165
+ await resolveImages(cup);
166
+ const img = cup.content.scenes[0].elements[0];
167
+ expect(img.src).toBe("https://images.unsplash.com/photo-123");
168
+ expect(img.placeholder).toBe(false);
169
+ });
170
+ it("calls Unsplash API with correct Authorization header", async () => {
171
+ process.env.UNSPLASH_ACCESS_KEY = "my-unsplash-key";
172
+ const cup = makeCup([placeholderImage()]);
173
+ const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue({
174
+ ok: true,
175
+ json: async () => ({
176
+ results: [{ urls: { regular: "https://example.com/img.jpg" } }],
177
+ }),
178
+ });
179
+ await resolveImages(cup);
180
+ expect(fetchSpy).toHaveBeenCalledWith(expect.stringContaining("unsplash.com"), expect.objectContaining({
181
+ headers: { Authorization: "Client-ID my-unsplash-key" },
182
+ }));
183
+ });
184
+ });
185
+ });
186
+ //# sourceMappingURL=images.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.test.js","sourceRoot":"","sources":["../../../src/ai/__tests__/images.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.test.d.ts","sourceRoot":"","sources":["../../../src/ai/__tests__/prompt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildGeneratePrompt, buildRefinePrompt } from "../prompt.js";
3
+ import { FORMAT_SCHEMA } from "../schema.js";
4
+ import { EXAMPLE_CUPFILE } from "../example.js";
5
+ import { DEFAULT_THEME } from "@cuppacue/format";
6
+ function validCupFile() {
7
+ return {
8
+ manifest: { version: 1, title: "Test", sceneCount: 1 },
9
+ content: {
10
+ scenes: [
11
+ {
12
+ id: "s1",
13
+ elements: [{ id: "e1", type: "text", content: "Hello" }],
14
+ },
15
+ ],
16
+ },
17
+ timesheet: {
18
+ timeline: [
19
+ {
20
+ sceneId: "s1",
21
+ duration: 3000,
22
+ events: [{ elementId: "e1", animation: "fadeIn", at: 0 }],
23
+ },
24
+ ],
25
+ },
26
+ theme: { ...DEFAULT_THEME },
27
+ };
28
+ }
29
+ describe("buildGeneratePrompt", () => {
30
+ it("includes format schema in system prompt", () => {
31
+ const { system } = buildGeneratePrompt("test prompt");
32
+ expect(system).toContain(FORMAT_SCHEMA);
33
+ });
34
+ it("includes example CupFile in system prompt", () => {
35
+ const { system } = buildGeneratePrompt("test prompt");
36
+ expect(system).toContain(EXAMPLE_CUPFILE);
37
+ });
38
+ it("includes user text in user prompt", () => {
39
+ const { user } = buildGeneratePrompt("Explain OAuth 2.0");
40
+ expect(user).toContain("Explain OAuth 2.0");
41
+ });
42
+ it("includes source content when provided", () => {
43
+ const { user } = buildGeneratePrompt("make a talk", "# My Notes\nSome content");
44
+ expect(user).toContain("make a talk");
45
+ expect(user).toContain("# My Notes\nSome content");
46
+ });
47
+ it("omits source content section when not provided", () => {
48
+ const { user } = buildGeneratePrompt("just a prompt");
49
+ expect(user).toBe("just a prompt");
50
+ });
51
+ });
52
+ describe("buildRefinePrompt", () => {
53
+ it("includes current CupFile JSON in user prompt", () => {
54
+ const cup = validCupFile();
55
+ const { user } = buildRefinePrompt(cup, "add a slide");
56
+ expect(user).toContain('"title": "Test"');
57
+ expect(user).toContain('"sceneCount": 1');
58
+ });
59
+ it("includes refinement instruction in user prompt", () => {
60
+ const cup = validCupFile();
61
+ const { user } = buildRefinePrompt(cup, "add a code example to slide 3");
62
+ expect(user).toContain("add a code example to slide 3");
63
+ });
64
+ it("includes format schema in system prompt", () => {
65
+ const cup = validCupFile();
66
+ const { system } = buildRefinePrompt(cup, "change something");
67
+ expect(system).toContain(FORMAT_SCHEMA);
68
+ });
69
+ });
70
+ describe("prompt guidelines", () => {
71
+ it("generate prompt includes image guidelines", () => {
72
+ const { system } = buildGeneratePrompt("test");
73
+ expect(system).toContain("placeholder");
74
+ expect(system).toContain("ImageElements");
75
+ });
76
+ it("generate prompt includes references guidelines", () => {
77
+ const { system } = buildGeneratePrompt("test");
78
+ expect(system).toContain("References");
79
+ expect(system).toContain("Learn More");
80
+ });
81
+ it("refine prompt includes image guidance", () => {
82
+ const cup = validCupFile();
83
+ const { system } = buildRefinePrompt(cup, "test");
84
+ expect(system).toContain("placeholder");
85
+ });
86
+ it("generate prompt includes typography guidelines", () => {
87
+ const { system } = buildGeneratePrompt("test");
88
+ expect(system).toContain("Typography");
89
+ expect(system).toContain("elegant");
90
+ expect(system).toContain("minimal");
91
+ expect(system).toContain("bold");
92
+ });
93
+ it("generate prompt recommends revealDown for code", () => {
94
+ const { system } = buildGeneratePrompt("test");
95
+ expect(system).toContain("revealDown for code");
96
+ });
97
+ });
98
+ //# sourceMappingURL=prompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.test.js","sourceRoot":"","sources":["../../../src/ai/__tests__/prompt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=refine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine.test.d.ts","sourceRoot":"","sources":["../../../src/ai/__tests__/refine.test.ts"],"names":[],"mappings":""}