taleem-slides 0.3.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 (66) hide show
  1. package/README.md +224 -0
  2. package/decks/angles_and_transversals.json +85 -0
  3. package/decks/congruent_triangles.json +169 -0
  4. package/decks/demo_deck.json +22 -0
  5. package/decks/eq_28aug2025.json +67 -0
  6. package/decks/goldstandar_eq_28aug25.json +69 -0
  7. package/decks/parallelogram_properties.json +164 -0
  8. package/decks/parallelogram_properties_no_sound.json +164 -0
  9. package/decks/posultate_and_SAS_postulate.json +76 -0
  10. package/decks/qanoon.md +136 -0
  11. package/decks/theorem_revision_ch10_11.fixed.json +265 -0
  12. package/decks/theorem_revision_ch10_11.json +269 -0
  13. package/decks/theorems9old_11.1.1.json +382 -0
  14. package/decks/theorems9old_11.1.2.json +162 -0
  15. package/decks/theorems9old_11.1.3.json +857 -0
  16. package/index.html +88 -0
  17. package/package.json +22 -0
  18. package/src/index.js +5 -0
  19. package/src/interpreter/slideBuilder.js +65 -0
  20. package/src/registry.js +57 -0
  21. package/src/slideManager/SlideManager.js +62 -0
  22. package/src/slides/BarChartSlide.js +44 -0
  23. package/src/slides/BigNumberSlide.js +24 -0
  24. package/src/slides/BulletListSlide.js +26 -0
  25. package/src/slides/ContactSlide.js +22 -0
  26. package/src/slides/CornerWordsSlide.js +27 -0
  27. package/src/slides/DonutChartSlide.js +28 -0
  28. package/src/slides/EqSlide.js +22 -0
  29. package/src/slides/FillImageSlide.js +24 -0
  30. package/src/slides/ImageLeftBulletsRightSlide.js +28 -0
  31. package/src/slides/ImageRightBulletsLeftSlide.js +28 -0
  32. package/src/slides/ImageSlide.js +22 -0
  33. package/src/slides/ImageWithCaptionSlide.js +26 -0
  34. package/src/slides/ImageWithTitleSlide.js +26 -0
  35. package/src/slides/QuoteSlide.js +24 -0
  36. package/src/slides/QuoteWithImageSlide.js +30 -0
  37. package/src/slides/StatisticSlide.js +26 -0
  38. package/src/slides/SvgPointerSlide.js +22 -0
  39. package/src/slides/TableSlide.js +27 -0
  40. package/src/slides/TitleAndParaSlide.js +26 -0
  41. package/src/slides/TitleAndSubtitleSlide.js +27 -0
  42. package/src/slides/TitleSlide.js +41 -0
  43. package/src/slides/TwoColumnTextSlide.js +27 -0
  44. package/tests/interpreter.test.js +47 -0
  45. package/tests/slides.barChart.test.js +64 -0
  46. package/tests/slides.bigNumber.test.js +28 -0
  47. package/tests/slides.bulletList.test.js +32 -0
  48. package/tests/slides.contactSlide.test.js +48 -0
  49. package/tests/slides.cornerWordsSlide.test.js +28 -0
  50. package/tests/slides.donutChart.test.js +28 -0
  51. package/tests/slides.eq.test.js +26 -0
  52. package/tests/slides.fillImage.test.js +28 -0
  53. package/tests/slides.imageLeftBulletsRight.test.js +28 -0
  54. package/tests/slides.imageRightBulletsLeft.test.js +26 -0
  55. package/tests/slides.imageSlide.test.js +28 -0
  56. package/tests/slides.imageWithCaption.test.js +44 -0
  57. package/tests/slides.imageWithTitle.test.js +45 -0
  58. package/tests/slides.quoteSlide.test.js +28 -0
  59. package/tests/slides.quoteWithImage.test.js +46 -0
  60. package/tests/slides.statistic.test.js +44 -0
  61. package/tests/slides.svgPointer.test.js +37 -0
  62. package/tests/slides.table.test.js +41 -0
  63. package/tests/slides.test.js +42 -0
  64. package/tests/slides.titleAndPara.test.js +35 -0
  65. package/tests/slides.titleAndSubtitle.test.js +32 -0
  66. package/tests/slides.twoColumnText.test.js +35 -0
