@scrippsproduct/networks-ui-library 1.1.8 → 1.1.10-alpha.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.
- package/dist/{Form.module-Cd8qH2rj.mjs → Form.module-CarfWK5T.mjs} +1 -1
- package/dist/ResultsTable.module-wcNUQEKe.mjs +14 -0
- package/dist/_commonjsHelpers-DaMA6jEr.mjs +8 -0
- package/dist/assets/ResultsTable.css +1 -1
- package/dist/assets/ScheduleLayout.css +1 -1
- package/dist/{chevron-left-DRvpaLmK.mjs → chevron-left-D0UjbrKw.mjs} +1 -1
- package/dist/{chevron-right-C8yCnmfx.mjs → chevron-right-0ZF3LruR.mjs} +1 -1
- package/dist/components/ActionButton/ActionButton.test.js +209 -0
- package/dist/components/AdBlock/AdBlock.test.js +286 -0
- package/dist/components/AdjustableTwoColumnGrid/AdjustableTwoColumnGrid.test.js +295 -0
- package/dist/components/AirDateFormatter/AirDateFormatter.test.js +192 -0
- package/dist/components/AnchorTag/AnchorTag.test.js +463 -0
- package/dist/components/BCVideoPlayer/BCVideoPlayer.test.js +295 -0
- package/dist/components/BasicGridModule/BasicGridModule.js +41 -37
- package/dist/components/BasicGridModule/BasicGridModule.test.js +227 -0
- package/dist/components/Button/Button.test.js +434 -0
- package/dist/components/Carousel/Carousel.js +2 -2
- package/dist/components/Carousel/Carousel.test.js +705 -0
- package/dist/components/CarouselSlide/CarouselSlide.test.js +378 -0
- package/dist/components/CarouselSlide/slide-layouts/TwoColumn/TwoColumnSlide.js +1 -1
- package/dist/components/CastInfoLayout/CastInfoLayout.test.js +294 -0
- package/dist/components/ChannelSearch/ChannelSearch.test.js +565 -0
- package/dist/components/ChoicesItem/ChoicesItem.test.js +428 -0
- package/dist/components/Concat/Concat.js +1 -1
- package/dist/components/Concat/Concat.test.js +115 -0
- package/dist/components/CtaBlock/CtaBlock.js +1 -1
- package/dist/components/CtaBlock/CtaBlock.test.js +226 -0
- package/dist/components/CustomDataList/CustomDataList.js +4 -4
- package/dist/components/CustomSelect/CustomSelect.js +86 -86
- package/dist/components/CustomSelect/CustomSelect.test.js +313 -0
- package/dist/components/DateNavigation/DateNavigation.js +10 -10
- package/dist/components/DateNavigation/DateNavigation.test.js +370 -0
- package/dist/components/DatePicker/DatePicker.js +1 -1
- package/dist/components/DeviceAndPlatformLists/DeviceAndPlatformLists.test.js +288 -0
- package/dist/components/DrawerNavigation/DrawerNavigation.test.js +316 -0
- package/dist/components/EqualSizeFlexRow/EqualSizeFlexRow.test.js +337 -0
- package/dist/components/EqualSizeGrid/EqualSizeGrid.test.js +358 -0
- package/dist/components/ErrorHandler/ErrorHandler.js +2 -2
- package/dist/components/ErrorHandler/ErrorHandler.test.js +158 -0
- package/dist/components/FeaturedList/FeaturedList.test.js +353 -0
- package/dist/components/Figure/Figure.js +1 -1
- package/dist/components/Figure/Figure.test.js +198 -0
- package/dist/components/FindUs/FindUs.test.js +499 -0
- package/dist/components/FooterNavigation/FooterNavigation.test.js +310 -0
- package/dist/components/GenericList/GenericList.js +1 -1
- package/dist/components/GenericList/GenericList.test.js +288 -0
- package/dist/components/GetAirdateWrapper/GetAirdateWrapper.test.js +689 -0
- package/dist/components/GradientButton/GradientButton.d.ts +1 -1
- package/dist/components/GradientButton/GradientButton.js +33 -31
- package/dist/components/GradientButton/GradientButton.test.js +457 -0
- package/dist/components/GridList/GridList.test.js +371 -0
- package/dist/components/ImageCard/ImageCard.test.js +668 -0
- package/dist/components/ImageCard/ImageCardCore.js +28 -28
- package/dist/components/ImageCard/ImageCardCore.test.js +577 -0
- package/dist/components/ImageReplacementAnchor/ImageReplacementAnchor.test.js +379 -0
- package/dist/components/InfoPanel/InfoPanel.js +1 -1
- package/dist/components/InlineNavigation/InlineNavigation.test.js +149 -0
- package/dist/components/Input/Input.js +1 -1
- package/dist/components/Input/Input.test.js +263 -0
- package/dist/components/InstructionsList/InstructionsList.js +11 -11
- package/dist/components/InstructionsList/InstructionsList.test.js +181 -0
- package/dist/components/LogoListItem/LogoListItem.test.js +303 -0
- package/dist/components/LogoNavigation/LogoNavigation.test.js +352 -0
- package/dist/components/ModalContainer/ModalContainer.js +2 -2
- package/dist/components/NavList/NavList.test.js +332 -0
- package/dist/components/Overlay/Overlay.js +24 -23
- package/dist/components/Overlay/Overlay.test.js +198 -0
- package/dist/components/PageHero/PageHero.test.js +241 -0
- package/dist/components/PageHero/page-hero-layouts/IONShow/IONShowHero.js +1 -1
- package/dist/components/ProgramAirdate/ProgramAirdate.js +1 -1
- package/dist/components/ProgramAirdate/ProgramAirdate.test.js +414 -0
- package/dist/components/PromotionBlock/PromotionBlock.test.js +208 -0
- package/dist/components/PromotionsRowBlock/PromotionsRowBlock.test.js +221 -0
- package/dist/components/PromotionsRowModule/PromotionsRowModule.test.js +349 -0
- package/dist/components/RescanInstructions/RescanInstructions.test.js +218 -0
- package/dist/components/ResponsiveImage/ResponsiveImage.test.js +264 -0
- package/dist/components/ResultsTable/ResultsTable.js +9 -2
- package/dist/components/ResultsTable/ResultsTable.test.js +402 -0
- package/dist/components/ResultsTableBody/ResultsTableBody.js +1 -1
- package/dist/components/ResultsTableBody/ResultsTableBody.test.js +445 -0
- package/dist/components/ResultsTableHeader/ResultsTableHeader.js +37 -15
- package/dist/components/ResultsTableHeader/ResultsTableHeader.test.js +275 -0
- package/dist/components/ScheduleLayout/ScheduleContext.js +654 -626
- package/dist/components/ScheduleLayout/ScheduleLayout.js +1 -1
- package/dist/components/ScheduleLayout/useScheduleContext.js +5 -10
- package/dist/components/ScheduleList/ScheduleList.js +1 -1
- package/dist/components/SectionedContent/SectionedContent.js +1 -1
- package/dist/components/SectionedContent/SectionedContent.test.js +341 -0
- package/dist/components/Select/Select.js +24 -24
- package/dist/components/Select/Select.test.js +367 -0
- package/dist/components/ShowAboutContent/ShowAboutContent.js +1 -1
- package/dist/components/ShowAboutContent/ShowAboutContent.test.js +535 -0
- package/dist/components/ShowAboutLayout/ShowAboutLayout.test.js +570 -0
- package/dist/components/SocialLinks/SocialLinks.js +1 -1
- package/dist/components/StringList/StringList.js +1 -1
- package/dist/components/StringList/StringList.test.js +311 -0
- package/dist/components/TabContent/TabContent.js +1 -1
- package/dist/components/TabContent/TabContent.test.js +274 -0
- package/dist/components/TabNavigation/TabNavigation.js +21 -21
- package/dist/components/TabNavigation/TabNavigation.test.js +535 -0
- package/dist/components/TabbedContent/TabbedContent.test.js +654 -0
- package/dist/components/TextArea/TextArea.js +1 -1
- package/dist/components/UpcomingList/UpcomingList.test.js +471 -0
- package/dist/{index-VjANCDXC.mjs → index-06PEPfBQ.mjs} +1 -1
- package/dist/index-BUN4jQ3m.mjs +3098 -0
- package/dist/index-BVxBrkZB.mjs +3 -0
- package/dist/{index-DC2JJV3a.mjs → index-D3kkcgee.mjs} +1 -1
- package/dist/{index-C-kn9Zhn.mjs → index-DzfYkULW.mjs} +2 -1
- package/dist/magic-string.es-uPKorP4O.mjs +663 -0
- package/dist/matchers-35e4d3bd-BBPNTlen.mjs +2404 -0
- package/dist/react.esm-DLSrfVwM.mjs +23410 -0
- package/dist/test/setupTests.d.ts +1 -0
- package/dist/test/setupTests.js +55 -0
- package/dist/{triangle-PcCcGXjr.mjs → triangle-C4z906Wf.mjs} +1 -1
- package/dist/useScheduleContext-D7FdzNxe.mjs +17 -0
- package/dist/utils/analytics.js +1 -1
- package/dist/utils/getOnNowProgram.js +10 -10
- package/dist/{x-C-QzJ-qD.mjs → x-Ck9Vk5Fo.mjs} +1 -1
- package/package.json +4 -1
- package/dist/ResultsTable.module-1zxhXaem.mjs +0 -14
- package/dist/_commonjsHelpers-C6fGbg64.mjs +0 -6
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { jsx as s, jsxs as B } from "react/jsx-runtime";
|
|
2
|
+
import { v as h, d as m, b as C, a as v, i as l, r as c, g as a, s as n, w as u } from "../../react.esm-DLSrfVwM.mjs";
|
|
3
|
+
import "../../index-BVxBrkZB.mjs";
|
|
4
|
+
import { PromotionsRowModule as r } from "./PromotionsRowModule.js";
|
|
5
|
+
h.mock("../PromotionsRowBlock", () => ({
|
|
6
|
+
default: ({ children: o, gap: e }) => /* @__PURE__ */ s("div", { "data-gap": e, "data-testid": "promotions-row-block", children: o })
|
|
7
|
+
}));
|
|
8
|
+
h.mock("../ImageCard", () => ({
|
|
9
|
+
default: ({ image: o, title: e, content: i, cta: p, relatedResourceId: y, classname: T, overlayContent: I }) => /* @__PURE__ */ B(
|
|
10
|
+
"div",
|
|
11
|
+
{
|
|
12
|
+
"data-classname": T,
|
|
13
|
+
"data-content": i,
|
|
14
|
+
"data-cta-text": p == null ? void 0 : p.label,
|
|
15
|
+
"data-image-url": o.url,
|
|
16
|
+
"data-related-id": y,
|
|
17
|
+
"data-testid": "image-card",
|
|
18
|
+
"data-title": e,
|
|
19
|
+
children: [
|
|
20
|
+
"ImageCard: ",
|
|
21
|
+
e,
|
|
22
|
+
I
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
}));
|
|
27
|
+
h.mock("../Carousel", () => ({
|
|
28
|
+
default: ({ cells: o, id: e }) => /* @__PURE__ */ B("div", { "data-cells-count": o.length, "data-id": e, "data-testid": "carousel", children: [
|
|
29
|
+
"Carousel with ",
|
|
30
|
+
o.length,
|
|
31
|
+
" cells"
|
|
32
|
+
] })
|
|
33
|
+
}));
|
|
34
|
+
h.mock("../CtaBlock", () => ({
|
|
35
|
+
default: ({ title: o, cta: e }) => /* @__PURE__ */ B("div", { "data-cta-text": e == null ? void 0 : e.label, "data-testid": "cta-block", "data-title": o, children: [
|
|
36
|
+
"CtaBlock: ",
|
|
37
|
+
o
|
|
38
|
+
] })
|
|
39
|
+
}));
|
|
40
|
+
h.mock("./PromotionRowBlock.scss", () => ({}));
|
|
41
|
+
h.mock("../../utils/helpers", () => ({
|
|
42
|
+
classes: (o) => o.join(" ")
|
|
43
|
+
}));
|
|
44
|
+
const g = {
|
|
45
|
+
url: "https://example.com/image1.jpg",
|
|
46
|
+
altText: "Promo Image 1",
|
|
47
|
+
aspectRatio: 16 / 9
|
|
48
|
+
}, d = {
|
|
49
|
+
label: "Learn More",
|
|
50
|
+
href: "https://example.com/promo1",
|
|
51
|
+
type: "external-link"
|
|
52
|
+
}, t = (o, e) => ({
|
|
53
|
+
id: o,
|
|
54
|
+
title: `Promo ${o}`,
|
|
55
|
+
content: `Content ${o}`,
|
|
56
|
+
image: g,
|
|
57
|
+
cta: d,
|
|
58
|
+
...e
|
|
59
|
+
});
|
|
60
|
+
m("PromotionsRowModule", () => {
|
|
61
|
+
C(() => {
|
|
62
|
+
h.clearAllMocks();
|
|
63
|
+
}), v(() => {
|
|
64
|
+
h.clearAllMocks();
|
|
65
|
+
}), m("Basic Rendering", () => {
|
|
66
|
+
l("should render section with promotions-row class", () => {
|
|
67
|
+
const o = [t("1")], { container: e } = c(/* @__PURE__ */ s(r, { promos: o })), i = e.querySelector("section.promotions-row");
|
|
68
|
+
a(i).toBeInTheDocument();
|
|
69
|
+
}), l("should render title when provided", () => {
|
|
70
|
+
const o = [t("1")];
|
|
71
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Special Offers" })), a(n.getByRole("heading", { name: "Special Offers" })).toBeInTheDocument();
|
|
72
|
+
}), l("should render title as h2 element", () => {
|
|
73
|
+
const o = [t("1")];
|
|
74
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Special Offers" }));
|
|
75
|
+
const e = n.getByRole("heading", { name: "Special Offers", level: 2 });
|
|
76
|
+
a(e).toBeInTheDocument();
|
|
77
|
+
}), l("should apply correct classes to title", () => {
|
|
78
|
+
const o = [t("1")];
|
|
79
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Special Offers" }));
|
|
80
|
+
const e = n.getByRole("heading", { name: "Special Offers" });
|
|
81
|
+
a(e).toHaveClass("h2", "promotions-row__header");
|
|
82
|
+
}), l("should render empty title when not provided", () => {
|
|
83
|
+
const o = [t("1")], { container: e } = c(/* @__PURE__ */ s(r, { promos: o })), i = e.querySelector("h2");
|
|
84
|
+
a(i).toHaveTextContent("");
|
|
85
|
+
});
|
|
86
|
+
}), m("PromotionsRowBlock Rendering (≤4 promos)", () => {
|
|
87
|
+
l("should render PromotionsRowBlock with single promo", () => {
|
|
88
|
+
const o = [t("1")];
|
|
89
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getByTestId("promotions-row-block")).toBeInTheDocument();
|
|
90
|
+
}), l("should render PromotionsRowBlock with 2 promos", () => {
|
|
91
|
+
const o = [t("1"), t("2")];
|
|
92
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getByTestId("promotions-row-block")).toBeInTheDocument();
|
|
93
|
+
}), l("should render PromotionsRowBlock with exactly 4 promos", () => {
|
|
94
|
+
const o = [
|
|
95
|
+
t("1"),
|
|
96
|
+
t("2"),
|
|
97
|
+
t("3"),
|
|
98
|
+
t("4")
|
|
99
|
+
];
|
|
100
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getByTestId("promotions-row-block")).toBeInTheDocument();
|
|
101
|
+
}), l("should apply 2rem gap to PromotionsRowBlock", () => {
|
|
102
|
+
const o = [t("1")];
|
|
103
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
104
|
+
const e = n.getByTestId("promotions-row-block");
|
|
105
|
+
a(e).toHaveAttribute("data-gap", "2rem");
|
|
106
|
+
}), l("should not render Carousel when promos ≤ 4", () => {
|
|
107
|
+
const o = [
|
|
108
|
+
t("1"),
|
|
109
|
+
t("2"),
|
|
110
|
+
t("3"),
|
|
111
|
+
t("4")
|
|
112
|
+
];
|
|
113
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.queryByTestId("carousel")).not.toBeInTheDocument();
|
|
114
|
+
});
|
|
115
|
+
}), m("Carousel Rendering (>4 promos)", () => {
|
|
116
|
+
l("should render Carousel when promos > 4", async () => {
|
|
117
|
+
const o = [
|
|
118
|
+
t("1"),
|
|
119
|
+
t("2"),
|
|
120
|
+
t("3"),
|
|
121
|
+
t("4"),
|
|
122
|
+
t("5")
|
|
123
|
+
];
|
|
124
|
+
c(/* @__PURE__ */ s(r, { promos: o })), await u(() => {
|
|
125
|
+
a(n.getByTestId("carousel")).toBeInTheDocument();
|
|
126
|
+
});
|
|
127
|
+
}), l("should render h1 title for carousel view", async () => {
|
|
128
|
+
const o = Array.from({ length: 5 }, (e, i) => t(`${i + 1}`));
|
|
129
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Carousel Title" })), await u(() => {
|
|
130
|
+
const e = n.getByRole("heading", { name: "Carousel Title", level: 1 });
|
|
131
|
+
a(e).toBeInTheDocument();
|
|
132
|
+
});
|
|
133
|
+
}), l("should apply h3 class to carousel title", async () => {
|
|
134
|
+
const o = Array.from({ length: 5 }, (e, i) => t(`${i + 1}`));
|
|
135
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Carousel Title" })), await u(() => {
|
|
136
|
+
const e = n.getByRole("heading", { name: "Carousel Title" });
|
|
137
|
+
a(e).toHaveClass("h3", "promotions-row__header");
|
|
138
|
+
});
|
|
139
|
+
}), l("should not render PromotionsRowBlock when carousel is shown", async () => {
|
|
140
|
+
const o = Array.from({ length: 5 }, (e, i) => t(`${i + 1}`));
|
|
141
|
+
c(/* @__PURE__ */ s(r, { promos: o })), await u(() => {
|
|
142
|
+
a(n.getByTestId("carousel")).toBeInTheDocument();
|
|
143
|
+
}), a(n.queryByTestId("promotions-row-block")).not.toBeInTheDocument();
|
|
144
|
+
}), l("should pass correct number of cells to Carousel", async () => {
|
|
145
|
+
const o = Array.from({ length: 6 }, (e, i) => t(`${i + 1}`));
|
|
146
|
+
c(/* @__PURE__ */ s(r, { promos: o })), await u(() => {
|
|
147
|
+
const e = n.getByTestId("carousel");
|
|
148
|
+
a(e).toHaveAttribute("data-cells-count", "6");
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}), m("ImageCard Rendering", () => {
|
|
152
|
+
l("should render ImageCard for each promo", () => {
|
|
153
|
+
const o = [
|
|
154
|
+
t("1"),
|
|
155
|
+
t("2"),
|
|
156
|
+
t("3")
|
|
157
|
+
];
|
|
158
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
159
|
+
const e = n.getAllByTestId("image-card");
|
|
160
|
+
a(e).toHaveLength(3);
|
|
161
|
+
}), l("should pass image prop to ImageCard", () => {
|
|
162
|
+
const o = [t("1")];
|
|
163
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
164
|
+
const e = n.getByTestId("image-card");
|
|
165
|
+
a(e).toHaveAttribute("data-image-url", g.url);
|
|
166
|
+
}), l("should pass title prop to ImageCard", () => {
|
|
167
|
+
const o = [t("1", { title: "Special Promo" })];
|
|
168
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
169
|
+
const e = n.getByTestId("image-card");
|
|
170
|
+
a(e).toHaveAttribute("data-title", "Special Promo");
|
|
171
|
+
}), l("should pass content prop to ImageCard", () => {
|
|
172
|
+
const o = [t("1", { content: "Special content" })];
|
|
173
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
174
|
+
const e = n.getByTestId("image-card");
|
|
175
|
+
a(e).toHaveAttribute("data-content", "Special content");
|
|
176
|
+
}), l("should pass cta prop to ImageCard", () => {
|
|
177
|
+
const o = [t("1")];
|
|
178
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
179
|
+
const e = n.getByTestId("image-card");
|
|
180
|
+
a(e).toHaveAttribute("data-cta-text", d.label);
|
|
181
|
+
}), l("should pass relatedResourceId to ImageCard", () => {
|
|
182
|
+
const o = [t("test-id-123")];
|
|
183
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
184
|
+
const e = n.getByTestId("image-card");
|
|
185
|
+
a(e).toHaveAttribute("data-related-id", "test-id-123");
|
|
186
|
+
}), l("should pass classname to ImageCard when provided", () => {
|
|
187
|
+
const o = [t("1", { classname: "custom-class" })];
|
|
188
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
189
|
+
const e = n.getByTestId("image-card");
|
|
190
|
+
a(e).toHaveAttribute("data-classname", "custom-class");
|
|
191
|
+
});
|
|
192
|
+
}), m("CtaBlock Overlay Content", () => {
|
|
193
|
+
l("should not render CtaBlock when overlayContent is not provided", () => {
|
|
194
|
+
const o = [t("1")];
|
|
195
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.queryByTestId("cta-block")).not.toBeInTheDocument();
|
|
196
|
+
}), l("should render CtaBlock when overlayContent is provided", () => {
|
|
197
|
+
const o = [t("1", {
|
|
198
|
+
overlayContent: {
|
|
199
|
+
title: "Overlay Title",
|
|
200
|
+
content: "Overlay Content",
|
|
201
|
+
cta: d
|
|
202
|
+
}
|
|
203
|
+
})];
|
|
204
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getByTestId("cta-block")).toBeInTheDocument();
|
|
205
|
+
}), l("should pass overlayContent title to CtaBlock", () => {
|
|
206
|
+
const o = [t("1", {
|
|
207
|
+
overlayContent: {
|
|
208
|
+
title: "Overlay Title",
|
|
209
|
+
cta: d
|
|
210
|
+
}
|
|
211
|
+
})];
|
|
212
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
213
|
+
const e = n.getByTestId("cta-block");
|
|
214
|
+
a(e).toHaveAttribute("data-title", "Overlay Title");
|
|
215
|
+
}), l("should pass overlayContent cta to CtaBlock", () => {
|
|
216
|
+
const o = [t("1", {
|
|
217
|
+
overlayContent: {
|
|
218
|
+
cta: d
|
|
219
|
+
}
|
|
220
|
+
})];
|
|
221
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
222
|
+
const e = n.getByTestId("cta-block");
|
|
223
|
+
a(e).toHaveAttribute("data-cta-text", d.label);
|
|
224
|
+
}), l("should render multiple CtaBlocks for multiple promos with overlayContent", () => {
|
|
225
|
+
const o = [
|
|
226
|
+
t("1", { overlayContent: { title: "Overlay 1", cta: d } }),
|
|
227
|
+
t("2", { overlayContent: { title: "Overlay 2", cta: d } }),
|
|
228
|
+
t("3", { overlayContent: { title: "Overlay 3", cta: d } })
|
|
229
|
+
];
|
|
230
|
+
c(/* @__PURE__ */ s(r, { promos: o }));
|
|
231
|
+
const e = n.getAllByTestId("cta-block");
|
|
232
|
+
a(e).toHaveLength(3);
|
|
233
|
+
});
|
|
234
|
+
}), m("HandleClicks Prop", () => {
|
|
235
|
+
l("should use provided handleClicks function", () => {
|
|
236
|
+
const o = h.fn(), e = [t("1")];
|
|
237
|
+
c(/* @__PURE__ */ s(r, { handleClicks: o, promos: e })), a(n.getByTestId("image-card")).toBeInTheDocument();
|
|
238
|
+
}), l("should use default handleClicks when not provided", () => {
|
|
239
|
+
const o = [t("1")];
|
|
240
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getByTestId("image-card")).toBeInTheDocument();
|
|
241
|
+
}), l("should use default handleClicks when null", () => {
|
|
242
|
+
const o = [t("1")];
|
|
243
|
+
c(/* @__PURE__ */ s(r, { handleClicks: null, promos: o })), a(n.getByTestId("image-card")).toBeInTheDocument();
|
|
244
|
+
});
|
|
245
|
+
}), m("Edge Cases", () => {
|
|
246
|
+
l("should handle empty promos array", () => {
|
|
247
|
+
const { container: o } = c(/* @__PURE__ */ s(r, { promos: [] })), e = o.querySelector("section.promotions-row");
|
|
248
|
+
a(e).toBeInTheDocument();
|
|
249
|
+
}), l("should handle promos without optional fields", () => {
|
|
250
|
+
c(/* @__PURE__ */ s(r, { promos: [{
|
|
251
|
+
id: "1",
|
|
252
|
+
image: g
|
|
253
|
+
}] })), a(n.getByTestId("image-card")).toBeInTheDocument();
|
|
254
|
+
}), l("should handle very long title", () => {
|
|
255
|
+
const o = "This is a very long title ".repeat(10).trim(), e = [t("1")], { container: i } = c(/* @__PURE__ */ s(r, { promos: e, title: o })), p = i.querySelector("h2");
|
|
256
|
+
a(p).toHaveTextContent(o);
|
|
257
|
+
}), l("should handle special characters in title", () => {
|
|
258
|
+
const o = 'Special & "Quoted" Title <test>', e = [t("1")];
|
|
259
|
+
c(/* @__PURE__ */ s(r, { promos: e, title: o })), a(n.getByRole("heading", { name: o })).toBeInTheDocument();
|
|
260
|
+
}), l("should handle many promos (>10)", async () => {
|
|
261
|
+
const o = Array.from({ length: 15 }, (e, i) => t(`${i + 1}`));
|
|
262
|
+
c(/* @__PURE__ */ s(r, { promos: o })), await u(() => {
|
|
263
|
+
const e = n.getByTestId("carousel");
|
|
264
|
+
a(e).toHaveAttribute("data-cells-count", "15");
|
|
265
|
+
});
|
|
266
|
+
}), l("should handle promos with undefined overlayContent properties", () => {
|
|
267
|
+
const o = [t("1", {
|
|
268
|
+
overlayContent: {
|
|
269
|
+
title: void 0,
|
|
270
|
+
content: void 0,
|
|
271
|
+
cta: void 0
|
|
272
|
+
}
|
|
273
|
+
})];
|
|
274
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getByTestId("cta-block")).toBeInTheDocument();
|
|
275
|
+
});
|
|
276
|
+
}), m("Conditional Rendering Logic", () => {
|
|
277
|
+
l("should switch from PromotionsRowBlock to Carousel when promos increase", async () => {
|
|
278
|
+
const { rerender: o } = c(/* @__PURE__ */ s(r, { promos: [t("1")] }));
|
|
279
|
+
a(n.getByTestId("promotions-row-block")).toBeInTheDocument();
|
|
280
|
+
const e = Array.from({ length: 5 }, (i, p) => t(`${p + 1}`));
|
|
281
|
+
o(/* @__PURE__ */ s(r, { promos: e })), await u(() => {
|
|
282
|
+
a(n.getByTestId("carousel")).toBeInTheDocument();
|
|
283
|
+
}), a(n.queryByTestId("promotions-row-block")).not.toBeInTheDocument();
|
|
284
|
+
}), l("should render section element for PromotionsRowBlock view", () => {
|
|
285
|
+
const o = [t("1")], { container: e } = c(/* @__PURE__ */ s(r, { promos: o })), i = e.querySelector("section");
|
|
286
|
+
a(i).toBeInTheDocument();
|
|
287
|
+
}), l("should not render section element for Carousel view", async () => {
|
|
288
|
+
const o = Array.from({ length: 5 }, (p, y) => t(`${y + 1}`)), { container: e } = c(/* @__PURE__ */ s(r, { promos: o }));
|
|
289
|
+
await u(() => {
|
|
290
|
+
a(n.getByTestId("carousel")).toBeInTheDocument();
|
|
291
|
+
});
|
|
292
|
+
const i = e.querySelector("section");
|
|
293
|
+
a(i).not.toBeInTheDocument();
|
|
294
|
+
});
|
|
295
|
+
}), m("Integration", () => {
|
|
296
|
+
l("should render complete module with all elements", () => {
|
|
297
|
+
const o = [
|
|
298
|
+
t("1", {
|
|
299
|
+
title: "Promo 1",
|
|
300
|
+
content: "Content 1",
|
|
301
|
+
overlayContent: { title: "Overlay 1", cta: d }
|
|
302
|
+
}),
|
|
303
|
+
t("2", {
|
|
304
|
+
title: "Promo 2",
|
|
305
|
+
content: "Content 2"
|
|
306
|
+
})
|
|
307
|
+
];
|
|
308
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Test Module" })), a(n.getByRole("heading", { name: "Test Module" })).toBeInTheDocument(), a(n.getByTestId("promotions-row-block")).toBeInTheDocument(), a(n.getAllByTestId("image-card")).toHaveLength(2), a(n.getByTestId("cta-block")).toBeInTheDocument();
|
|
309
|
+
}), l("should render carousel with all promos when count > 4", async () => {
|
|
310
|
+
const o = Array.from(
|
|
311
|
+
{ length: 8 },
|
|
312
|
+
(e, i) => t(`${i + 1}`, { title: `Promo ${i + 1}` })
|
|
313
|
+
);
|
|
314
|
+
c(/* @__PURE__ */ s(r, { promos: o, title: "Carousel Module" })), await u(() => {
|
|
315
|
+
a(n.getByRole("heading", { name: "Carousel Module", level: 1 })).toBeInTheDocument();
|
|
316
|
+
const e = n.getByTestId("carousel");
|
|
317
|
+
a(e).toHaveAttribute("data-cells-count", "8");
|
|
318
|
+
});
|
|
319
|
+
}), l("should handle mix of promos with and without overlayContent", () => {
|
|
320
|
+
const o = [
|
|
321
|
+
t("1", { overlayContent: { title: "Overlay 1", cta: d } }),
|
|
322
|
+
t("2"),
|
|
323
|
+
t("3", { overlayContent: { title: "Overlay 3", cta: d } })
|
|
324
|
+
];
|
|
325
|
+
c(/* @__PURE__ */ s(r, { promos: o })), a(n.getAllByTestId("image-card")).toHaveLength(3), a(n.getAllByTestId("cta-block")).toHaveLength(2);
|
|
326
|
+
});
|
|
327
|
+
}), m("Type Safety", () => {
|
|
328
|
+
l("should accept valid Promo array", () => {
|
|
329
|
+
c(/* @__PURE__ */ s(r, { promos: [
|
|
330
|
+
{
|
|
331
|
+
id: "1",
|
|
332
|
+
title: "Promo 1",
|
|
333
|
+
content: "Content 1",
|
|
334
|
+
image: g,
|
|
335
|
+
cta: d
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
id: "2",
|
|
339
|
+
image: g
|
|
340
|
+
}
|
|
341
|
+
] })), a(n.getAllByTestId("image-card")).toHaveLength(2);
|
|
342
|
+
}), l("should accept handleClicks function with correct signature", () => {
|
|
343
|
+
const o = (i) => {
|
|
344
|
+
console.warn(i);
|
|
345
|
+
}, e = [t("1")];
|
|
346
|
+
c(/* @__PURE__ */ s(r, { handleClicks: o, promos: e })), a(n.getByTestId("image-card")).toBeInTheDocument();
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
});
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { jsxs as h, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { v as d, d as c, b as m, i as s, r as o, g as n, s as a } from "../../react.esm-DLSrfVwM.mjs";
|
|
3
|
+
import { RescanInstructions as i } from "./RescanInstructions.js";
|
|
4
|
+
d.mock("../InstructionsList", () => ({
|
|
5
|
+
default: ({ headerHtml: t, instructions: r }) => /* @__PURE__ */ h(
|
|
6
|
+
"div",
|
|
7
|
+
{
|
|
8
|
+
"data-header-html": t,
|
|
9
|
+
"data-instructions-count": r.length,
|
|
10
|
+
"data-testid": "instructions-list",
|
|
11
|
+
children: [
|
|
12
|
+
/* @__PURE__ */ e("div", { "data-testid": "header-html", children: t }),
|
|
13
|
+
/* @__PURE__ */ e("ul", { children: r.map(
|
|
14
|
+
(u, l) => /* @__PURE__ */ e("li", { "data-testid": `instruction-${l}`, children: u }, l)
|
|
15
|
+
) })
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
)
|
|
19
|
+
}));
|
|
20
|
+
d.mock("./RescanInstructions.module.scss", () => ({
|
|
21
|
+
default: {
|
|
22
|
+
"rescan-instructions": "rescan-instructions-module",
|
|
23
|
+
rescan__header: "rescan-header-module"
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
c("RescanInstructions", () => {
|
|
27
|
+
m(() => {
|
|
28
|
+
d.clearAllMocks();
|
|
29
|
+
}), c("Basic Rendering", () => {
|
|
30
|
+
s("should render section element", () => {
|
|
31
|
+
const { container: t } = o(/* @__PURE__ */ e(i, {})), r = t.querySelector("section");
|
|
32
|
+
n(r).toBeInTheDocument();
|
|
33
|
+
}), s("should apply correct classes to section", () => {
|
|
34
|
+
const { container: t } = o(/* @__PURE__ */ e(i, {})), r = t.querySelector("section");
|
|
35
|
+
n(r).toHaveClass("rescan-instructions-module", "rescan-instructions");
|
|
36
|
+
}), s("should render h3 header", () => {
|
|
37
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
38
|
+
const t = a.getByRole("heading", { level: 3, name: "LEARN HOW TO RESCAN" });
|
|
39
|
+
n(t).toBeInTheDocument();
|
|
40
|
+
}), s("should apply correct classes to header", () => {
|
|
41
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
42
|
+
const t = a.getByRole("heading", { level: 3 });
|
|
43
|
+
n(t).toHaveClass("rescan-header-module", "rescan__header");
|
|
44
|
+
}), s("should render exactly two InstructionsList components", () => {
|
|
45
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
46
|
+
const t = a.getAllByTestId("instructions-list");
|
|
47
|
+
n(t).toHaveLength(2);
|
|
48
|
+
});
|
|
49
|
+
}), c("BrandName Prop", () => {
|
|
50
|
+
s("should use brandName in first InstructionsList header when provided", () => {
|
|
51
|
+
o(/* @__PURE__ */ e(i, { brandName: "NBC" }));
|
|
52
|
+
const t = a.getAllByTestId("instructions-list");
|
|
53
|
+
n(t[0]).toHaveAttribute(
|
|
54
|
+
"data-header-html",
|
|
55
|
+
"Watching NBC with an antenna? You may need to rescan your TV."
|
|
56
|
+
);
|
|
57
|
+
}), s("should handle empty brandName in header", () => {
|
|
58
|
+
o(/* @__PURE__ */ e(i, { brandName: "" }));
|
|
59
|
+
const t = a.getAllByTestId("instructions-list");
|
|
60
|
+
n(t[0]).toHaveAttribute(
|
|
61
|
+
"data-header-html",
|
|
62
|
+
"Watching with an antenna? You may need to rescan your TV."
|
|
63
|
+
);
|
|
64
|
+
}), s("should use empty string as default brandName", () => {
|
|
65
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
66
|
+
const t = a.getAllByTestId("instructions-list");
|
|
67
|
+
n(t[0]).toHaveAttribute(
|
|
68
|
+
"data-header-html",
|
|
69
|
+
"Watching with an antenna? You may need to rescan your TV."
|
|
70
|
+
);
|
|
71
|
+
}), s("should handle special characters in brandName", () => {
|
|
72
|
+
o(/* @__PURE__ */ e(i, { brandName: "ABC & XYZ" }));
|
|
73
|
+
const t = a.getAllByTestId("instructions-list");
|
|
74
|
+
n(t[0]).toHaveAttribute(
|
|
75
|
+
"data-header-html",
|
|
76
|
+
"Watching ABC & XYZ with an antenna? You may need to rescan your TV."
|
|
77
|
+
);
|
|
78
|
+
}), s("should handle very long brandName", () => {
|
|
79
|
+
const t = "This is a Very Long Brand Name Network".repeat(3);
|
|
80
|
+
o(/* @__PURE__ */ e(i, { brandName: t }));
|
|
81
|
+
const u = a.getAllByTestId("instructions-list")[0].getAttribute("data-header-html");
|
|
82
|
+
n(u).toContain(t);
|
|
83
|
+
});
|
|
84
|
+
}), c("First InstructionsList (Basic Rescan)", () => {
|
|
85
|
+
s("should pass correct headerHtml to first InstructionsList", () => {
|
|
86
|
+
o(/* @__PURE__ */ e(i, { brandName: "FOX" }));
|
|
87
|
+
const t = a.getAllByTestId("instructions-list");
|
|
88
|
+
n(t[0]).toHaveAttribute(
|
|
89
|
+
"data-header-html",
|
|
90
|
+
"Watching FOX with an antenna? You may need to rescan your TV."
|
|
91
|
+
);
|
|
92
|
+
}), s("should pass 5 instructions to first InstructionsList", () => {
|
|
93
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
94
|
+
const t = a.getAllByTestId("instructions-list");
|
|
95
|
+
n(t[0]).toHaveAttribute("data-instructions-count", "5");
|
|
96
|
+
}), s("should include Menu button instruction", () => {
|
|
97
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
98
|
+
const t = a.getByText(/Press the.*Menu.*button/i);
|
|
99
|
+
n(t).toBeInTheDocument();
|
|
100
|
+
}), s("should include Setup or Settings instruction", () => {
|
|
101
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
102
|
+
const t = a.getByText(/Go to.*Setup.*or.*Settings/i);
|
|
103
|
+
n(t).toBeInTheDocument();
|
|
104
|
+
}), s("should include Installation/System/Channels instruction", () => {
|
|
105
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
106
|
+
const t = a.getByText(/Go to.*Installation.*or.*System.*or.*Channels/i);
|
|
107
|
+
n(t).toBeInTheDocument();
|
|
108
|
+
}), s("should include Scan Channels instruction", () => {
|
|
109
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
110
|
+
const t = a.getByText(/Go to.*Scan Channels.*or.*Program Channels/i);
|
|
111
|
+
n(t).toBeInTheDocument();
|
|
112
|
+
}), s("should include Select/Enter/OK instruction", () => {
|
|
113
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
114
|
+
const t = a.getByText(/Press.*Select.*or.*Enter.*or.*OK.*to scan/i);
|
|
115
|
+
n(t).toBeInTheDocument();
|
|
116
|
+
});
|
|
117
|
+
}), c("Second InstructionsList (Double Rescan)", () => {
|
|
118
|
+
s("should pass correct headerHtml to second InstructionsList", () => {
|
|
119
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
120
|
+
const t = a.getAllByTestId("instructions-list");
|
|
121
|
+
n(t[1]).toHaveAttribute(
|
|
122
|
+
"data-header-html",
|
|
123
|
+
"Sometimes, a double rescan is needed to clear the memory of your Digital TV or Converter Box:"
|
|
124
|
+
);
|
|
125
|
+
}), s("should pass 5 instructions to second InstructionsList", () => {
|
|
126
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
127
|
+
const t = a.getAllByTestId("instructions-list");
|
|
128
|
+
n(t[1]).toHaveAttribute("data-instructions-count", "5");
|
|
129
|
+
}), s("should include disconnect antenna instruction", () => {
|
|
130
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
131
|
+
const t = a.getByText(/Disconnect the antenna from the Digital TV/i);
|
|
132
|
+
n(t).toBeInTheDocument();
|
|
133
|
+
}), s("should include rescan without antenna instruction", () => {
|
|
134
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
135
|
+
const t = a.getByText(/Rescan without the antenna connected/i);
|
|
136
|
+
n(t).toBeInTheDocument();
|
|
137
|
+
}), s("should include unplug for one minute instruction", () => {
|
|
138
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
139
|
+
const t = a.getByText(/Unplug the Digital TV or Converter Box from the electrical outlet for one minute/i);
|
|
140
|
+
n(t).toBeInTheDocument();
|
|
141
|
+
}), s("should include reconnect antenna instruction", () => {
|
|
142
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
143
|
+
const t = a.getByText(/Reconnect the antenna to the Digital TV or Converter Box/i);
|
|
144
|
+
n(t).toBeInTheDocument();
|
|
145
|
+
}), s("should include final rescan instruction", () => {
|
|
146
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
147
|
+
const t = a.getByText(/Rescan the Digital TV or Converter Box one more time/i);
|
|
148
|
+
n(t).toBeInTheDocument();
|
|
149
|
+
});
|
|
150
|
+
}), c("Instructions Content Verification", () => {
|
|
151
|
+
s("should pass first set of instructions with HTML tags", () => {
|
|
152
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
153
|
+
const r = a.getAllByTestId(/^instruction-/).slice(0, 5);
|
|
154
|
+
n(r[0]).toHaveTextContent("Press the <strong>Menu</strong> button"), n(r[1]).toHaveTextContent("Go to <strong>Setup</strong> or <strong>Settings</strong>"), n(r[2]).toHaveTextContent("Go to <strong>Installation</strong>"), n(r[3]).toHaveTextContent("Go to <strong>Scan Channels</strong>"), n(r[4]).toHaveTextContent("Press <strong>Select</strong>");
|
|
155
|
+
}), s("should pass second set of instructions with escaped apostrophe", () => {
|
|
156
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
157
|
+
const r = a.getAllByTestId(/^instruction-/).slice(5, 10);
|
|
158
|
+
n(r[0]).toHaveTextContent("Disconnect the antenna"), n(r[1]).toHaveTextContent("owner's manual"), n(r[2]).toHaveTextContent("Unplug the Digital TV"), n(r[3]).toHaveTextContent("Reconnect the antenna"), n(r[4]).toHaveTextContent("Rescan the Digital TV or Converter Box one more time");
|
|
159
|
+
});
|
|
160
|
+
}), c("Integration", () => {
|
|
161
|
+
s("should render complete module with all elements", () => {
|
|
162
|
+
const { container: t } = o(/* @__PURE__ */ e(i, { brandName: "CBS" })), r = t.querySelector("section");
|
|
163
|
+
n(r).toBeInTheDocument(), n(a.getByRole("heading", { level: 3 })).toBeInTheDocument();
|
|
164
|
+
const u = a.getAllByTestId("instructions-list");
|
|
165
|
+
n(u).toHaveLength(2), n(u[0]).toHaveAttribute(
|
|
166
|
+
"data-header-html",
|
|
167
|
+
"Watching CBS with an antenna? You may need to rescan your TV."
|
|
168
|
+
), n(u[1]).toHaveAttribute(
|
|
169
|
+
"data-header-html",
|
|
170
|
+
"Sometimes, a double rescan is needed to clear the memory of your Digital TV or Converter Box:"
|
|
171
|
+
);
|
|
172
|
+
const l = a.getAllByTestId(/^instruction-/);
|
|
173
|
+
n(l).toHaveLength(10);
|
|
174
|
+
}), s("should maintain instruction order", () => {
|
|
175
|
+
o(/* @__PURE__ */ e(i, {}));
|
|
176
|
+
const t = a.getAllByTestId(/^instruction-/);
|
|
177
|
+
n(t[0]).toHaveTextContent("Menu"), n(t[5]).toHaveTextContent("Disconnect the antenna");
|
|
178
|
+
});
|
|
179
|
+
}), c("Type Safety", () => {
|
|
180
|
+
s("should accept valid brandName string", () => {
|
|
181
|
+
n(() => o(/* @__PURE__ */ e(i, { brandName: "NBC" }))).not.toThrow();
|
|
182
|
+
}), s("should accept undefined brandName", () => {
|
|
183
|
+
n(() => o(/* @__PURE__ */ e(i, { brandName: void 0 }))).not.toThrow();
|
|
184
|
+
}), s("should render without any props", () => {
|
|
185
|
+
n(() => o(/* @__PURE__ */ e(i, {}))).not.toThrow();
|
|
186
|
+
});
|
|
187
|
+
}), c("Edge Cases", () => {
|
|
188
|
+
s("should handle brandName with numbers", () => {
|
|
189
|
+
o(/* @__PURE__ */ e(i, { brandName: "Channel 7" }));
|
|
190
|
+
const t = a.getAllByTestId("instructions-list");
|
|
191
|
+
n(t[0]).toHaveAttribute(
|
|
192
|
+
"data-header-html",
|
|
193
|
+
"Watching Channel 7 with an antenna? You may need to rescan your TV."
|
|
194
|
+
);
|
|
195
|
+
}), s("should handle brandName with hyphens", () => {
|
|
196
|
+
o(/* @__PURE__ */ e(i, { brandName: "NBC-TV" }));
|
|
197
|
+
const t = a.getAllByTestId("instructions-list");
|
|
198
|
+
n(t[0]).toHaveAttribute(
|
|
199
|
+
"data-header-html",
|
|
200
|
+
"Watching NBC-TV with an antenna? You may need to rescan your TV."
|
|
201
|
+
);
|
|
202
|
+
}), s("should handle brandName with unicode characters", () => {
|
|
203
|
+
o(/* @__PURE__ */ e(i, { brandName: "Telemundo™" }));
|
|
204
|
+
const t = a.getAllByTestId("instructions-list");
|
|
205
|
+
n(t[0]).toHaveAttribute(
|
|
206
|
+
"data-header-html",
|
|
207
|
+
"Watching Telemundo™ with an antenna? You may need to rescan your TV."
|
|
208
|
+
);
|
|
209
|
+
}), s("should handle whitespace in brandName", () => {
|
|
210
|
+
o(/* @__PURE__ */ e(i, { brandName: " FOX " }));
|
|
211
|
+
const t = a.getAllByTestId("instructions-list");
|
|
212
|
+
n(t[0]).toHaveAttribute(
|
|
213
|
+
"data-header-html",
|
|
214
|
+
"Watching FOX with an antenna? You may need to rescan your TV."
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
});
|