@@ -0,0 +1,30 @@
1
+ export const QuoteWithImageSlide = {
2
+ type: "quoteWithImage",
3
+
4
+ fromJSON(raw) {
5
+ const quote = raw.data?.find(d => d.name === "quote")?.content;
6
+ const image = raw.data?.find(d => d.name === "image")?.content;
7
+ const author = raw.data?.find(d => d.name === "author")?.content;
8
+
9
+ if (!quote || !image) {
10
+ throw new Error("quoteWithImage: quote and image required");
11
+ }
12
+
13
+ return Object.freeze({
14
+ type: "quoteWithImage",
15
+ render() {
16
+ return `
17
+ <section class="slide quoteWithImage">
18
+ <img src="${image}" alt="" />
19
+ <blockquote>
20
+ <p>${quote}</p>
21
+ ${author ? `<footer>${author}</footer>` : ""}
22
+ </blockquote>
23
+ </section>
24
+ `;
25
+ }
26
+
27
+ });
28
+ }
29
+ };
30
+
@@ -0,0 +1,26 @@
1
+ export const StatisticSlide = {
2
+ type: "statistic",
3
+
4
+ fromJSON(raw) {
5
+ const label = raw.data?.find(d => d.name === "label")?.content;
6
+ const value = raw.data?.find(d => d.name === "value")?.content;
7
+
8
+ if (!label || value === undefined) {
9
+ throw new Error("statistic: requires label and value");
10
+ }
11
+
12
+ return Object.freeze({
13
+ type: "statistic",
14
+ render() {
15
+ return `
16
+ <section class="slide statistic">
17
+ <div class="stat-value">${value}</div>
18
+ <div class="stat-label">${label}</div>
19
+ </section>
20
+ `;
21
+ }
22
+
23
+ });
24
+ }
25
+ };
26
+
@@ -0,0 +1,22 @@
1
+ export const SvgPointerSlide = {
2
+ type: "svgPointer",
3
+
4
+ fromJSON(raw) {
5
+ const svg = raw.data?.find(d => d.name === "svg")?.content;
6
+
7
+ if (!svg) throw new Error("svgPointer: svg required");
8
+
9
+ return Object.freeze({
10
+ type: "svgPointer",
11
+ render() {
12
+ return `
13
+ <section class="slide svgPointer">
14
+ ${svg}
15
+ </section>
16
+ `;
17
+ }
18
+
19
+ });
20
+ }
21
+ };
22
+
@@ -0,0 +1,27 @@
1
+ export const TableSlide = {
2
+ type: "table",
3
+
4
+ fromJSON(raw) {
5
+ const rows = raw.data?.filter(d => d.name === "row").map(d => d.content);
6
+
7
+ if (!rows || rows.length === 0) {
8
+ throw new Error("table: requires at least one row");
9
+ }
10
+
11
+ return Object.freeze({
12
+ type: "table",
13
+ render() {
14
+ return `
15
+ <table class="slide table">
16
+ ${rows.map(
17
+ row =>
18
+ `<tr>${row.map(cell => `<td>${cell}</td>`).join("")}</tr>`
19
+ ).join("")}
20
+ </table>
21
+ `;
22
+ }
23
+
24
+ });
25
+ }
26
+ };
27
+
@@ -0,0 +1,26 @@
1
+ export const TitleAndParaSlide = {
2
+ type: "titleAndPara",
3
+
4
+ fromJSON(raw) {
5
+ const title = raw.data?.find(d => d.name === "title")?.content;
6
+ const para = raw.data?.find(d => d.name === "para")?.content;
7
+
8
+ if (!title || !para) {
9
+ throw new Error("titleAndPara: requires title and para");
10
+ }
11
+
12
+ return Object.freeze({
13
+ type: "titleAndPara",
14
+ render() {
15
+ return `
16
+ <section class="slide titleAndPara">
17
+ <h1>${title}</h1>
18
+ <p>${para}</p>
19
+ </section>
20
+ `;
21
+ }
22
+
23
+ });
24
+ }
25
+ };
26
+
@@ -0,0 +1,27 @@
1
+
2
+ export const TitleAndSubtitleSlide = {
3
+ type: "titleAndSubtitle",
4
+
5
+ fromJSON(raw) {
6
+ const title = raw.data?.find(d => d.name === "title")?.content;
7
+ const subtitle = raw.data?.find(d => d.name === "subtitle")?.content;
8
+
9
+ if (!title || !subtitle) {
10
+ throw new Error("titleAndSubtitle: requires title and subtitle");
11
+ }
12
+
13
+ return Object.freeze({
14
+ type: "titleAndSubtitle",
15
+ render() {
16
+ return `
17
+ <section class="slide titleAndSubtitle">
18
+ <h1>${title}</h1>
19
+ <h2>${subtitle}</h2>
20
+ </section>
21
+ `;
22
+ }
23
+
24
+ });
25
+ }
26
+ };
27
+
@@ -0,0 +1,41 @@
1
+ // src/slides/TitleSlide.js
2
+
3
+ /**
4
+ * TitleSlide
5
+ * Private implementation – not exported publicly
6
+ */
7
+ export const TitleSlide = {
8
+ type: "titleSlide",
9
+
10
+ /**
11
+ * Build a TitleSlide from raw deck JSON
12
+ */
13
+ fromJSON(rawSlide, index) {
14
+ if (!Array.isArray(rawSlide.data)) {
15
+ throw new Error(`TitleSlide: data must be an array`);
16
+ }
17
+
18
+ const titleItem = rawSlide.data.find(d => d.name === "title");
19
+
20
+ if (!titleItem || typeof titleItem.content !== "string") {
21
+ throw new Error(`TitleSlide: missing or invalid title content`);
22
+ }
23
+
24
+ const title = titleItem.content;
25
+
26
+ // immutable slide object
27
+ return Object.freeze({
28
+ type: "titleSlide",
29
+
30
+ render() {
31
+ return `
32
+ <div class="slide titleSlide">
33
+ <h1>${title}</h1>
34
+ </div>
35
+ `;
36
+ }
37
+
38
+ });
39
+ }
40
+ };
41
+
@@ -0,0 +1,27 @@
1
+
2
+ export const TwoColumnTextSlide = {
3
+ type: "twoColumnText",
4
+
5
+ fromJSON(raw) {
6
+ const left = raw.data?.filter(d => d.name === "left").map(d => d.content);
7
+ const right = raw.data?.filter(d => d.name === "right").map(d => d.content);
8
+
9
+ if (!left?.length || !right?.length) {
10
+ throw new Error("twoColumnText: requires left and right columns");
11
+ }
12
+
13
+ return Object.freeze({
14
+ type: "twoColumnText",
15
+ render() {
16
+ return `
17
+ <section class="slide twoColumnText">
18
+ <div class="col left">${left.join("<br/>")}</div>
19
+ <div class="col right">${right.join("<br/>")}</div>
20
+ </section>
21
+ `;
22
+ }
23
+
24
+ });
25
+ }
26
+ };
27
+
@@ -0,0 +1,47 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { slideBuilder } from "../src/interpreter/slideBuilder.js";
3
+
4
+ describe("slideBuilder", () => {
5
+ test("builds slide manager from a valid deck", () => {
6
+ const deck = {
7
+ version: "deck-v1",
8
+ deck: [
9
+ {
10
+ type: "titleSlide",
11
+ start: 0,
12
+ end: 10,
13
+ data: [{ name: "title", content: "Hello World" }]
14
+ }
15
+ ]
16
+ };
17
+
18
+ const manager = slideBuilder(deck);
19
+
20
+ expect(manager).toBeDefined();
21
+ expect(typeof manager.renderSlide).toBe("function");
22
+
23
+ const html = manager.renderSlide(0);
24
+ expect(typeof html).toBe("string");
25
+ expect(html).toContain("Hello World");
26
+ });
27
+
28
+ test("throws on unknown slide type", () => {
29
+ const deck = {
30
+ version: "deck-v1",
31
+ deck: [{ type: "unknownSlide", data: [] }]
32
+ };
33
+
34
+ expect(() => slideBuilder(deck)).toThrow(
35
+ /unsupported slide type "unknownSlide"/
36
+ );
37
+ });
38
+
39
+ test("throws on malformed slide data", () => {
40
+ const deck = {
41
+ version: "deck-v1",
42
+ deck: [{ type: "titleSlide", data: [] }]
43
+ };
44
+
45
+ expect(() => slideBuilder(deck)).toThrow();
46
+ });
47
+ });
@@ -0,0 +1,64 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { BarChartSlide } from "../src/slides/BarChartSlide.js";
3
+
4
+ describe("barChart", () => {
5
+ test("builds successfully with valid bars", () => {
6
+ const raw = {
7
+ type: "barChart",
8
+ data: [
9
+ { name: "bar", content: { label: "A", value: 10 } },
10
+ { name: "bar", content: { label: "B", value: 20 } }
11
+ ]
12
+ };
13
+
14
+ const slide = BarChartSlide.fromJSON(raw);
15
+
16
+ expect(slide.type).toBe("barChart");
17
+
18
+ const html = slide.render();
19
+
20
+ // semantic assertions (NOT snapshot)
21
+ expect(html).toContain("A");
22
+ expect(html).toContain("10");
23
+ expect(html).toContain("B");
24
+ expect(html).toContain("20");
25
+ });
26
+
27
+ test("throws if no bars are provided", () => {
28
+ const raw = {
29
+ type: "barChart",
30
+ data: []
31
+ };
32
+
33
+ expect(() => BarChartSlide.fromJSON(raw)).toThrow(
34
+ "barChart: requires at least one bar"
35
+ );
36
+ });
37
+
38
+ test("throws on invalid bar structure", () => {
39
+ const raw = {
40
+ type: "barChart",
41
+ data: [
42
+ { name: "bar", content: { label: "A", value: "wrong" } }
43
+ ]
44
+ };
45
+
46
+ expect(() => BarChartSlide.fromJSON(raw)).toThrow(
47
+ "barChart: invalid bar"
48
+ );
49
+ });
50
+
51
+ test("render output is deterministic", () => {
52
+ const raw = {
53
+ type: "barChart",
54
+ data: [
55
+ { name: "bar", content: { label: "X", value: 5 } }
56
+ ]
57
+ };
58
+
59
+ const slide1 = BarChartSlide.fromJSON(raw);
60
+ const slide2 = BarChartSlide.fromJSON(raw);
61
+
62
+ expect(slide1.render()).toBe(slide2.render());
63
+ });
64
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { slideBuilder } from "../src/interpreter/slideBuilder.js";
3
+
4
+ describe("bigNumber", () => {
5
+ test("builds with number", () => {
6
+ const deck = {
7
+ version: "deck-v1",
8
+ deck: [{
9
+ type: "bigNumber",
10
+ data: [{ name: "number", content: 42 }]
11
+ }]
12
+ };
13
+
14
+ const manager = slideBuilder(deck);
15
+ const html = manager.renderSlide(0);
16
+
17
+ expect(html).toContain("42");
18
+ });
19
+
20
+ test("throws without number", () => {
21
+ expect(() =>
22
+ slideBuilder({
23
+ version: "deck-v1",
24
+ deck: [{ type: "bigNumber", data: [] }]
25
+ })
26
+ ).toThrow();
27
+ });
28
+ });
@@ -0,0 +1,32 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { slideBuilder } from "../src/interpreter/slideBuilder.js";
3
+
4
+ describe("bulletList", () => {
5
+ test("builds with bullets", () => {
6
+ const deck = {
7
+ version: "deck-v1",
8
+ deck: [{
9
+ type: "bulletList",
10
+ data: [
11
+ { name: "bullet", content: "A" },
12
+ { name: "bullet", content: "B" }
13
+ ]
14
+ }]
15
+ };
16
+
17
+ const manager = slideBuilder(deck);
18
+ const html = manager.renderSlide(0);
19
+
20
+ expect(html).toContain("A");
21
+ expect(html).toContain("B");
22
+ });
23
+
24
+ test("throws with no bullets", () => {
25
+ expect(() =>
26
+ slideBuilder({
27
+ version: "deck-v1",
28
+ deck: [{ type: "bulletList", data: [] }]
29
+ })
30
+ ).toThrow();
31
+ });
32
+ });
@@ -0,0 +1,48 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { ContactSlide } from "../src/slides/ContactSlide.js";
3
+
4
+ describe("contactSlide", () => {
5
+ test("builds with contact items", () => {
6
+ const raw = {
7
+ type: "contactSlide",
8
+ data: [
9
+ { name: "line", content: "Email: test@example.com" },
10
+ { name: "line", content: "Phone: 123456" }
11
+ ]
12
+ };
13
+
14
+ const slide = ContactSlide.fromJSON(raw);
15
+
16
+ expect(slide.type).toBe("contactSlide");
17
+
18
+ const html = slide.render();
19
+
20
+ expect(html).toContain("Email: test@example.com");
21
+ expect(html).toContain("Phone: 123456");
22
+ });
23
+
24
+ test("throws if no content is provided", () => {
25
+ const raw = {
26
+ type: "contactSlide",
27
+ data: []
28
+ };
29
+
30
+ expect(() => ContactSlide.fromJSON(raw)).toThrow(
31
+ "contactSlide: content required"
32
+ );
33
+ });
34
+
35
+ test("render output is deterministic", () => {
36
+ const raw = {
37
+ type: "contactSlide",
38
+ data: [
39
+ { name: "line", content: "Address: Somewhere" }
40
+ ]
41
+ };
42
+
43
+ const slide1 = ContactSlide.fromJSON(raw);
44
+ const slide2 = ContactSlide.fromJSON(raw);
45
+
46
+ expect(slide1.render()).toBe(slide2.render());
47
+ });
48
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { slideBuilder } from "../src/interpreter/slideBuilder.js";
3
+
4
+ describe("cornerWordsSlide", () => {
5
+ test("builds with words", () => {
6
+ const deck = {
7
+ version: "deck-v1",
8
+ deck: [{
9
+ type: "cornerWordsSlide",
10
+ data: [{ name: "word", content: "A" }]
11
+ }]
12
+ };
13
+
14
+ const manager = slideBuilder(deck);
15
+ const html = manager.renderSlide(0);
16
+
17
+ expect(html).toContain("A");
18
+ });
19
+
20
+ test("throws without words", () => {
21
+ expect(() =>
22
+ slideBuilder({
23
+ version: "deck-v1",
24
+ deck: [{ type: "cornerWordsSlide", data: [] }]
25
+ })
26
+ ).toThrow();
27
+ });
28
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { DonutChartSlide } from "../src/slides/DonutChartSlide.js";
3
+
4
+ describe("donutChart", () => {
5
+ test("builds with segments", () => {
6
+ const raw = {
7
+ type: "donutChart",
8
+ data: [
9
+ { name: "segment", content: { label: "A", value: 40 } },
10
+ { name: "segment", content: { label: "B", value: 60 } }
11
+ ]
12
+ };
13
+
14
+ const slide = DonutChartSlide.fromJSON(raw);
15
+ const html = slide.render();
16
+
17
+ expect(html).toContain("A");
18
+ expect(html).toContain("40");
19
+ expect(html).toContain("B");
20
+ expect(html).toContain("60");
21
+ });
22
+
23
+ test("throws without segments", () => {
24
+ expect(() =>
25
+ DonutChartSlide.fromJSON({ type: "donutChart", data: [] })
26
+ ).toThrow("donutChart: requires at least one segment");
27
+ });
28
+ });
@@ -0,0 +1,26 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { EqSlide } from "../src/slides/EqSlide.js";
3
+
4
+ describe("eq", () => {
5
+ test("renders equations", () => {
6
+ const raw = {
7
+ type: "eq",
8
+ data: [
9
+ { content: "a + b = c" },
10
+ { content: "x = y" }
11
+ ]
12
+ };
13
+
14
+ const slide = EqSlide.fromJSON(raw);
15
+ const html = slide.render();
16
+
17
+ expect(html).toContain("a + b = c");
18
+ expect(html).toContain("x = y");
19
+ });
20
+
21
+ test("throws if data is not array", () => {
22
+ expect(() =>
23
+ EqSlide.fromJSON({ type: "eq", data: null })
24
+ ).toThrow("eq: data must be array");
25
+ });
26
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { slideBuilder } from "../src/interpreter/slideBuilder.js";
3
+
4
+ describe("fillImage", () => {
5
+ test("builds with image", () => {
6
+ const deck = {
7
+ version: "deck-v1",
8
+ deck: [{
9
+ type: "fillImage",
10
+ data: [{ name: "image", content: "/bg.png" }]
11
+ }]
12
+ };
13
+
14
+ const manager = slideBuilder(deck);
15
+ const html = manager.renderSlide(0);
16
+
17
+ expect(html).toContain("/bg.png");
18
+ });
19
+
20
+ test("throws without image", () => {
21
+ expect(() =>
22
+ slideBuilder({
23
+ version: "deck-v1",
24
+ deck: [{ type: "fillImage", data: [] }]
25
+ })
26
+ ).toThrow();
27
+ });
28
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { ImageLeftBulletsRightSlide } from "../src/slides/ImageLeftBulletsRightSlide.js";
3
+
4
+ describe("imageLeftBulletsRight", () => {
5
+ test("builds with image and bullets", () => {
6
+ const raw = {
7
+ type: "imageLeftBulletsRight",
8
+ data: [
9
+ { name: "image", content: "img.png" },
10
+ { name: "bullet", content: "One" },
11
+ { name: "bullet", content: "Two" }
12
+ ]
13
+ };
14
+
15
+ const slide = ImageLeftBulletsRightSlide.fromJSON(raw);
16
+ const html = slide.render();
17
+
18
+ expect(html).toContain("img.png");
19
+ expect(html).toContain("One");
20
+ expect(html).toContain("Two");
21
+ });
22
+
23
+ test("throws if image or bullets missing", () => {
24
+ expect(() =>
25
+ ImageLeftBulletsRightSlide.fromJSON({ type: "imageLeftBulletsRight", data: [] })
26
+ ).toThrow("imageLeftBulletsRight: image and bullets required");
27
+ });
28
+ });
@@ -0,0 +1,26 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { ImageRightBulletsLeftSlide } from "../src/slides/ImageRightBulletsLeftSlide.js";
3
+
4
+ describe("imageRightBulletsLeft", () => {
5
+ test("builds with image and bullets", () => {
6
+ const raw = {
7
+ type: "imageRightBulletsLeft",
8
+ data: [
9
+ { name: "image", content: "img.png" },
10
+ { name: "bullet", content: "A" }
11
+ ]
12
+ };
13
+
14
+ const slide = ImageRightBulletsLeftSlide.fromJSON(raw);
15
+ const html = slide.render();
16
+
17
+ expect(html).toContain("img.png");
18
+ expect(html).toContain("A");
19
+ });
20
+
21
+ test("throws if image or bullets missing", () => {
22
+ expect(() =>
23
+ ImageRightBulletsLeftSlide.fromJSON({ type: "imageRightBulletsLeft", data: [] })
24
+ ).toThrow("imageRightBulletsLeft: image and bullets required");
25
+ });
26
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { slideBuilder } from "../src/interpreter/slideBuilder.js";
3
+
4
+ describe("imageSlide", () => {
5
+ test("builds with image", () => {
6
+ const deck = {
7
+ version: "deck-v1",
8
+ deck: [{
9
+ type: "imageSlide",
10
+ data: [{ name: "image", content: "/img.png" }]
11
+ }]
12
+ };
13
+
14
+ const manager = slideBuilder(deck);
15
+ const html = manager.renderSlide(0);
16
+
17
+ expect(html).toContain("/img.png");
18
+ });
19
+
20
+ test("throws without image", () => {
21
+ expect(() =>
22
+ slideBuilder({
23
+ version: "deck-v1",
24
+ deck: [{ type: "imageSlide", data: [] }]
25
+ })
26
+ ).toThrow();
27
+ });
28
+ });